可能重复:
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"组。