单元测试一些输入的各种foreach

时间:2010-06-30 14:34:13

标签: c# unit-testing foreach

特别是对于 C#单元测试,如何为各种输入或输入矩阵进行测试?

我经常遇到单元测试的情况,即输入矩阵,但通常可以通过检查输入列表来合理地解决。

最简单的情况是测试添加

  • 0 + 0 = 0
  • 1 + 0 = 1
  • 0 + -1 = -1
  • 1 + -1 = 0

将对每个输入进行相同的测试(在此示例中,有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]会为所有输入调用一次。

您的解决方案是什么?

是否有一些我不知道的功能有助于这些情况?

3 个答案:

答案 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