Параметризованные Тесты в MSTest v2
Зачастую нам нужно использовать несколько разных тестовых данных, чтобы полностью протестировать метод. Один из способов - скопировать и вставить метод и изменить значение параметров.
[TestClass]В NUnit или xUnit проблема решается добавлением атрибутов
public class MathTests
{
[TestMethod]
public void Test_Add1()
{
Assert.AreEqual(2, Add(1, 1));
}
[TestMethod]
public void Test_Add2()
{
Assert.AreEqual(25, Add(21, 4));
}
}
TestCase и InlineData соответственно. Однако, я лишь недавно для себя открыл, что это можно сделать и в стандартном MSTest.DataRow
Атрибут
[DataRow] позволяет задать значения параметра теста. Также необходимо заменить [TestMethod] на [DataTestMethod]:[DataTestMethod]В обозревателе тестов вы увидите 2 выполненных теста. Также доступно ключевое слово params:
[DataRow(1, 1, 2)]
[DataRow(12, 30, 42)]
public void Test_Add(int a, int b, int expected)
{
Assert.AreEqual(expected, Add(a, b));
}
[DataTestMethod]DynamicData
[DataRow(1, new[] { "a", "b" })]
[DataRow(1, "a", "b")]
public void Test_Add(int a, params string[] b) {…}
Если данные не могут быть установлены в параметре атрибута (непостоянные значения или сложные объекты), можно использовать атрибут
[DynamicData], позволяющий получать значения параметров из метода (DynamicDataSourceType.Method) или свойства (DynamicDataSourceType.Property), возвращающих IEnumerable<object[]>:[DataTestMethod]Свой источник данных
[DynamicData(nameof(GetData), DynamicDataSourceType.Method)]
public void Test_Add_Method(int a, int b, int expected)
{
Assert.AreEqual(expected, Add(a, b));
}
public static IEnumerable<object[]> GetData()
{
yield return new object[] { 1, 1, 2 };
yield return new object[] { 12, 30, 42 };
}
Вы можете создать свой атрибут, реализовав ITestDataSource. Интерфейс имеет 2 метода:
-
GetData возвращает массивы данных,-
GetDisplayName возвращает имя теста, которое отображается в обозревателе тестов или в консоли.public class CustomDataSourceAttribute :Затем его можно использовать как атрибут теста:
Attribute, ITestDataSource
{
public IEnumerable<object[]> GetData(MethodInfo info)
{
yield return new object[] { 1, 1, 2 };
yield return new object[] { 12, 30, 42 };
}
public string GetDisplayName(MethodInfo info, object[] data)
{
if (data is null)
return null;
return $"Test {info.Name}({string.Join(",", data)})";
}
}
[DataTestMethod]Источник: https://www.meziantou.net/mstest-v2-data-tests.htm
[CustomDataSource]
public void Test_Add(int a, int b, int expected)
{
Assert.AreEqual(expected, Add(a, b));
}