2010-06-30 87 views
1

尤其是对于C#单元测试,如何进行测试运行各种输入或输入矩阵?单元测试各种各样foreach的一些输入

我经常会遇到单元测试会产生输入矩阵的情况,但通常可以通过检查输入列表来合理解决这个问题。

最简单的情况下,测试加成

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

对每个输入都会进行相同的测试(在这个例子中有4个输入,每个输入都与某些经验相关输出。

简单的解决方案是:

object[] inputs = ... 
foreach (var input in inputs) 
    // Put Assert here 

但问题是,当你运行你的测试不会告诉为其输入失败,除非你在邮件日志足够的细节手动

另一种解决方案是展开循环(如下所示)。堆栈跟踪然后给出哪个输入失败,并且这允许再次对单个输入运行测试。

TestAddition(0, 0, 0); 
TestAddition(1, 0, 1); 
TestAddition(0, -1, -1); 
TestAddition(1, -1, 0); 

最后但并非最不重要的,就像FitNess解决方案,这似乎有助于这种情况下,还增添了不少复杂的,似乎没有适应好了标准C#开发。

所有这些解决方案都不适用于灯具,因为所有输入都会调用[TestInitialize]一次。

你的解决方案是什么?

是否有一些功能我不知道可以帮助这些情况?

回答

2

它的可能性。您缺少的术语是“数据驱动测试” /参数化测试。试用一个搜索引擎,你应该为你的特定测试框架找到不少答案。

大多数xUnit测试框架都具有启用此功能的机制。正如Martin发布的,NUnit使用RowTest/TestCase属性将参数传递给测试。

+0

看看这是否有帮助 - 标签:'无耻的博客插件':) http://madcoderspeak.blogspot.com/2009/01/nunit-rowtest-extension-running-same.html – Gishu 2010-06-30 14:45:31

+0

感谢那些keyworks。有了它,我发现http://www.c-sharpcorner.com/UploadFile/sanks/1770/Default.aspx这似乎接近我正在寻找(看起来有点复杂)。搜索... – Wernight 2010-06-30 14:57:12

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); 
} 
+0

其实我正在使用Visual Studio单元测试框架(内置单元测试)。从来没有任何问题或理由改变到目前为止。 – Wernight 2010-06-30 14:49:09

+0

http://codeclimber.net.nz/archive/2008/01/18/How-to-simulate-RowTest-with-MS-Test.aspx here found http://stackoverflow.com/questions/347535/how- to-rowtest-with-mstest提示了一种方法。虽然对我来说似乎有点沉重。 – 2010-06-30 15:00:02

1

看一看Pex。在决定值得下载之前,您可以try it online

+0

我认为这对OP的要求来说有些过于先进; Pex如果我没有弄错是'扫描并生成单元测试'工具 – Gishu 2010-06-30 14:43:08

+0

它更先进。使用Pex,操作员甚至不必为他的测试用例写入数据。 – 2010-06-30 14:58:47