Имеет ли MSTest эквивалент NUnit TestCase?
Я нахожу, что функция TestCase
в NUnit весьма полезна как быстрый способ указать параметры теста, не требуя отдельного метода для каждого теста. Есть ли что-то подобное в MSTest?
[TestFixture]
public class StringFormatUtilsTest
{
[TestCase("tttt", "")]
[TestCase("", "")]
[TestCase("t3a4b5", "345")]
[TestCase("3&5*", "35")]
[TestCase("123", "123")]
public void StripNonNumeric(string before, string expected)
{
string actual = FormatUtils.StripNonNumeric(before);
Assert.AreEqual(expected, actual);
}
}
Ответы
Ответ 1
Microsoft недавно анонсировала "MSTest V2" (см. Блог-статью). Это позволяет вам последовательно (рабочий стол, UWP,...) использовать DataRow
-attribute!
[TestClass]
public class StringFormatUtilsTest
{
[DataTestMethod]
[DataRow("tttt", "")]
[DataRow("", "")]
[DataRow("t3a4b5", "345")]
[DataRow("3&5*", "35")]
[DataRow("123", "123")]
public void StripNonNumeric(string before, string expected)
{
string actual = FormatUtils.StripNonNumeric(before);
Assert.AreEqual(expected, actual);
}
}
Опять же, тестовый тест Visual Studio Express, к сожалению, не распознает эти тесты. Но, по крайней мере, "полные" версии VS теперь поддерживают эту функцию!
Чтобы использовать его, просто установите пакеты NuGet MSTest.TestFramework и MSTest.TestAdapter (оба предварительных выпуска на данный момент).
Старый ответ:
Если вам не нужно придерживаться MSTest, и вы просто используете его для возможности запуска тестов через Test Explorer потому что у вас есть только выпуск Visual Studio Express , тогда это может быть решением для вас:
Есть расширение VsTestAdapter VSIX для возможности запуска тестов NUnit через Test Explorer. К сожалению, пользователи VS Express не могут устанавливать расширения... Но, к счастью, VsTestAdapter поставляется с простым NuGet-пакетом !
Итак, если вы являетесь пользователем VS Express, просто установите пакет NuGet VsTestAdapter и наслаждайтесь выполнением ваших тестов/тестовых случаев NUnit через Test Explorer!
К сожалению, вышеупомянутое утверждение не соответствует действительности. В то время как вполне возможно установить пакет через Express Edition, это бесполезно, так как он не может использовать Test Explorer. Ранее было замечание о старой версии TestAdapter, которая была удалена со страницы описания 2.0.0:
Обратите внимание, что это не работает с VS Express
Ответ 2
Я знаю, что это поздний ответ, но, надеюсь, он помогает другим.
Я везде искал элегантное решение и в итоге сам написал его. Мы используем его в более чем 20 проектах с тысячами модульных тестов и сотнями тысяч итераций. Никогда не промахнулся.
https://github.com/Thwaitesy/MSTestHacks
1) Установите пакет NuGet.
2) Наследовать свой тестовый класс из TestBase
public class UnitTest1 : TestBase
{ }
3) Создайте свойство, поле или метод, который возвращает IEnumerable
[TestClass]
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. Это необходимо для полной квалификации.
[TestMethod]
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
var number = this.TestContext.GetRuntimeDataSourceObject<int>();
Assert.IsNotNull(number);
}
Результат завершения: 3 итерации, как и обычный DataSource:)
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MSTestHacks;
namespace Namespace
{
[TestClass]
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 };
}
}
[TestMethod]
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
var number = this.TestContext.GetRuntimeDataSourceObject<int>();
Assert.IsNotNull(number);
}
}
}
Ответ 3
Я знаю, что это еще один поздний ответ, но в моей команде, которая заблокирована с использованием рамочной программы 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.
Ответ 4
Khlr дал хорошие подробные объяснения, и, очевидно, этот подход начал работать в VS2015 Express для настольных компьютеров. Я пытался оставить комментарий, но отсутствие репутации не позволило мне сделать это.
Позвольте мне скопировать решение здесь:
[TestClass]
public class StringFormatUtilsTest
{
[TestMethod]
[DataRow("tttt", "")]
[DataRow("", "")]
[DataRow("t3a4b5", "345")]
[DataRow("3&amp;5*", "35")]
[DataRow("123", "123")]
public void StripNonNumeric(string before, string expected)
{
string actual = FormatUtils.StripNonNumeric(before);
Assert.AreEqual(expected, actual);
}
}
Чтобы использовать его, просто установите пакеты NuGet MSTest.TestFramework и MSTest.TestAdapter.
Одна проблема
Ошибка CS0433 Тип "TestClassAttribute" существует как в "Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version = 10.0.0.0, так и в" Microsoft.VisualStudio.TestPlatform.TestFramework, Version = 14.0.0.0 ".
Поэтому, пожалуйста, удалите Microsoft.VisualStudio.QualityTools.UnitTestFramework из ссылок проекта.
Вы можете редактировать исходный ответ и удалить этот.
Ответ 5
MSTest имеет атрибут DataSource, который позволит вам подавать ему таблицу базы данных, csv, xml и т.д. Я использовал ее, и она работает хорошо. Я не знаю, как правильно разместить данные как атрибуты, как в вашем вопросе, но очень легко настроить внешние источники данных и файлы, которые могут быть включены в проект. У меня было это с часом с того момента, когда я начал, и я не специалист по автоматическому тестированию.
https://msdn.microsoft.com/en-us/library/ms182527.aspx?f=255&MSPPError=-2147217396 содержит полный учебник на основе ввода базы данных.
http://www.rhyous.com/2015/05/11/row-tests-or-paramerterized-tests-mstest-xml/ содержит учебник, основанный на вводе XML файла.