理论测试和参数化测试之间的区别是什么?
我不关心在创建测试类时实现差异,只关心你何时会选择其中一种。
理论测试和参数化测试之间的区别是什么?
我不关心在创建测试类时实现差异,只关心你何时会选择其中一种。
据我所知,使用参数化测试可以向测试用例提供一系列静态输入。
理论测试与之类似,但概念不同。其背后的想法是创建基于假设而非静态值的测试用例。 因此,如果根据某些假设我的提供的测试数据是真实的,那么结果断言总是确定性的。 这其中的驱动思想之一是您将能够提供无限量的测试数据,您的测试用例仍然是正确的。此外,通常需要在测试输入数据中测试各种可能性,比如负数。如果您静态地测试它,也就是提供一些负数,即使高度可能如此,也不能保证您的组件针对所有负数都能正常工作。
据我所知,xUnit框架试图通过创建您提供的测试数据的所有可能组合来应用理论的概念。
在处理数据驱动的场景时(即仅输入发生变化,但测试始终执行相同的断言),两者都应该使用。
但是,由于理论测试似乎是实验性的,所以只有在需要测试输入数据中的一系列组合时才会使用它们。对于其他所有情况,我都会使用参数化测试。
Parameterized.class使用单个变量测试“parametrize”测试,而Theories.class使用多个变量的所有组合进行“parametrize”。
有关示例,请参阅:
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会自动生成参数组合。
除了上述的回答外:
@RunWith(Theories.class) - 将生成 2 个 JUnit 测试
@RunWith(Parameterized.class) - 将生成 8 个 (4 个输入 x 2 个方法) JUnit 测试