Използвам xUnit от доста време и това е избраната от мен рамка за тестване на модули. Това е инструмент за тестване на модули с отворен код за .Net framework, който е съвместим с ReSharper, CodeRush, TestDriven.Net и Xamarin. Можете да се възползвате от xUnit.Net, за да утвърдите лесно тип изключение. Също така, можете да разширите атрибутите Fact или Theory в xUnit.Net и той предоставя отлична поддръжка за писане на параметризирани модулни тестове. Ето връзката към хранилището на Github за xUnit.Net.
Ето как да работите с xUnit.net в Visual Studio. За тази демонстрация ще използваме Visual Studio 2015, въпреки че можете да работите и с други съвместими версии на Visual Studio. Сега следвайте тези прости стъпки, за да настроите средата си за работа с xUnit.Net във Visual Studio.
- Отворете Visual Studio 2015 UDE
- Създайте нов проект от типа „Библиотека на класовете“
- Запазете проекта с име
- След това инсталирайте xUnit.Net чрез NuGet Package Manager
И това е! За да стартирате модулните тестове в Visual Studio IDE, можете да използвате xUnit.net runner за Visual Studio. Ето какво трябва да посочите, за да инсталирате пакета xUnit.net [Runner: Visual Studio], като използвате прозореца на конзолата на Package Manager:
Install-Package xunit.runner.visualstudio -Version 2.1.0
Това е всичко, от което се нуждаете, за да настроите средата си, така че да можете да изпълнявате модулните тестове xUnit.Net от Visual Studio IDE.
Факти и теории
Противно на популярния атрибут [Test], с който може би сте запознати, ще трябва да използвате атрибута [Fact], за да напишете методите за единични тестове с помощта на xUnit.net. Имайте предвид, че xUnit.net поддържа два вида единични тестове: факти и теории.
Докато фактите се използват за тестване на инвариантни условия, теориите са тестове, които са верни за определен набор от данни, предадени като аргумент на метода. Обикновено бихте използвали атрибута [Fact], за да напишете модулни тестове, които нямат аргументи на метода.
Атрибутът [Theory] обаче се нуждае от един или повече екземпляра DataAttribute, които да бъдат предадени като аргументи на метода. По същество бихте искали да използвате атрибут [Theory] за писане на модулни тестове, управлявани от данни. Единичните тестове, управлявани от данни, са тези, които се изпълняват върху различни набори от данни.
Ако приемем, че xUnit.Net и неговият бегач за Visual Studio са инсталирани, нека първо напишем прост единичен тест, използвайки атрибута [Fact]. Обмислете следния метод за единичен тест - тук ще се възползваме от атрибута [Fact].
[Fact]
public void CheckEqualityTest()
{
Assert.Equal(10, Sum(5, 5));
}
Методът Sum приема две цели числа и връща сумата от тях.
private int Sum(int x, int y)
{
return x + y;
}
Когато стартирате този тест, модулният тест преминава - можете да видите това в Test Explorer Windows във вашата Visual Studio IDE. Нека сега проучим как можем да работим с теории за изпълнение на модулни тестове, които се управляват от данни.
Следният кодов фрагмент илюстрира как можете да работите с модулни тестове, управлявани от данни, използвайки xUnit.Net.
[Theory, InlineData("This is a data driven test", "data")]
public void CheckInputTest(string input, string substring)
{
Assert.Equal(true, input.Contains(substring));
}
Обърнете се към кодовия фрагмент, даден по-горе. Обърнете внимание на използването на атрибута [Теория]. Освен ако вашите модулни тестове не се управляват от данни, трябва да изберете атрибута [Fact] във вашите методи за единично тестване. Обърнете внимание как са предадени параметри в метода за тестване на единица данни, наречен CheckInput. Атрибутът InlineData предоставя данните за изходния код. В този пример данните се предават на метода за единично тестване чрез вградени стойности. Можете да имате и множество атрибути InlineData - просто трябва да ги разделите с помощта на запетая. Ето как можете да постигнете това.
[Theory, InlineData("This is a data driven test", "data"),
InlineData("This is another set of data for the data driven test", "data")]
public void CheckInputTest(string input, string substring)
{
Assert.Equal(true, input.Contains(substring));
}
Когато изпълните горния тест, управляван от данни, методът CheckInputTest ще бъде изпълнен два пъти - веднъж за всеки набор от входни данни.