MSTest是否与NUnit的TestCase相当?

我发现NUnit中的TestCase特性作为快速指定testing参数非常有用,而不需要每个testing都有一个单独的方法。 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); } } 

我知道这是一个迟到的答案,但希望它可以帮助别人。

我到处寻找一个优雅的解决scheme,并最终自己写一个。 我们在超过20个项目中使用它,有数千个unit testing和数十万次迭代。 从来没有错过一个节拍。

https://github.com/Thwaitesy/MSTestHacks

1)安装NuGet包。

2)从TestBaseinheritance你的testing类

 public class UnitTest1 : TestBase { } 

3)创build一个属性,字段或方法,返回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属性添加到您的testing方法,指向上面的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); } } } 

如果不需要坚持使用MSTest,而只是使用它来通过testing浏览器运行testing 因为你只有一个Visual Studio Express版本 ,那么这可能是你的解决scheme:

有VsTestAdapter VSIX扩展能够通过testing浏览器运行NUnittesting。 不幸的是,VS Express用户不能安装扩展…但幸运的是, VsTestAdapter也带有一个普通的NuGet-Package !

因此,如果您是VS Express用户,只需安装VsTestAdapter NuGet-Package,并通过testing浏览器运行您的NUnittesting/testing用例即可!


不幸的是,上述说法并不正确。 虽然完全可以通过Express版本来安装软件包,但这是无用的,因为它无法使用testing浏览器。 先前在旧版本的TestAdapter上有一个附注,它从2.0.0的描述页面中删除:

请注意,它不适用于VS Express


更新:

微软最近宣布“MSTest V2” (见博客文章 )。 这使您可以一致地(桌面,UWP,…)使用DataRow

  [TestClass] public class StringFormatUtilsTest { [TestMethod] [DataRow("tttt", "")] [DataRow("", "")] [DataRow("t3a4b5", "345")] [DataRow("3&amp;amp;5*", "35")] [DataRow("123", "123")] public void StripNonNumeric(string before, string expected) { string actual = FormatUtils.StripNonNumeric(before); Assert.AreEqual(expected, actual); } } 

再次,Visual Studio Express的testing资源pipe理器不幸的是不能识别这些testing。 但至less“完整”VS版本现在支持该function!

要使用它,只需安装NuGet包MSTest.TestFramework和MSTest.TestAdapter (两个预发布到现在为止 )。

我知道这是另一个迟到的答案,但是在我的团队中被locking使用MS Test框架,我们开发了一种只依赖匿名types来保存testing数据的数组,并且LINQ循环并testing每一行。 它不需要额外的类或框架,并且往往相当容易阅读和理解。 与使用外部文件或连接数据库的数据驱动testing相比,实现起来也更容易。

例如,假设你有这样的扩展方法:

 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组合的匿名types数组来写这样的testing:

 [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中的input数据的格式化消息有助于识别哪一行导致testing失败。

我已经在AgileCoder.net上以更多背景和细节的方式介绍了这个解决scheme。

MSTest具有DataSource属性,它将允许您为其提供一个数据库表,csv,xml等。我已经使用它,它运行良好。 我不知道如何把上面的数据作为你的问题的属性,但是设置外部数据源非常简单,文件可以包含在项目中。 我从一开始就运行了一个小时,而且我不是一个自动化testing专家。

https://msdn.microsoft.com/en-us/library/ms182527.aspx?f=255&MSPPError=-2147217396有一个基于数据库input的完整教程。;

http://www.rhyous.com/2015/05/11/row-tests-or-paramerterized-tests-mstest-xml/有一个基于XML文件input的教程。;