TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #1307 1.46K
День 1062. #ЗаметкиНаПолях
Параметризованные Тесты в MSTest v2
Зачастую нам нужно использовать несколько разных тестовых данных, чтобы полностью протестировать метод. Один из способов - скопировать и вставить метод и изменить значение параметров.
[TestClass]
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));
}
}

В NUnit или xUnit проблема решается добавлением атрибутов TestCase и InlineData соответственно. Однако, я лишь недавно для себя открыл, что это можно сделать и в стандартном MSTest.

DataRow
Атрибут [DataRow] позволяет задать значения параметра теста. Также необходимо заменить [TestMethod] на [DataTestMethod]:
[DataTestMethod]
[DataRow(1, 1, 2)]
[DataRow(12, 30, 42)]
public void Test_Add(int a, int b, int expected)
{
Assert.AreEqual(expected, Add(a, b));
}

В обозревателе тестов вы увидите 2 выполненных теста. Также доступно ключевое слово params:
[DataTestMethod]
[DataRow(1, new[] { "a", "b" })]
[DataRow(1, "a", "b")]
public void Test_Add(int a, params string[] b) {…}

DynamicData
Если данные не могут быть установлены в параметре атрибута (непостоянные значения или сложные объекты), можно использовать атрибут [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]
[CustomDataSource]
public void Test_Add(int a, int b, int expected)
{
Assert.AreEqual(expected, Add(a, b));
}

Источник: https://www.meziantou.net/mstest-v2-data-tests.htm
More from @netdeveloperdiary
  1. Oct 15, 2026Post #3374
  2. Oct 14, 2026Post #3373
  3. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  4. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  5. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  6. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →