特别是对于 C#单元测试,如何为各种输入或输入矩阵进行测试?
我经常遇到单元测试的情况,即输入矩阵,但通常可以通过检查输入列表来合理地解决。
最简单的情况是测试添加:
将对每个输入进行相同的测试(在此示例中,有4个输入,每个输入与某些预期输出相关联。
简单解决方案是:
object[] inputs = ...
foreach (var input in inputs)
// Put Assert here
问题在于,当您运行测试时,除非您在消息日志中手动中包含足够的详细信息,否则无法确定哪个输入失败。< / p>
另一个解决方案是展开循环(如下所示)。堆栈跟踪然后给出哪个输入失败,这允许再次运行单个输入的测试。
TestAddition(0, 0, 0);
TestAddition(1, 0, 1);
TestAddition(0, -1, -1);
TestAddition(1, -1, 0);
最后但并非最不重要的是,像FitNess这样的解决方案似乎有助于此类案例,但也增加了很多复杂性,似乎不适合标准C#开发。
所有这些解决方案都无法正常使用灯具,因为[TestInitialize]
会为所有输入调用一次。
您的解决方案是什么?
是否有一些我不知道的功能有助于这些情况?
答案 0 :(得分:5)
如果您使用的是NUnit,则应该查看TestCase属性。
[TestCase(0,0,0)]
[TestCase(1,0,1)]
[TestCase(0,-1,-1)]
[TestCase(1,-1, 0)]
public void AdditionTest(int x, int y, int z)
{
Assert.AreEqual( z, x+y );
}
答案 1 :(得分:2)
它可能。您缺少的术语是“数据驱动测试” /参数化测试。尝试使用搜索引擎,您应该为您的特定测试框架找到相当多的答案。
大多数xUnit测试框架都有启用此功能的机制。正如Martin发布的那样,NUnit使用RowTest / TestCase属性将参数传递给测试。
答案 2 :(得分:1)
看看Pex。在决定值得下载之前,您可以try it online。