MSTest Эквивалент для NUnit параметризованных тестов?
NUnit поддерживает функцию, в которой вы можете указать несколько входов данных для unit test для запуска несколько раз.
[RowTest]
[Row(1001,1,2,3)]
[Row(1,1001,2,3)]
[Row(1,2,1001,3)]
public void SumTests(int x, int y, int z, int expected)
{
...
}
Какой лучший способ выполнить тот же самый тип, используя MSTest? Я не могу найти аналогичный набор атрибутов.
Ответы
Ответ 1
Была ли эта помощь?
На этой неделе я добавлял некоторые модульные тесты к проекту, который управляется TFS, поэтому я решил использовать "ядро" для тестирования VS2008, и, к сожалению, он не поддержка RowTests. Но у него есть аналогичные функция называется Data-Driven Unit Test. При таком подходе это немного больше усложняют реализацию "простых" RowTest, но он позволяет также для реализации более сложных.
Ответ 2
Для тех, кто использует MSTest2, DataRow + DataTestMethod доступны именно для этого:
[DataRow(Enum.Item1, "Name1", 123)]
[DataRow(Enum.Item2, "Name2", 123)]
[DataRow(Enum.Item3, "Name3", 456)]
[DataTestMethod]
public void FooTest(EnumType item, string name, string number)
{
var response = ExecuteYourCode(item, name, number);
Assert.AreEqual(item, response.item);
}
Подробнее об этом здесь
Ответ 3
У вас может быть эта возможность, написав небольшое расширение mstest, как показано здесь.
http://blogs.msdn.com/b/vstsqualitytools/archive/2009/09/04/extending-the-visual-studio-unit-test-type-part-2.aspx
Ответ 4
Собственно, параметризованный Unit Test (PUT) является естественным обобщением unit test. И Microsoft Research имеет проект Pex, который автоматически сгенерирует PUT для вашего теста класса (CUT). Pex - это инструмент генерации автоматического теста. Вместо того, чтобы сами подготовить тестовые данные, инструмент Pex найдет интересующие входы для параметров CUT и соответственно сгенерирует случаи Unit Test. Пожалуйста, проверьте здесь.
Ответ 5
Мой ответ аналогичен @oscar-e-fraxedas-tormo one.
Вы можете подклассы из одного из сгенерированных классов, которые содержат от 1 до 100 методов тестирования внутри и обеспечивают всю тестовую логику в производном классе.
В следующем примере:
[TestClass]
public class Ha_ha_ha_Test: MsTestRows.Rows.TestRows_42<string>
{
public override void TestMethod(string dataRow, int rowNumber)
{
Console.WriteLine(dataRow);
Assert.IsFalse(dataRow.Contains("3"));
}
public override string GetNextDataRow(int rowNumber)
{
return "data" + rowNumber;
}
}
Класс Ha_ha_ha_Test
будет содержать 42
сгенерированные строки (методы). Для каждой из этих строк будет вызываться пользовательский метод GetNextDataRow
для предоставления требуемых тестовых данных.
Подробнее:
https://github.com/dzhariy/mstest-rows
Ответ 6
Вы можете создать базовый класс с помощью метода тестирования и параметров как виртуальных свойств.
Когда вы наследуете этот класс, вам нужно переопределить свойства с требуемыми значениями.
См. Пример кода:
public class Operation
{
public static int Add(int x, int y)
{
return x + y;
}
}
[TestClass]
public class AddTests : WorkItemTest
{
protected virtual int First{get { return 0; }}
protected virtual int Second{get { return 0; }}
[TestInitialize]
public virtual void Init()
{
//Init code
}
[TestCleanup]
public virtual void Clean()
{
//Clean code
}
[TestMethod]
[Description("x+y = y+x")]
public virtual void Test_operation_commutativity()
{
Assert.AreEqual(Operation.Add(Second, First), Operation.Add(First, Second));
}
}
[TestClass]
public class AddPositiveTest : AddTests
{
protected override int First { get { return 1; } }
protected override int Second { get { return 2; } }
}
[TestClass]
public class AddNegativeTest : AddTests
{
protected override int First { get { return -1; } }
protected override int Second { get { return -2; } }
}