JUnit Theories和Parameterized Tests的区别

62

理论测试和参数化测试之间的区别是什么?

我不关心在创建测试类时实现差异,只关心你何时会选择其中一种。


2
我之前使用过参数化,但发现它可能会变得有点混乱。理论上似乎可以以更清晰的方式完成相同的事情。也许这是第二次尝试正确理解参数化测试的概念。好问题,感谢您提出! - Newtopian
5个回答

30

据我所知,使用参数化测试可以向测试用例提供一系列静态输入。

理论测试与之类似,但概念不同。其背后的想法是创建基于假设而非静态值的测试用例。 因此,如果根据某些假设我的提供的测试数据是真实的,那么结果断言总是确定性的。 这其中的驱动思想之一是您将能够提供无限量的测试数据,您的测试用例仍然是正确的。此外,通常需要在测试输入数据中测试各种可能性,比如负数。如果您静态地测试它,也就是提供一些负数,即使高度可能如此,也不能保证您的组件针对所有负数都能正常工作。

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

在处理数据驱动的场景时(即仅输入发生变化,但测试始终执行相同的断言),两者都应该使用。

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


1
这是一个基本的样例测试,借助覆盖抽象ParameterSupplier实现,执行了10000个不同的输入数据中的一个@Theory。我不确定是否可以使用参数化运行程序轻松实现此操作。 - BartoszMiller

12

4
不对。您可以使用任意数量的变量(参数)进行参数化测试,并且可以使用单个参数进行理论测试。@Fabio Kenji在上面的回答中很好地解释了真正的区别。 - Gilead

3

除了上述的回答外:

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

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


1
A little late in replying. But it would be helpful to the future testers.
参数化测试 vs 理论测试
  • 使用 "@RunWith (Parameterized.class)" 标注的类 vs "@RunWith(Theories.class)" 标注的类
  • 从返回 Collection 的静态方法中检索测试输入并标注 @Parameters vs 使用 @DataPoints 或 @DataPoint 标注的静态字段
  • 将输入传递给构造函数(必需),并由测试方法使用 vs 直接将输入传递给测试方法。
  • 测试方法用 @Test 标注且不带参数 vs 测试方法用 @Theory 标注且可能带有参数

0
据我理解,参数化测试的区别在于当您想要测试不同的输入集时(逐个测试每个输入),则使用参数化测试,而理论是参数化测试的特殊情况,在其中您将整个输入作为一个整体进行测试(每个参数都需要为真)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接