Приклад створення Unit-тесту в MS Visual Studio 2017 – C#

Приклад створення Unit-тесту в MS Visual Studio 2017 – C#

У даній темі описується покроковий процес створення найпростішого Unit-тесту в системі Microsoft Visual Studio 2017 (C#) для додатку типу Console App (.NET Framework). Використовуючи даний приклад, можна навчитись створювати власні Unit-тести. Приклад також демонструє використання класу Assert для проведення тестування роботи функцій.


Зміст


Умова задачі

Для додатку типу Console App (.NET Framework) розробити Unit-тест, що тестує роботу функції Min(), яка визначає максимальний елемент з трьох чисел.
Для функції Min() встановити метод тестування TestMin(). Перевірити роботу функції.

 


Виконання

1. Створити додаток за шаблоном Console App (.NET Framework)

Запустити на виконання MS Visual Studio 2017. Щоб створити проект за шаблоном Console App (.NET Framework) потрібно викликати послідовність команд

File -> New -> Project...

У результаті відкриється вікно New Project. У вікні вибрати шаблон Console App (.NET Framework) як показано на рисунку 1. Шаблон вибирається у вкладці

Visual C# -> Windows Desktop -> Console App (.NET Framework)

MS Visual Studio 2017 Вікно "New Project" додаток Console App

Рис. 1. Вікно “New Project”. Вибір додатку типу Console App (.NET Framework)

 

2. Підготовка тексту модуля Program.cs

2.1. Додати функцію Min() у текст модуля

У тіло класу Program потрібно додати текст функції Min().
Функція оголошується як загальнодоступна (public) та статична (static). Текст функції Min()

public static int Min(int a, int b, int c)
{
    int min = a;
    if (min > b) min = b;
    if (min > c) min = c;
    return min;
}

MS Visual Studio Programs.cs

Рис. 2. Вигляд вікна MS Visual Studio 2017, модуль “Program.cs”

 

2.2. Зробити клас Program загальнодоступним (public)

Для того, щоб доступитись до функції Min() класу Program потрібно зробити цей клас загальнодоступним. Для цього, перед оголошенням класу потрібно встановити ключове слово public.

...

namespace MinApp
{
    public class Program
    {
        // методи класу
        // ...
    }
}

...

Після цього, програма яку потрібно протестувати, готова до тестування.

 

3. Текст програми, яку потрібно протестувати

На даний момент текст програми, яку потрібно протестувати, має вигляд:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MinApp
{
    public class Program
    {
        public static int Min(int a, int b, int c)
        {
            int min = a;
            if (min > b) min = b;
            if (min > c) min = c;
            return min;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Demo of Unit-testing in C#");
        }
    }
}

Оскільки, ця програма буде тестуватись з іншого модуля тестування, то у функції Main() більше нічого вводити не потрібно. Тому що, згідно з умовою задачі, потрібно протестувати роботу функції Min(). А це вже буде здійснюватись з модуля тестування. На даний момент наша програма готова до тестування.

 

4. Створення тесту

Тест створюється окремим проектом (Project) у рішенні (Solution). Програма, яка буде тестуватись не знає про це. Програма-тест, яка буде тестувати викликає функції програми, що тестується. У нашому випадку програма-тест буде викликати функцію

int Min(int, int, int);


 

4.1. Додавання нового проекту до рішення

Для даного рішення (Solution) додається новий проект з допомогою команди

File->Add->New Project...

Вікно створення нового проекту зображене на рисунку 3.

MS Visual Studio створення проекту Test Project

Рис. 3. Вікно створення проекту типу Test Project

У вікні вибирається група шаблонів Visual C# -> Test. З відображених шаблонів вибирається шаблон проекту “Unit Test Project (.NET Framework)”. У полі “Name” вказується ім’я проекту, що буде тестувати нашу програму. Потрібно задати, наприклад, TestMinApp. Проект розміщується в окремій папці “E:\Test\MinApp”.

MS Visual Studio. утиліта Solution Explorer проекти

Рис. 4. Текст модуля UnitTest1.cs. Вікно утиліти Solution Explorer з відображеними проектами TestMinApp та MinApp

 

4.2. Структура рішення

Як видно з рисунку 4, утиліта Solution Explorer відображає структуру рішення (Solution Items), яке містить два проекти:

  • проект MinApp. Це проект, створений за шаблоном “Console App (.NET Framework)” з функцією Min(), яку потрібно протестувати;
  • проект TestMinApp. Цей проект призначений для тестування функцій проекту MinApp. Програмний код, що тестує функцію Min(), буде вноситись у файл проекту UnitTest1 проекту TestMinApp.

Обидва проекти можуть виконуватись незалежно один від одного.

 

4.3. Текст файлу “UnitTest1.cs”. Атрибути [TestMethod] та [TestClass]

У проекті TestMinApp головний інтерес представляє файл тесту UnitTest1.cs. У цьому файлі розміщуються методи, що будуть тестувати функції проекту MinApp. Проект TestMinApp може містити будь-яку кількість файлів, що містять тести (наприклад, UnitTest2.cs, UnitTest3.cs і т.д.).

Лістинг файлу UnitTest1.cs, сформований MS Visual Studio 2017, наступний:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestMinApp
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
}

