有条件地忽略 JUnit 4 中的测试

2022-08-31 04:40:18

好的,所以注释很适合标记不应运行测试用例。@Ignore

但是,有时我想忽略基于运行时信息的测试。例如,如果我有一个并发测试,需要在具有一定数量内核的计算机上运行。如果这个测试是在单处理器机器上运行的,我认为仅仅通过测试是不正确的(因为它还没有运行),而且失败测试并破坏构建肯定是不对的。

因此,我希望能够在运行时忽略测试,因为这似乎是正确的结果(因为测试框架将允许构建通过,但记录测试未运行)。我很确定注释不会给我这种灵活性,并怀疑我需要为有问题的类手动创建测试套件。但是,文档没有提到任何有关此内容的信息,并且通过API查看也不清楚如何以编程方式完成此操作(即,我如何以编程方式创建与注释创建的实例等效的实例或类似实例?)。Test@Ignore

如果有人过去做过类似的事情,或者对我还能如何去做这件事有一个很好的想法,我会很高兴听到它。


答案 1

JUnit 的方式是在运行时执行此操作,是 。org.junit.Assume

 @Before
 public void beforeMethod() {
     org.junit.Assume.assumeTrue(someCondition());
     // rest of setup.
 }

您可以在方法或测试本身中执行此操作,但不能在方法中执行此操作。如果在测试本身中执行此操作,则将运行您的方法。您也可以在 中执行此操作以防止类初始化。@Before@After@Before@BeforeClass

假设失败会导致测试被忽略。

编辑:为了与 junit-ext 的注释进行比较,它们的示例代码如下所示:@RunIf

@Test
public void calculateTotalSalary() {
    assumeThat(Database.connect(), is(notNull()));
    //test code below.
}

更不用说以这种方式捕获和使用方法中的连接要容易得多。Database.connect()


答案 2

您应该签出 Junit-ext 项目。它们具有执行条件测试的注释,例如:RunIf

@Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
    //your code there
}

class DatabaseIsConnected implements Checker {
   public boolean satisify() {
        return Database.connect() != null;
   }
}

[代码示例取自他们的教程]


推荐