【问题标题】:Is there a common way to test complex functions with NUnit?有没有用 NUnit 测试复杂函数的常用方法?
【发布时间】:2011-02-23 14:08:49
【问题描述】:

有没有用 NUnit 测试带有多个参数的复杂函数的通用方法?我认为测试所有条件非常困难或不可能。

恐怕函数中没有预期的参数组合在测试中也没有预期。

所以预期的条件不会失败,而是意外。

谢谢

【问题讨论】:

    标签: c# .net vb.net nunit


    【解决方案1】:

    这应该不难测试。如果是,则该方法不是为可测试性而设计的,这是一种代码异味,告诉您需要对其进行重构。

    我倾向于在这些情况下编写测试如下(其他人可能有更好的建议):

    1. 在传递所有适当的参数后,它是否按预期工作?
    2. 当我认为它应该抛出预期的异常时,它会抛出预期的异常吗? (ArgumentNullException 等)
    3. 对于每个参数,当我传递 null、最小值和最大值时会发生什么。 (这可能非常广泛,具体取决于参数的数量。)

    如果你的方法需要很多参数,可以考虑重构它以获取一个带有信息的对象,这样你就可以将它的规则封装在对象中,并将对象传递给方法。

    【讨论】:

    • 阿门。如果它太难测试,可能一开始就太难理解了。
    • 我加入了可测试性教堂的合唱团 :-) 如果你的函数有很多参数,形成了一个复杂的条件网格,那么你很可能可以将代码拆分为几个不同的对象——每个对象处理一个单一的职责。
    【解决方案2】:

    对于 NUnit 中的数据驱动测试,有 [TestCase]attribute。单元测试通常不会测试所有可能的场景。他们只是测试一组有代表性的输入,这些输入很好地覆盖了 SUT 在各种输入上的作用。只需选择一些特征输入,就可以了。

    【讨论】:

      【解决方案3】:

      不知道这是否是您正在寻找的东西,但有一个由 Microsoft 研究创建的自动化单元测试生成器,名为 PEX

      Pex 自动生成具有高代码覆盖率的测试套件。直接从 Visual Studio 代码编辑器中,Pex 找到您的方法的有趣输入输出值,您可以将其保存为具有高代码覆盖率的小型测试套件。 Microsoft Pex 是一个用于测试 .NET Framework 应用程序的 Visual Studio 插件。

      【讨论】:

      • 自动化测试的问题在于,通常很难为更一般的情况定义函数的预期结果,而这并不等于重新实现该函数。所以你只需要检查函数的后置条件是否成立。
      • 这是一个很好的基础测试工具。但是复杂的功能,例如需要(字典)-键、文件路径和其他类似这样的输入失败。
      【解决方案4】:

      使用RowTest类似的问题可以在

      找到

      C#, NUnit Assert in a Loop

      看看@“Sam Holder”的回复,我从中复制了代码,做了一些调整。

      [TestFixture] 
          public class TestExample 
          {      
      
          [RowTest]      
          [Row( 1)]      
          [Row( 2)]      
          [Row( 3)]      
          [Row( 4)]      
      
          public void TestMethodExample(int value)      
          {           
                    ...
                    ...
                    ...
                    Assert.IsTrue("some condition ..");
          } 
       } 
      

      【讨论】:

        【解决方案5】:

        我同意 Mike Hofer 的观点,该问题表明代码有异味。

        不过,NUnit has a Combinatorial attribute 可能会对您有所帮助,如果您不进行重构/重新设计的话。

        【讨论】:

          猜你喜欢
          • 2010-09-19
          • 1970-01-01
          • 2010-11-01
          • 1970-01-01
          • 2017-01-16
          • 2019-11-11
          • 2016-10-24
          • 2014-01-03
          • 1970-01-01
          相关资源
          最近更新 更多