Як видно з вищенаведеного коду, файл містить клас з іменем UnitTest1. У класі є загальнодоступний (public) метод з іменем TestMethod1(). Перед реалізацією методу TestMethod1() розміщується атрибут [TestMethod]. Це означає, що у тіло методу потрібно вписати код, що буде тестувати функції проекту MinApp.
У класі можна вписувати будь-яку кількість методів, які будуть тестувати різні функції з різних модулів. Головне, щоб ці методи були помічені атрибутом [TestMethod].

 

4.4. Виконання змін у тексті модуля UnitTest1.cs. Зміна назви методу, що буде тестувати

Допускається змінювати назви методів та додавати нові методи, які помічені атрибутом [TestMethod] у модулі UnitTest1.cs. Враховуючи це, у тексті модуля UnitTest1.cs потрібно метод TestMethod1() перейменувати на TestMin().
Після виконаних змін, скорочений текст модуля файлу UnitTest1.cs буде мати вигляд:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestMinApp
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMin()
        {
        }
    }
}

 

4.5. Підключення проекту MinApp до проекту TestMinApp

Щоб доступитися до функції Min() (проект MinApp) з проекту TestMinApp, потрібно підключити простір імен в якому розміщується ця функція.
Для цього, перш за все потрібно викликати контекстне меню для проекту TestMinApp. Потім у контекстному меню потрібно вибрати команду “Add” -> “Reference…” (рисунок 5).

MS Visual Studio 2017 команда "Add Referense..."

Рис. 5. Команда “Add Referense…”

У результаті відкриється вікно “Add Reference”, в якому потрібно:

  • активувати вкладку Projects;
  • у вкладці Projects вибрати проект MinApp.

MS Visual Studio Вікно "Add Reference" підключення проект

Рис. 6. Вікно “Add Reference”. Підключення проекту MinApp

Після виконаних дій функції проекту MinApp будуть доступні для використання у проекті TestMinApp.

MS Visual Studio 2017 вкладка References проект

Рис. 7. Вкладка References з підключеним проектом MinApp

 

4.6. Внесення змін у текст модуля UnitTest1.cs
4.6.1. Додавання простору імен MinApp в модулі UnitTest1.cs

Додати простір імен MinApp з допомогою директиви using:

using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

using MinApp;

namespace TestMinApp
{
    ...
}

 

4.6.2. Текст методу TestMin()

У тексті методу TestMin() потрібно ввести наступний код:

...

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMin()
    {
        int min;
        min = Program.Min(3, 4, 5);
        Assert.AreEqual(2, min);
    }
}

...

 

4.7. Текст модуля UnitTest1.cs

Текст усього модуля UnitTest1.cs має такий вигляд:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

using MinApp;

namespace TestMinApp
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMin()
        {
            int min;
            min = Program.Min(3, 4, 5);
            Assert.AreEqual(2, min);
        }
    }
}

 

5. Запуск тесту на виконання та перевірка результату тестування

У Microsoft Visual Studio 2017 для роботи з Unit-тестами реалізовано спеціальне меню команд, яке називається Test.
Щоб запустити тест на виконання, потрібно вибрати одну з команд

Test -> Run -> Selected Test

або

Test -> Run -> All Tests in Solution

як показано на рисунку 8.

MS Visual Studio 2017 команда запуску тестування

Рис. 8. Виклик команди запуску тестування та перегляд результату

Після запуску тесту, результат можна переглянути у лівій частині у вікні Test Explorer. Як видно, тест не здано. Це є логічно, тому що у функції Assert.AreEqual() ми порівнюємо числа 2 та 3, які є відмінні між собою. Тут навмисно введено число 2 замість число 3.

Якщо замість числа 2 ввести правильну відповідь – число 3 (мінімум між 3, 4, 5), то тест буде здано. У цьому випадку текст методу TestMin() буде наступним:

...

[TestMethod]
public void TestMin()
{
    int min;
    min = Program.Min(3, 4, 5);
    Assert.AreEqual(3, min);
}

...

Відповідно у вікні Test Explorer буде відображено позитивний результат тесту. Після цього можна зробити висновок про те, що функція Min() для даного випадку працює правильно.

 

6. Підсумок. Взаємодія між проектами

У даній роботі у рішенні (Solution) сформовано два проекти. Один проект MinApp містить функцію Min(), яку потрібно протестувати. Другий проект TestMinApp містить методи, які тестують.
У Microsoft Visual Studio кожен з проектів запускається з допомогою різних команд меню. Так, проект MinApp запускається стандартним способом з меню Run. А проект який тестує TestMinApp запускається зі спеціального меню Test.

 


Зв’язані теми