62

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

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

4

5 回答 5

30

据我了解:使用参数化测试,您可以为测试用例提供一系列静态输入。

理论相似,但概念不同。他们背后的想法是创建测试假设而不是静态值的测试用例。因此,如果我提供的测试数据根据某些假设是正确的,则结果断言始终是确定性的。这背后的驱动思想之一是您将能够提供无限数量的测试数据,并且您的测试用例仍然是正确的;此外,您通常需要在测试输入数据中测试各种可能性,例如负数。如果您静态测试,即提供一些负数,则不能保证您的组件将针对所有负数工作,即使很有可能这样做。

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

当处理数据驱动场景中的场景时,两者都应该使用(即只有输入发生变化,但测试总是一遍又一遍地执行相同的断言)。

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

于 2011-05-03T23:28:45.993 回答
12

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

于 2011-04-29T15:10:32.660 回答
3

除了上述响应:在具有 4 个值和 2 个测试方法的输入上

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

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

于 2017-09-19T12:52:39.820 回答
1

回复有点晚了。但这对未来的测试人员会有帮助。

参数化测试与理论

  • 用“@RunWith (Parameterized.class)” VS “@RunWith(Theories.class)”注释的类
  • 测试输入从返回 Collection 的静态方法中检索,并使用 @Parameters 注释与使用 @DataPoints 或 @DataPoint 注释的静态字段。
  • 输入传递给构造函数(强制)并由测试方法使用,而输入直接传递给测试方法。
  • 测试方法用@Test注解并且不带参数 vs 测试方法用@Theory注解并且可以带参数
于 2017-05-08T17:56:27.553 回答
0

据我了解,不同之处在于,当您要做的只是测试一组不同的输入(单独测试每个输入)时,使用参数化测试,理论是参数化测试的一种特殊情况,您在其中测试每个输入一个整体(每个参数都必须为真)。

于 2011-04-20T22:18:45.257 回答