gpt4 book ai didi

spring - 基于 Spring 属性禁用整个测试(和加载上下文)

转载 作者:行者123 更新时间:2023-11-28 21:37:15 25 4
gpt4 key购买 nike

当我在处理 Spring 5(不是 Spring Boot)应用程序时,我试图在我的工作流程中应用 TDD,但是我的运行测试大约需要 45 秒,这使得我的开发周期非常慢。标准单元测试非常快,但我有一个验证 Spring 上下文配置的测试——它自己需要 30 多秒。

我的想法是在开发周期中每次都禁用此特定测试并时不时运行它 - 例如当我使用我的应用程序创建 Docker 镜像时/进行提交/推送更改。

到目前为止,这是我想出的:

  1. 在运行 docker-profile 时定义属性:

    <profiles>
    <profile>
    <id>docker-build</id>
    <properties>
    <build.profile.id>docker-build</build.profile.id>
    </properties>
    <build>...</build>
    </profile>
    </profiles>
  2. test.properties中使用它:

    app.profile=${build.profile.id}
  3. 在测试中使用@EnabledIf注解:

     @TestPropertySource("classpath:test.properties")
    @SpringJUnitConfig( classes = MainConfiguration.class )
    @EnabledIf("#{'${app.profile}' == 'docker-build'}")
    public class SpringConfigTest {
    ...
    }

它似乎不起作用 - 我可能是错的,但是当我在 @EnabledIf 中调用它时,app.profile 属性似乎不可用. 或者也许我走错了路,有更简单的方法来禁用这个特定的测试 - 我现在以 mvn test 运行它。我想知道为什么 app.profile 属性对于 @EnabledIf 不可见。

编辑我发现我可以跳过前两个步骤并在命令行中定义属性:

mvn -Dapp.profile=docker-build test

但不确定为什么我不能从 test.properties 文件中获取属性

最佳答案

我相信在这种情况下,您需要为 @EnabledIf 的 Spring 版本加载上下文来评估表达式。所以它会是:

@EnabledIf(expression = "#{'${app.profile}' == 'docker-build'}", loadContext = true)

还要确保属性文件包含在启用了过滤功能的 maven testResources 中:

    <build>
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
</build>

我认为以上应该可以解决您面临的具体属性(property)问题。但由于这不会跳过加载 spring 上下文,也许更好的方法是在 maven 配置文件中配置为跳过基于包或测试类名称的测试 - 类似于 Is there a way to tell surefire to skip tests in a certain package?

关于spring - 基于 Spring 属性禁用整个测试(和加载上下文),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56992966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com