理论和参数化测试有什么区别?
我对创建测试类时的实现差异不感兴趣,只是当您选择一个而不是另一个时。
据我了解:使用参数化测试,您可以为测试用例提供一系列静态输入。
理论相似,但概念不同。他们背后的想法是创建测试假设而不是静态值的测试用例。因此,如果我提供的测试数据根据某些假设是正确的,则结果断言始终是确定性的。这背后的驱动思想之一是您将能够提供无限数量的测试数据,并且您的测试用例仍然是正确的;此外,您通常需要在测试输入数据中测试各种可能性,例如负数。如果您静态测试,即提供一些负数,则不能保证您的组件将针对所有负数工作,即使很有可能这样做。
据我所知,xUnit 框架试图通过创建您提供的测试数据的所有可能组合来应用理论的概念。
当处理数据驱动场景中的场景时,两者都应该使用(即只有输入发生变化,但测试总是一遍又一遍地执行相同的断言)。
但是,由于理论似乎是实验性的,我只会在需要测试输入数据中的一系列组合时才使用它们。对于所有其他情况,我将使用参数化测试。
Parameterized.class 使用单个变量测试“参数化”测试,而 Theories.class 使用多个变量的所有组合进行“参数化”测试。
示例请阅读:
http://blogs.oracle.com/jacobc/entry/parameterized_unit_tests_with_junit
http://blog.schauderhaft.de/2010/02/07/junit-theories/
http://blogs.oracle.com/jacobc/entry/junit_theories
Theories.class 类似于 Haskell QuickCheck:
http://en.wikibooks.org/wiki/Haskell/Testing
但 QuickCheck 会自动生成参数组合
除了上述响应:在具有 4 个值和 2 个测试方法的输入上
@RunWith(Theories.class) - 将生成 2 个 JUnit 测试
@RunWith(Parameterized.class) - 将生成 8 个(4 个输入 x 2 个方法)JUnit 测试
回复有点晚了。但这对未来的测试人员会有帮助。
参数化测试与理论
据我了解,不同之处在于,当您要做的只是测试一组不同的输入(单独测试每个输入)时,使用参数化测试,理论是参数化测试的一种特殊情况,您在其中测试每个输入一个整体(每个参数都必须为真)。