【问题标题】:Prevent tests from running with specific spring profile防止测试使用特定的弹簧配置文件运行
【发布时间】:2021-03-25 17:21:50
【问题描述】:

我有一些集成测试可以在我的数据库中创建/删除条目。问题是如果我用

运行测试
spring.profiles.active=prod

我的生产数据库被删除(因为测试清除了数据库)。有什么方法可以阻止测试在这个特定的弹簧配置文件上运行?

我看过这个帖子:How to prevent running tests when specific spring profile is active? 但没有有用的答案。

谢谢

【问题讨论】:

  • @aksappy,不幸的是,不,这些答案都不能解决问题,尽管问题是相同的,如何禁用测试类默认运行。还是谢谢你
  • 你不是在运行@Transactional吗?这个注释角色在测试后返回所有内容

标签: java spring spring-boot testing spring-profiles


【解决方案1】:

您的问题可能有多种解决方案。

  1. 使用内存数据库,例如 H2 用于 Sql 和 flapdoodle 用于 no-sql 运行测试。 **首选方式
  2. 使用弹簧属性的克隆创建一个单独的属性文件。只需更改数据库属性/弹簧配置文件或其他内容。在测试类上将此属性文件与 @testpropertysource 一起使用。
  3. 在测试中使用@dirtiescontext 仅创建/删除受影响的行。
  4. 您可以做的另一件事是在您的数据库层创建螺柱类来模拟操作。

【讨论】:

  • 我为不同的配置文件使用不同的数据库,默认情况下测试不会在生产数据库上运行。这是防止可能分心的预防措施
【解决方案2】:

我能够在此评论之后解决问题:https://stackoverflow.com/a/32892291/8679100。该解决方案并不完美,因为我需要验证 prod 配置文件是否在 @BeforeAll and @AfterAll, but it does work. Furthermore, System.getProperty("spring.profiles.active", "");didn't actually work, butArrays.stream(environment .getActiveProfiles()).anyMatch(env -> (env.equalsIgnoreCase("prod")))``` 做了

【讨论】:

    【解决方案3】:

    您可以使用@IfProfileValue annotation 禁用测试。它不直接依赖于弹簧配置文件,但您可以轻松地使用配置文件根据弹簧配置文件设置您想要的值。

    话虽如此 - 在生产数据库上运行从数据库(或任何其他数据库事务)中删除条目的测试听起来非常冒险。我支持上面@Sachin 的建议-在测试环境而不是生产环境中运行测试

    【讨论】:

    • 我只是在测试环境上运行测试,但是我想防止出现spring.profiles.active=prod时不小心运行mvn test这样的情况。我不确定如何使用@IfProfileValue。我试图做@IfProfileValue(name = "spring.profiles.active", value = "prod"),但是当spring.profiles.active 是“dev”时它仍然运行。可以举个例子吗?
    猜你喜欢
    • 2019-07-06
    • 2016-12-13
    • 2019-04-18
    • 2012-11-02
    • 1970-01-01
    • 2011-11-27
    • 2021-12-12
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多