Unit testing 单元测试复杂逻辑

Unit testing 单元测试复杂逻辑,unit-testing,testing,Unit Testing,Testing,对一个相对复杂的方法进行单元测试的最佳方法是什么,其中每个post条件的测试与其他post条件的测试非常相似?先决条件很容易单独测试,但很多设置都是为了确保它们都保持不变,以便可以测试后决条件。我想到的三种方法是: 创建一个可以同时测试所有内容的通用函数,但默认为最简单的场景。此函数将采用标志参数,指示与最简单方案的偏差。然后,为每个post条件(或组合)创建一个单元测试,该测试使用适当的标志调用该函数以获得该post条件的覆盖率。这里的好处是几乎没有代码重复,因此如果被测试的代码发生变化,只需

对一个相对复杂的方法进行单元测试的最佳方法是什么,其中每个post条件的测试与其他post条件的测试非常相似?先决条件很容易单独测试,但很多设置都是为了确保它们都保持不变,以便可以测试后决条件。我想到的三种方法是:

  • 创建一个可以同时测试所有内容的通用函数,但默认为最简单的场景。此函数将采用标志参数,指示与最简单方案的偏差。然后,为每个post条件(或组合)创建一个单元测试,该测试使用适当的标志调用该函数以获得该post条件的覆盖率。这里的好处是几乎没有代码重复,因此如果被测试的代码发生变化,只需要重写一个测试函数;编写测试来覆盖一组post条件是很简单的,但缺点是通用测试函数非常复杂
  • 为最简单的场景进行单元测试,然后复制、粘贴和修改。好处是每个测试都非常简单。缺点是原始测试的问题需要在粘贴时修复多次
  • 编写一个通用函数,该函数允许通过将函数作为参数重写各种位和块,但默认情况下测试最简单的场景。其好处与带有标志的常规函数类似,但我认为将其全部网格化可能更复杂
  • 第四个选项是“你做错了;将正在测试的方法分解为更易于测试的部分!”


    有什么想法吗?

    我之前的评论有点开玩笑

    从广义上讲,我实际上提倡的是做您列为选项2的事情,然后重构您的测试代码以消除复制修改工作所创建的重复


    一旦您对这些都进行了测试,您可能会寻找重构生产代码的方法,将其分解为更小、更易于管理的部分,并使这些部分可重用。但在做出重大改变之前进行测试总是有益健康的。

    我投票支持第四种选择,可能是第四种选择。您是否评估过您的课程和方法,以确保您坚持单一责任原则?谢谢您的回复。这个类是一个业务逻辑类,我很确定它有一个单一的职责(我没有听说过这个名字),这个方法是一个“Save”方法,它接受一个带有用户数据的transfer对象,用户数据应该转换成(可能是许多相互关联的)域对象,并保存在数据存储中。我将尝试重构设置代码,使其更易于重用。也许问题不在于被测试的方法很复杂,而在于我没有一种简单且可重用的方法来设置测试。你会发现,在实践中,“一件事”可能会被分解成许多事情,所有这些事情都可以是独立的类,有自己的单元测试。谢谢你的回答。这是我倾向于走的方向。