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

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

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


Зміст


Умова задачі

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

Для функції Min() встановити метод тестування TestMin(). Перевірити роботу функції.

 


Виконання

1. Створити додаток за шаблоном Console Applicaiton

Запустити на виконання MS Visual Studio 2010. Щоб створити проект за шаблоном Console Application потрібно викликати послідовність команд

File -> New -> Project...

У результаті відкриється вікно New Project. У вікні вибрати шаблон Console Application як показано на рисунку 1. Шаблон вибирається у вкладці Visual C#.

MS Visual Studio Вікно "New Project" Вибір додатку Console Application

Рис. 1. Вікно “New Project”. Вибір додатку типу Console Application

 

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 2010 модуль "Program.cs"

Рис. 2. Вигляд вікна MS Visual Studio 2010, модуль “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;

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.

Visual C# Вікно проект тип Test Project

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

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

Visual Studio C# код модуль UnitTest1.cs

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

 

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

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

  • проект MinApp. Це проект, створений за шаблоном Console Application з функцією 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 2010, наступний:

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

namespace TestMinApp
{
    /// <summary>
    /// Summary description for UnitTest1
    /// </summary>
    [TestClass]
    public class UnitTest1
    {
        public UnitTest1()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        private TestContext testContextInstance;

        /// <summary>
        ///Gets or sets the test context which provides
        ///information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Additional test attributes
        //
        // You can use the following additional attributes as you write your tests:
        //
        // Use ClassInitialize to run code before running the first test in the class
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // Use ClassCleanup to run code after all tests in a class have run
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // Use TestInitialize to run code before running each test
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // Use TestCleanup to run code after each test has run
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [TestMethod]
        public void TestMethod1()
        {
            //
            // TODO: Add test logic here
            //
        }
    }
}

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

У класі можна вписувати будь-яку кількість методів, які будуть тестувати різні функції з різних модулів. Головне, щоб ці методи були помічені атрибутом [TestMethod].

 

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

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

Після виконаних змін, скорочений текст модуля файлу UnitTest1.cs буде мати вигляд:

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

namespace TestMinApp
{
    /// <summary>
    /// Summary description for UnitTest1
    /// </summary>
    [TestClass]
    public class UnitTest1
    {
        ...

        [TestMethod]
        public void TestMin()
        {
            //
            // TODO: Add test logic here
            //
        }
    }
}

 

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

Щоб доступитися до функції Min() (проект MinApp) з проекту TestMinApp, потрібно підключити простір імен в якому розміщується ця функція.

Для цього, перш за все потрібно викликати контекстне меню для проекту TestMinApp. Потім у контекстному меню потрібно викликати команду “Add Reference…” (рисунок 5).

Visual Studio C# Команда "Add Referencse..."

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

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

Visual Studio C# Вікно "Add Reference" Підключення проекту MinApp

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

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

Visual Studio C# Вкладка References проект MinApp

Рис. 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() потрібно ввести наступний код:

...

[TestMethod]
public void TestMin()
{
    //
    // TODO: Add test logic here
    //
    int min;
    min = Program.Min(3, 4, 5);
    Assert.AreEqual(2, min);
}

...

 

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

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

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

using MinApp;

namespace TestMinApp
{
    /// <summary>
    /// Summary description for UnitTest1
    /// </summary>
    [TestClass]
    public class UnitTest1
    {
        public UnitTest1()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        private TestContext testContextInstance;
        /// <summary>
        ///Gets or sets the test context which provides
        ///information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Additional test attributes
        //
        // You can use the following additional attributes as you write your tests:
        //
        // Use ClassInitialize to run code before running the first test in the class
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // Use ClassCleanup to run code after all tests in a class have run
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // Use TestInitialize to run code before running each test
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // Use TestCleanup to run code after each test has run
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [TestMethod]
        public void TestMin()
        {
            //
            // TODO: Add test logic here
            //
            int min;
            min = Program.Min(3, 4, 5);
            Assert.AreEqual(2, min);
        }
    }
}

 

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

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

Щоб запустити тест на виконання, потрібно вибрати одну з команд

Test -> Run -> Tests in Current Context

або

Test -> Run -> All Tests in Solution

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

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

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

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

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

...

[TestMethod]
public void TestMin()
{
    //
    // TODO: Add test logic here
    //
    int min;
    min = Program.Min(3, 4, 5);
    Assert.AreEqual(3, min);
}

...

Вікно результату зображене на рисунку 9.

Visual Studio C# Результат тестування

Рис. 9. Результат тестування для випадку, якщо ввести правильну відповідь

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

 

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

У  даній роботі у рішенні (Solution) сформовано два проекти. Один проект MinApp містить функцію Min(), яку потрібно протестувати. Другий проект TestMinApp містить методи, які тестують.

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

 


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