【问题标题】:Unit testing various foreach of some inputs对某些输入的各种 foreach 进行单元测试
【发布时间】:2010-06-30 14:34:13
【问题描述】:

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

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

最简单的情况是测试加法

  • 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]

你的解决方案是什么?

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

【问题讨论】:

    标签: c# unit-testing foreach


    【解决方案1】:

    如果您使用的是 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 );
    }
    

    【讨论】:

    【解决方案2】:

    这是可能的。您缺少的术语是 “数据驱动测试” / 参数化测试。尝试使用搜索引擎,您应该会为您的特定测试框架找到相当多的答案。

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我认为这对于 OP 的要求来说有点太高级了;如果我没记错的话,Pex 是一个“扫描并生成单元测试”工具
    • 更高级。使用 Pex,操作员甚至不必为他的测试用例编写数据。
    猜你喜欢
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多