【问题标题】:JUnit 5: Specify execution order for nested testsJUnit 5:指定嵌套测试的执行顺序
【发布时间】:2019-04-02 13:30:43
【问题描述】:

是否可以在其他一些测试之间以固定的执行顺序执行多个嵌套测试?

例如

@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(OrderAnnotation.class)
class MyTest {

    private State state = State.ZERO;

    @Test
    @Order(1)
    public void step1() throws IOException {
        state = State.ONE;
    }

    @Order(2)  // sth like this, however this annotation isn't allowed here
    @Nested
    class WhileInStateOne {

        @Test
        public void step2a {
            Assumptions.assumeTrue(state == State.ONE);

            // test something
        }

        @Test
        public void step2b {
            Assumptions.assumeTrue(state == State.ONE);

            // test something else
        }

    }

    @Test
    @Order(3)
    public void step3() throws IOException {
        state = State.THREE;
    }

}

我知道,单元测试通常应该是无状态的,但是在这种情况下,如果我可以按固定顺序重用状态,我可以节省大量执行时间。

【问题讨论】:

  • 你不应该关心执行时间。让它们自动在您的管道上运行并在 LDEV 上跳过它 - 但您不应该按顺序运行它们。这是一个艰难的休息。
  • 我怀疑像这样的 cmets,这就是为什么我写了我知道 test 不应该有状态的事实。但是也有例外,我故意打破了这个“规则”,因为在我的场景中这是有道理的(无论如何它更像是一个集成测试)。我不想进行基本的辩论,我只想知道如何实现我的要求;-)
  • 文档显示嵌套测试确实支持排序。所以也在那里使用它。所以你的测试 nr 3 将是 5 并且嵌套测试是 Nr 3+4。
  • 试过了,但是嵌套类中的测试仍然在外部类的测试之后执行

标签: java unit-testing junit5


【解决方案1】:

没有。嵌套类中的测试总是在封闭类中的测试之后执行。这是无法改变的。

测试方法的顺序仅适用于单个测试类中的方法。

【讨论】:

  • 感谢您的明确答复。这有可能最终改变吗?
  • 不客气。不,我们(JUnit 团队)没有计划在嵌套测试类和它们的封闭类之间混合测试的执行顺序,仅仅是因为这会违反嵌套容器的整个设计原则。
  • 那么当您有多个@Nested 测试时会发生什么?顺序是什么?您如何使订单具有预测性? AFAIK 嵌套测试用于组织您的测试套件。因此,例如,您可以将一个大型测试类(在所有测试上都有 Order 注释)重构为几个嵌套测试类,但是如果您无法控制嵌套测试的顺序,那么您将无法进行此重构,因为您重新将失去秩序。谢谢
  • @VincentMassol 您可以控制自 5.8.0 以来嵌套类的执行顺序。看看发行说明,第 2 点:junit.org/junit5/docs/5.8.0/release-notes/… GitHub 中的问题:github.com/junit-team/junit5/issues/2699
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 2015-06-12
  • 2018-04-23
  • 1970-01-01
  • 2019-12-08
  • 2022-08-20
相关资源
最近更新 更多