C #. Прыклад стварэння Unit-тэсту ў MS Visual Studio
- змест
- выкананне
- 2. Падрыхтоўка тэксту модуля Program.cs
- 2.2. Зрабіць клас Program агульнадаступным (public)
- 3. Лістынг тэстоўванай праграмы
- 4. Стварэнне тэсту
- 4.1. Дадаць новую праекта да вырашэння
- 4.2. структура рашэння
- 4.3. Тэкст файла «UnitTest1.cs». Атрыбуты [TestMethod] і [TestClass]
- 4.4. Выкананне змяненняў у тэксце модуля UnitTest1. Змена назвы тэстуе метаду
- 4.5. Падключэнне праекта MinApp да праекту TestMinApp
- 4.6. Ўнясенне змяненняў у тэкст модуля UnitTest1.cs
- 4.6.2. Тэкст метаду TestMin ()
- 4.7. Тэкст модуля UnitTest1.cs
- 5. Запуск тэсту на выкананне і праверка выніку тэсціравання
- 6. Вынік. Ўзаемадзеянне паміж праектамі
У дадзенай тэме апісваецца пакрокавы працэс стварэння найпростага 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 #.
Visual C # -> 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; }
Мал. 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.
Мал. 3. Акно стварэння праекта тыпу Test Project
У акне выбіраецца група шаблонаў Visual C # -> Test. З адлюстраваных шаблонаў выбіраецца шаблон праекта «Test Project». У полі «Name» паказваецца імя праекта, які будзе тэставаць нашу праграму. Трэба задаць, напрыклад, TestMinApp. Праект размяшчаецца ў асобнай тэчцы «E: \ Test \ MinApp».
Мал. 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).
Мал. 5. Каманда «Add Referencse ...»
У выніку адкрыецца акно «Add Reference», у якім трэба выбраць праект MinApp.
Мал. 6. Акно «Add Reference». Падключэнне праекта MinApp
Пасля выкананых дзеянняў функцыі праекта MinApp будуць даступныя для выкарыстання ў праекце TestMinApp.
Мал. 7. Ўкладка References з падлучаным праектам MinApp
4.6. Ўнясенне змяненняў у тэкст модуля UnitTest1.cs
4.6.1. Даданне прасторы імёнаў MinApp ў модуль UnitTest1.cs
На гэтым етапе ў модуль 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.
Мал. 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.
Мал. 9. Вынік тэставання для выпадку, калі ўвесці правільны адказ
Зараз можна зрабіць выснову аб тым, што функцыя Min () для дадзенага выпадку працуе правільна.
6. Вынік. Ўзаемадзеянне паміж праектамі
У дадзенай працы ў вырашэнні (Solution) сфармаваныя два праекты. Адзін праект MinApp ўтрымлівае функцыю Min (), якую трэба пратэставаць. Другі праект TestMinApp ўтрымлівае тэстуе метады.
У Microsoft Visual Studio 2010 кожны з праектаў запускаецца з дапамогай розных каманд меню. Так, праект MinApp запускаецца стандартным спосабам з меню Run. А праект TestMinApp запускаецца з адмысловага меню Test.