当使用参数化的runner运行时,我如何使JUnit在运行时忽略特定的测试用例



可能重复:
JUnit 4 中的条件忽略测试

我有一套用Parameterized runner运行的系统测试,我想在不同的环境中运行。有些测试应该只在非生产环境中运行,当在生产环境中执行时,我希望它们被忽略,所以我正在寻找一种方法来说:

@Test
public void dangerousTest() {
    if (isProduction(environment)) ignore(); // JUnit doesn't provide ignore()
    environment.launchMissilesAt(target);
    assertThat(target, is(destroyed()));
}

问题是JUnit没有提供ignore()方法来在运行时忽略测试用例。此外,Assume.assumeTrue(isNotProduction(environment))似乎不适用于Parameterized runner——它只是将测试标记为通过,而不是忽略。任何关于如何在以下限制条件下实现等效的想法:

  • 套件需要使用Parameterized runner
  • 如果套件在生产中运行,测试是否需要显示为已忽略

您可以随时进行

if (isProduction(environment)) return;

测试将被标记为通过,但至少导弹不会发射。

或者你可以使用我从未使用过的Assume,但它是这样记录的:

一套有用的陈述方法关于中的条件的假设测试是有意义的。A失败假设并不意味着代码坏了,但测试没有有用的信息。默认JUnit跑步者认为测试不合格假设被忽略。定制跑步鞋可能表现不同。例如:

因此,您的代码将如下所示:

@Test
public void dangerousTest() {
    assumeTrue(!isProduction(environment));
    // ...
}

两点:

  • JUnit的假设并不像你所期望的那样有效:如果它们失败了,它们仍然会将测试标记为通过:

通过这次发布,一个失败的假设将导致测试标记为传递,不管代码是什么下面的假设可以断言。在里面未来,这种情况可能会改变失败的假设可能导致测试被忽略:然而,第三方跑步者当前不允许选项

我发现这也非常违背直觉,更可怕的是,这种行为在未来可能会改变。我希望他们能坚持使用这个功能,直到它按预期工作。

  • 如果使用TestNG是一种选择,那么您可以使用组来实现这一点。将您的测试方法放入"生产"组:

    @Test(groups = "production")
    public void dangerousTest() { ... }
    

在运行测试时,请排除"production"组。

最新更新