代码之家  ›  专栏  ›  技术社区  ›  Wernight

对某些输入的各种前兆进行单元测试

  •  1
  • Wernight  · 技术社区  · 14 年前

    尤其是 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] 对所有输入调用一次。

    你的解决方案是什么?

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

    3 回复  |  直到 14 年前
        1
  •  2
  •   Gishu    14 年前

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

    大多数XUnit测试框架都有实现这一点的机制。正如Martin所发布的,nunit使用rowtest/testcase属性将参数传递给测试。

        2
  •  5
  •   Martin Clarke    14 年前

    如果你用的是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 );
    }
    
        3
  •  1
  •   Stephen Cleary    14 年前

    看一看 Pex . 你可以 try it online 在决定是否值得下载之前。