如何用MSTest进行RowTest?

我知道MSTest不支持RowTest和类似的testing。

MSTests用户做什么? 如果没有RowTest支持,生活怎么样?

我已经看到DataDriventestingfunction,但听起来像太多的开销,有没有第三方补丁或工具,让我在MSTestRowTest类似的testing?

 [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 } 

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

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

https://github.com/Thwaitesy/MSTestHacks

1)安装NuGet包。

2)从TestBaseinheritance你的testing类

 public class UnitTest1 : TestBase { } 

3)创build一个属性,字段或方法,返回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属性添加到您的testing方法,指向上面的IEnumerable名称。 这需要完全合格。

 [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 { 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); } } } 

我们在VS2012 Update1中增加了对DataRow的支持。 看到这个博客的简要介绍

编辑:要强调,此function目前仅限于Windows商店应用程序。

在我使用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。

与DaTest(自2008年以来未更新)类似,使用PostSharp的解决scheme在博客http://blog.drorhelper.com/2011/09/enabling-parameterized-tests-in-mstest.html

我已经通过生成具有不同数量的生成testing方法的testing类代码来解决此问题。 你只需要下载2个文件,并将其包含到你的项目中。
然后在您的testing代码中为所需行数子类inheritance一个类并实现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; } } 

更多细节:

https://github.com/dzhariy/mstest-rows

Interesting Posts