【问题标题】:maven: Running the same tests for different configurationsmaven:为不同的配置运行相同的测试
【发布时间】:2012-04-27 09:47:49
【问题描述】:

在我的 spring + maven 应用程序中,我已经为数据访问层创建了一些测试,现在我想针对多个数据源运行这些测试。我有类似的东西:

@ContextConfiguration(locations={"file:src/test/resources/testAppConfigMysql.xml"})
public class TestFooDao extends AbstractTransactionalJUnit38SpringContextTests {
  public void testFoo(){
     ...
  }
} 

目前它已经硬编码了配置位置,因此它只能用于一个数据源。 两次调用测试并通过两个不同配置(比如 testAppConfigMysql.xml 和 testMyConfigHsqlDb.xml)的最佳方法是什么?

我看到了通过系统属性执行此操作的建议。如何告诉 maven 使用不同的系统属性值调用测试两次?

【问题讨论】:

    标签: spring testing maven surefire


    【解决方案1】:

    我不知道是否有一些性感和花哨的解决方案,也很简单,为此。我只需使用所有测试内容实现基类,然后将其继承到具有不同基于注释的配置的 2 个类中,如下所示:

    @ContextConfiguration(locations={"firstDs.xml"})
    public class TestFooDaoUsingFirstDs extends TestFooDao {
    }
    
    @ContextConfiguration(locations={"secondDs.xml"})
    public class TestFooDaoUsingSecondDs extends TestFooDao {
    }
    

    除非您必须以这种方式处理大量不同的数据源,否则对我来说没问题。

    【讨论】:

    • 但是我有很多 daos Foo, Bar, ...(其中大约 15 个)因此有 15 个测试类 TestFooDao, TestBarDao,... 在您的解决方案中,我必须将数量增加一倍我不想要的类(我也不想将所有测试合并到一个巨大的类中)
    • 是的,我知道。但我真的没有看到任何更好的解决方案。正如我所说,我完全知道这个解决方案并不完美,而且有点糟糕。我刚刚想到的另一件事是尝试将 JUnit 的理论与 Spring 对上下文配置的命令式支持结合使用。这意味着您删除 Spring 上下文的基于注释的配置,并尝试通过调用某些方法以某种方式设置它。但是我不知道 Spring API 是否足够好,可以在这里给你一些参考或示例。我不确定这是否真的可行并且工作正常,但我只是想了一下。
    • 另一个想法:如果没有真正的开箱即用解决方案,可能扩展一点 Spring 测试支持类(如 SpringJUnit4ClassRunner 或一些帮助程序)将解决此问题。在我看来,您可以覆盖处理@ContextConfiguration 注释的一段代码并尝试实现自己的逻辑,可能使用一种接受指向多个上下文的参数的自定义注释。
    【解决方案2】:

    除了file:...,你可以使用classpath:...(去掉src/test/resources,如果你使用classpath,它是隐含的)。然后你可以有一个单一的主上下文与该行:

    <import resource="dao-${datasource}.xml" />

    如果您使用选项 -Ddatasource=foo 运行 Maven 构建,它将用您指定的任何内容替换主上下文中的 ${datasource}。因此,您可以使用datasource-foo.xmldatasource-bar.xml 等来满足您的不同配置。

    (您需要在 POM 中启用 Maven 资源过滤才能使其工作)。

    或者,查看 Spring 3.1 中的新内容:http://www.baeldung.com/2012/03/12/project-configuration-with-spring/

    编辑:第三种选择是让所有测试类扩展一些超类,并使用 Junit的@Parameterised,其中参数是不同的Spring上下文。在这种情况下你不能使用@ContextConfiguration,但你总是可以手动创建Spring上下文,然后使用org.springframework.beans.factory.config.AutowireCapableBeanFactory.autowireBean()自动装配测试类

    【讨论】:

    • 我想运行一次 maven 并测试两个数据源;在您的解决方案中,我需要运行它两次,传递数据源变量的两个值。是否可以在 maven surefire 插件中设置变量(例如定义两个执行或类似的)?目标是在运行 mvn test 时测试两个数据源
    • 是的,这有点痛苦。我多次运行故障安全/安全插件插件的运气并不好——它们往往会对输出文件夹等感到困惑。
    【解决方案3】:

    检查maven invoker plugin。它也支持配置文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多