Как сделать RowTest с помощью MSTest?
Я знаю, что MSTest не поддерживает RowTest
и подобные тесты.
Что MSTests
пользователи делают? Как можно жить без RowTest
служба поддержки?
я видел DataDriven
проверить функции, но звучит как слишком много, есть ли сторонний патч или инструмент, который позволяет мне делать RowTest
аналогичные тесты в MSTest
?
6 ответов
[TestMethod]
Test1Row1
{
Test1(1,4,5);
}
[TestMethod]
Test1Row2
{
Test1(1,7,8);
}
private Test1(int i, int j, int k)
{
//all code and assertions in here
}
Я знаю, что это поздний ответ, но, надеюсь, он поможет другим.
Я искал повсюду элегантное решение и в итоге сам написал. Мы используем его в более чем 20 проектах с тысячами модульных тестов и сотнями тысяч итераций. Никогда не пропускал ни одного удара.
https://github.com/Thwaitesy/MSTestHacks
1) Установите пакет NuGet.
2) Унаследовать свой тестовый класс от TestBase
public class UnitTest1 : TestBase
{ }
3) Создайте свойство, поле или метод, который возвращает IEnumerable
public class UnitTest1 : TestBase
{
private IEnumerable<int> Stuff
{
get
{
//This could do anything, get a dynamic list from anywhere....
return new List<int> { 1, 2, 3 };
}
}
}
4) Добавьте атрибут MSTest DataSource к своему методу тестирования, указывая на имя IEnumerable, приведенное выше. Это должно быть полностью квалифицированным.
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
var number = this.TestContext.GetRuntimeDataSourceObject<int>();
Assert.IsNotNull(number);
}
Конечный результат: 3 итерации, как у обычного источника данных:)
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MSTestHacks;
namespace Namespace
{
public class UnitTest1 : TestBase
{
private IEnumerable<int> Stuff
{
get
{
//This could do anything, get a dynamic list from anywhere....
return new List<int> { 1, 2, 3 };
}
}
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
var number = this.TestContext.GetRuntimeDataSourceObject<int>();
Assert.IsNotNull(number);
}
}
}
Мы добавили поддержку DataRow в VS2012 Update1. Смотрите этот блог для краткого введения
Изменить: хочу подчеркнуть, что эта функция в настоящее время ограничена приложениями магазина Windows.
В моей команде, использующей среду MS Test, мы разработали методику, основанную только на анонимных типах для хранения массива тестовых данных и LINQ для циклического прохождения и тестирования каждой строки. Это не требует никаких дополнительных классов или структур, и имеет тенденцию быть довольно легким для чтения и понимания. Это также гораздо проще реализовать, чем тесты на основе данных с использованием внешних файлов или подключенной базы данных.
Например, допустим, у вас есть такой метод расширения:
public static class Extensions
{
/// <summary>
/// Get the Qtr with optional offset to add or subtract quarters
/// </summary>
public static int GetQuarterNumber(this DateTime parmDate, int offset = 0)
{
return (int)Math.Ceiling(parmDate.AddMonths(offset * 3).Month / 3m);
}
}
Вы можете использовать и массив анонимных типов в сочетании с LINQ для написания таких тестов:
[TestMethod]
public void MonthReturnsProperQuarterWithOffset()
{
// Arrange
var values = new[] {
new { inputDate = new DateTime(2013, 1, 1), offset = 1, expectedQuarter = 2},
new { inputDate = new DateTime(2013, 1, 1), offset = -1, expectedQuarter = 4},
new { inputDate = new DateTime(2013, 4, 1), offset = 1, expectedQuarter = 3},
new { inputDate = new DateTime(2013, 4, 1), offset = -1, expectedQuarter = 1},
new { inputDate = new DateTime(2013, 7, 1), offset = 1, expectedQuarter = 4},
new { inputDate = new DateTime(2013, 7, 1), offset = -1, expectedQuarter = 2},
new { inputDate = new DateTime(2013, 10, 1), offset = 1, expectedQuarter = 1},
new { inputDate = new DateTime(2013, 10, 1), offset = -1, expectedQuarter = 3}
// Could add as many rows as you want, or extract to a private method that
// builds the array of data
};
values.ToList().ForEach(val =>
{
// Act
int actualQuarter = val.inputDate.GetQuarterNumber(val.offset);
// Assert
Assert.AreEqual(val.expectedQuarter, actualQuarter,
"Failed for inputDate={0}, offset={1} and expectedQuarter={2}.", val.inputDate, val.offset, val.expectedQuarter);
});
}
}
При использовании этого метода полезно использовать форматированное сообщение, включающее входные данные в Assert, чтобы помочь вам определить, какая строка приводит к сбою теста.
Я написал блог об этом решении с более подробной информацией и подробностями на AgileCoder.net.
Подобно DaTest(не обновлялось с 2008 года) решение с использованием PostSharp описано в блоге http://blog.drorhelper.com/2011/09/enabling-parameterized-tests-in-mstest.html
Я решил эту проблему, сгенерировав код тестового класса с разным количеством сгенерированных тестовых методов. Вам просто нужно скачать 2 файла и включить их в свой проект.
Затем создайте подкласс класса с необходимым количеством строк в тестовом коде и реализуйте 2 абстрактных метода:
[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;
}
}
Больше деталей: