Citrus 测试用例中的代码执行顺序是什么

What is the order of code execution in Citrus test cases

在开发 Citrus 测试用例(Linux 上的 Citrus 版本 2.7.2)时,我注意到方法的执行顺序似乎与代码中指定的顺序不同。这是一个测试示例:

@CitrusTest
public void testOrderOfMethods() throws InterruptedException {

    log.info(">> Starting test");

    http()
            .client(wiremockClient)
            .send()
            .get("/__admin/requests")
            .accept("application/json");

    http()
            .client(wiremockClient)
            .receive()
            .response(HttpStatus.OK)
            .messageType(MessageType.JSON);

    log.info(">> Test completed");
    Thread.sleep(2000);
    log.info(">> Waited a while");
}

这段代码产生的输出是:

14:35:19 14:35:19,133 INFO         citrus.Citrus|
14:35:19 14:35:19,133 INFO         citrus.Citrus| 
14:35:19 14:35:19,145 DEBUG t.TestContextFactory| Created new test context - using global variables: '{}'
14:35:19 14:35:19,145 INFO           junk.JunkIT| >> Starting test
14:35:19 14:35:19,146 INFO           junk.JunkIT| >> Test completed
14:35:21 14:35:21,146 INFO           junk.JunkIT| >> Waited a while
14:35:21 14:35:21,146 INFO         citrus.Citrus| 
14:35:21 14:35:21,146 INFO         citrus.Citrus|     
14:35:21 14:35:21,146 DEBUG        citrus.Citrus| STARTING TEST JunkIT.testOrderOfMethods <esb.junk>
14:35:21 14:35:21,146 INFO         citrus.Citrus| 
14:35:21 14:35:21,146 DEBUG      citrus.TestCase| Initializing test case

因此,在 Citrus http() 调用之前打印了 3 行日志(开始测试、测试完成、等待一段时间),即使测试在打印 "Waited a while" 之前等待了 2 秒。

如果我 运行 我将 Jenkins 测试作为 Maven 作业,就会发生这种情况。如果我 运行 我在调试器中进行测试,则语句的顺序与源代码所建议的一样。

我的问题是:对 Citrus 的调用是否以某种方式在其他代码之后执行(也许是在另一个方面)?如果是这样,我如何强制执行 Citrus 测试方法中的代码顺序?

您应该在 Citrus 中使用 TestRunner 而不是 TestDesigner。

设计者首先会收集所有的测试动作,构建整个测试用例,并在构建结束时执行。

运行器将立即执行在 Java DSL 方法调用中构造的操作。

设计器和运行器的不同方法和策略在参考文档中也有更详细的描述:http://www.citrusframework.org/reference/html/#writing-test-cases-in-java