【问题标题】:Using different Spring properties for integration tests使用不同的 Spring 属性进行集成测试
【发布时间】:2011-03-05 19:46:24
【问题描述】:

我正在使用 Selenium 测试一个使用 Spring 开发的 Web 应用程序,以检查 Web 应用程序是否为用户显示正确的内容,以及他是否能够执行规范中的所有操作。

其他开发人员正在使用伪造的 Hibernate 内存数据库 (HSQLDB) 进行单元测试。显然,我必须使用程序使用的真实数据库进行测试。 Spring 应用程序上下文的 JDBC 参数由 Spring 在运行时(或用于构建 WAR 文件的编译时)加载。 Spring 使用 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer 找到的属性来为 webapp 和测试配置应用程序上下文,并且 XML 配置文件由测试和 webapp 共享。

属性需要根据 Maven 配置文件、单元测试或集成测试而有所不同。

我尝试了几种方法,但都没有成功:

  • 使用较低级别的 SQL 查询开发我自己的 DAO。这是真正的浪费时间和不得已而为之的解决方案。由于外键约束和数据库模型更改,并且考虑到应用程序有一组非常可靠(经过单元测试)的 DAO,这确实是最愚蠢的选择。
  • 使用 Maven 过滤器并在那里定义 JDBC 属性。问题是属性在主应用程序和单元测试之间共享,因为 tomcat:redeploy 目标包括单元测试。然后应用程序无法连接到真实数据库。
  • 在不同的文件夹中具有不同的属性。 Spring 根本不关心配置文件的 Surefire 配置中定义的附加资源,无论是 testResources 还是 resources。奇怪的是,这种方法非常适合在主应用程序中为每个环境设置不同的 JDBC 参数。我们在 src/main/resources 中有几个文件夹,其中包含覆盖 src/main/resources 中默认属性的属性。它对 src/test/resources 的工作方式不同。我什至不知道如何找到这种行为的原因。
  • 让 Spring 根据用户定义的 Maven 参数加载不同的属性文件。相同的属性用于主应用程序和单元测试。 Spring 在找不到属性文件时也会抱怨(强迫我创建包含空文件的目录只是为了完成构建)。

为什么当前的构建配置是开发人员配置文件(开发人员、测试服务器...)+测试配置文件(单元测​​试)同时激活并且属性不会相互覆盖?因为 Maven 会让 Spring 在启动单元测试时查看 src/test/resources 并在启动构建目标时查看 src/main/resources。不幸的是,没有像这样的集成测试的默认配置。

【问题讨论】:

    标签: java spring maven-2 integration-testing


    【解决方案1】:

    我们这样做的方式是根据变量选择属性文件,所以 spring 中的属性占位符如下所示:

    <context:property-placeholder location="classpath:db.${TARGET_ENV}.properties" />
    

    然后您可以选择将 TARGET_ENV 定义为环境变量或使用 -DTARGET_ENV=... 将其传递给 maven

    【讨论】:

    • 好吧,我(或者更确切地说是我的同事)最终做了这样的事情。
    【解决方案2】:

    对于单元测试,您可能拥有与生产环境中同名的属性文件,这将覆盖生产环境文件,因为它在类路径中较早。 例如您可能在src/main/resources/my.properties 拥有生产属性,在src/test/resources/my.properties 拥有用于单元测试的覆盖文件。

    最好的做法是拥有一个单独的属性文件,其中仅包含环境设置(主机/端口)和其他使用环境特定属性值的应用程序特定属性文件。然后环境特定文件是您需要更改的唯一文件。 对于集成测试,您还可能在类路径中有特定的属性文件。

    此外,生产工件中不应有特定于环境的设置。它们应该分开放置。

    您可以尝试的另一件事是使用 spring @Profiles。但是使用它们会在代码中添加一些非生产设置,这是一种不好的做法。

    【讨论】:

      猜你喜欢
      • 2019-08-17
      • 2018-02-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      相关资源
      最近更新 更多