Spring boot Maven&;引入WebFluxTest时的Spring引导2 环境 OSX 10.13.5 爪哇10.0.1 2018-04-17 ApacheMaven 3.5.2 弹簧靴2.0.3.0版本 Maven Surefire插件2.22.0 问题

Spring boot Maven&;引入WebFluxTest时的Spring引导2 环境 OSX 10.13.5 爪哇10.0.1 2018-04-17 ApacheMaven 3.5.2 弹簧靴2.0.3.0版本 Maven Surefire插件2.22.0 问题,spring-boot,maven-3,maven-surefire-plugin,spring-webflux,Spring Boot,Maven 3,Maven Surefire Plugin,Spring Webflux,我有一个可靠通过的测试: public class TransformerTest { private final MyTransformer transformer = new MyTransformerImpl(); @Rule public final OutputCapture outputCapture = new OutputCapture(); @Test public void successShouldLogSuccessMessa

我有一个可靠通过的测试:

public class TransformerTest {

    private final MyTransformer transformer = new MyTransformerImpl();

    @Rule
    public final OutputCapture outputCapture = new OutputCapture();

    @Test
    public void successShouldLogSuccessMessages() {
        final B result = transformer.transform(new A());
        outputCapture.expect(containsString("First message"));
        outputCapture.expect(containsString("Second message"));
    }

}
转换器使用log4j通过
log.debug(“第一条消息”)
log.debug(“第二条消息”)
记录两行代码。我可以运行这个测试1000次,它会通过的

当我介绍这个测试类的时候

@WebFluxTest
@RunWith(SpringRunner.class)
public class DummyTest {

    @Autowired
    private WebTestClient client;

    @MockBean
    private MyService service;

    @Test
    public void dummyTest() {
        doRequest()
            .expectStatus().isAccepted()
            .expectBody().isEmpty();
    }

    private WebTestClient.ResponseSpec doRequest() {
        return client.post()
            .uri("/")
            .exchange();
    }
}
新的测试可靠地通过了-但是第一个测试(似乎与此测试无关)现在只有在使用Maven运行构建时才会失败

  • 通过IDE运行第一个独立测试将获得100%的可靠通过率
  • 在IDE中运行项目的整个测试套件(不是通过Maven)也可以获得100%的可靠通过率
  • 在第一次测试中删除第二个测试结果时,再次100%可靠地通过-这是唯一的源代码差异
故障信息为:

TransformerTest.successShouldLogSuccessMessages 应为:(包含“第一条消息”的字符串和包含“第二条消息”的字符串),但:包含“第一条消息”的字符串为“”

有人知道会发生什么吗?第一个测试是否已经存在根本性缺陷,而第二个测试的引入只是暴露了这个缺陷,还是第二个测试的引入从根本上改变了测试套件的行为

配置 我的整个surefire配置是:

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.0</version>
            <configuration>
                <excludedGroups>com.example.IntegrationTest</excludedGroups>
            </configuration>
</plugin>

org.apache.maven.plugins
maven surefire插件
2.22.0
com.example.IntegrationTest
这些测试都不是集成测试组的一部分。我没有修改surefire的并行或分叉默认值。由于这只是我在通过surefire与Maven一起运行时遇到的一个问题,是否可能是比赛条件


我可以在多台机器上以100%的可靠性再现此问题。

我怀疑这是一个竞争条件,而是一个测试顺序条件。无法保证测试在命令行上的运行顺序与在IDE中的相同。您可以使用
套件
运行程序和
@SuiteClasses
创建一个小套件,以特定顺序运行这两个测试。在IDE中使用它可以让您更轻松地调试事情并开始了解发生了什么。感谢您的建议,我可以确认,如果webflux测试先运行,我可以通过套件再现失败,如果它随后运行,我可以通过套件。现在来调试为什么…我找到了原因。其实很简单,第二个测试(webflux one)似乎“重置”了日志级别。第一个测试预期日志级别为DEBUG,添加第二个测试后,它将更改为INFO。我唯一不明白的是,为什么在webflux测试“完成”后,日志级别的更改仍然存在。我可以通过将其添加到webflux测试
@TestPropertySource(properties=“logging.level.com.example=DEBUG”)
来解决这个问题,但这感觉有点不对劲(在这个测试中设置一个日志级别以便其他测试可以通过),从问题的角度来说,这是一个离题的话题——但鉴于第一个原始测试不是spring上下文测试,我不能在其中使用
@TestPropertySource(properties=“logging.level.com.example=DEBUG”)
。在测试期间,建议以何种方式在每次测试的基础上设置回写日志级别