我知道这是另一个晚回答,但在我的团队中,我们采用MS Test框架并开发了一种技术,它仅依赖于匿名类型来保存测试数据的数组,并使用LINQ循环遍历并测试每一行。它不需要额外的类或框架,并且往往比使用外部文件或连接数据库的数据驱动测试要更易于阅读和理解。实现起来也比数据驱动测试容易得多。
例如,假设你有一个像这样的扩展方法:
public static class Extensions
{
public static int GetQuarterNumber(this DateTime parmDate, int offset = 0)
{
return (int)Math.Ceiling(parmDate.AddMonths(offset * 3).Month / 3m);
}
}
你可以使用匿名类型的数组和LINQ来编写类似这样的测试代码:
你可以使用匿名类型的数组和LINQ来编写这样的测试代码:
[TestMethod]
public void MonthReturnsProperQuarterWithOffset()
{
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}
};
values.ToList().ForEach(val =>
{
int actualQuarter = val.inputDate.GetQuarterNumber(val.offset);
Assert.AreEqual(val.expectedQuarter, actualQuarter,
"Failed for inputDate={0}, offset={1} and expectedQuarter={2}.", val.inputDate, val.offset, val.expectedQuarter);
});
}
}
使用此技术时,建议使用格式化的消息,在Assert中包含输入数据,以帮助您确定哪一行导致测试失败。
我已经在AgileCoder.net上发布了更多背景和详细信息的博客文章。
DataRow()
,请参见:https://blogs.msdn.microsoft.com/devops/2016/06/17/taking-the-mstest-framework-forward-with-mstest-v2/ - Babak