如何用MSTest进行RowTest?
我知道MSTest不支持RowTest
和类似的testing。
MSTests
用户做什么? 如果没有RowTest
支持,生活怎么样?
我已经看到DataDriven
testingfunction,但听起来像太多的开销,有没有第三方补丁或工具,让我在MSTest
做RowTest
类似的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; } }
更多细节: