JUnit理论与参数化测试的区别

时间:2011-04-20 08:37:56

标签: java junit4 parameterized

理论与参数化测试有什么区别?

我对创建测试类时的实现差异不感兴趣,只是当你选择一个而不是另一个时。

5 个答案:

答案 0 :(得分:28)

据我所知: 通过参数化测试,您可以为测试用例提供一系列静态输入。

理论相似但概念不同。它们背后的想法是创建测试用例来测试假设而不是静态值。 因此,如果根据某些假设我提供的测试数据为真,那么得到的断言总是确定性的。 这背后的驱动思想之一是,您将能够提供无限数量的测试数据,您的测试用例仍然是真实的;此外,您通常需要在测试输入数据中测试一系列可能性,例如负数。如果您静态测试,即提供一些负数,则无法保证您的组件能够对抗所有负数,即使很可能这样做。

据我所知,xUnit框架尝试通过创建所提供测试数据的所有可能组合来应用理论概念。

在接近数据驱动场景中的场景时应该使用两者(即只输入更改,但测试总是反复执行相同的断言)。

但是,既然理论似乎是实验性的,那么只有当我需要在输入数据中测试一系列组合时,我才会使用它们。对于所有其他情况,我会使用参数化测试。

答案 1 :(得分:11)

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会自动生成参数组合

答案 2 :(得分:0)

根据我的理解,区别在于当你想要做的就是测试一组不同的输入(单独测试每一个)时使用参数化测试,理论是参数化测试的一个特例,你正在测试它每个输入作为一个整体(每个参数都需要为真)。

答案 3 :(得分:0)

回复有点迟了。但它对未来的测试人员有所帮助。

参数化测试与理论

  • 使用“@RunWith(Parameterized.class)”VS“@RunWith(Theories.class)”注释的类
  • 从返回Collection的静态方法中检索测试输入,并使用@Parameters和使用@DataPoints或@DataPoint注释的静态字段进行注释。
  • 输入传递给构造函数(必需)并由测试方法使用,输入直接传递给测试方法。
  • 测试方法用@Test注释并且不带参数vs测试方法用@Theory注释并且可以带参数

答案 4 :(得分:0)

除了以上回复: 在具有4个值和2个测试方法的输入

  • @RunWith(Theories.class) - 将生成2个JUnit测试

  • @RunWith(Parameterized.class) - 将生成8个(4个输入x 2个方法)JUnit测试