【问题标题】:JUnit parameterized- create one instance for each parameterJUnit 参数化 - 为每个参数创建一个实例
【发布时间】:2013-01-03 23:40:44
【问题描述】:

我很恼火地在Parameterized documentation 中发现“在运行参数化测试类时,会为测试方法和测试数据元素的交叉产品创建实例。”这意味着构造函数为每个测试运行一次,而不是在运行所有测试之前。我在构造函数中进行了一项昂贵的操作(1-5 秒),现在该操作重复了太多次,不必要地减慢了整个测试套件的速度。该操作只需要一次即可设置所有测试的状态。如何使用参数化测试的一个实例运行多个测试?

【问题讨论】:

  • 测试应该单独运行。如果可以,请遵循邓肯琼斯的建议。

标签: java unit-testing junit junit4 parameterized


【解决方案1】:

我会将代价高昂的操作转移到 @BeforeClass 方法中,该方法在整个参数化测试中应该只执行一次。

一个愚蠢的例子如下所示:

@RunWith(Parameterized.class)
public class QuickTest {

  private static Object expensiveObject;  
  private final int value;

  @BeforeClass
  public static void before() {
    System.out.println("Before class!");
    expensiveObject = new String("Just joking!");
  }


  @Parameters
  public static Collection<Object[]> data() {
    return Arrays.asList(new Object[][] { { 1 }, { 2 } });
  }      

  public QuickTest(int value) {
    this.value = value;
  }

  @Test
  public void test() {
    System.out.println(String.format("Ran test #%d.", value));
    System.out.println(expensiveObject);
  }
}

将打印:

Before class!
Ran test #1.
Just joking!
Ran test #2.
Just joking!

【讨论】:

  • 啊!谢谢。我使用 Before 和 AfterClass,就好像它们会在第一个和最后一个参数化测试之前和之后运行一样。有没有办法做到这一点(之前的静态块,以及之后的其他东西......)?
  • 不确定我明白你想要什么。 @BeforeClass@AfterClass 将允许您设置和拆除您的测试数据。两者都需要是public static void 方法。
  • 是的,这正是我在问题中所要求的。我只是想知道,因为我错误地使用了 BeforeClass 和 AfterClass,是否有办法在开始任何测试之前和完成所有测试之后运行东西。
  • 我现在很困惑!要在开始任何测试之前运行东西,请使用@BeforeClass。要在所有测试后运行东西,请使用@AfterClass。我知道没有其他选择!您正在寻找@BeforeClass@AfterClass 未提供的哪些功能?
  • @BeforeClass@AfterClass 在每个参数化测试之前和之后运行。因此,对于 5 个参数元素,它们将分别运行 5 次。我要求在运行所有参数化测试之前和之后由 JUnit 运行的东西。所以即使有 5 个参数元素,它们也只会运行一次。
猜你喜欢
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 2015-09-22
  • 1970-01-01
  • 2020-07-14
相关资源
最近更新 更多