【问题标题】:Maven surefire plugin, setting and getting system properties during build lifecycleMaven surefire 插件,在构建生命周期中设置和获取系统属性
【发布时间】:2017-03-07 14:03:48
【问题描述】:

我正在尝试为集成测试提供并行 maven 测试执行。

在测试执行开始之前使用sql-maven-plugin创建一个测试数据库,结合maven surefire插件参数和并行执行,似乎是一个很好的开始方法。

我不明白的是如何使用surefire插件设置的系统属性,以及sql-maven-plugin(或任何其他插件)。我有一个设置失败。

surefire 插件配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <forkCount>2</forkCount>
        <reuseForks>true</reuseForks>
        <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
        <systemPropertyVariables>
            <databaseSchema>test_schema_${surefire.forkNumber}</databaseSchema>
        </systemPropertyVariables>
    </configuration>
</plugin>

sql-maven-plugin 配置:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>sql-maven-plugin</artifactId>
    <version>1.5</version>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector-java.version}</version>
        </dependency>
    </dependencies>
    <configuration>
        <driver>com.mysql.jdbc.Driver</driver>
        <username>user_with_create_privs</username>
        <password>password</password>
        <url>jdbc:mysql://localhost/dummy_schema</url>
    </configuration>
    <executions>
        <execution>
            <id>create-db</id>
            <phase>process-test-classes</phase>
            <goals>
                <goal>execute</goal>
            </goals>
            <configuration>
                <url>jdbc:mysql://localhost/dummy_schema</url>
                <autocommit>true</autocommit>
                <sqlCommand>create database ${databaseSchema}</sqlCommand>
            </configuration>
        </execution>
    </executions>
</plugin>

shell 执行:

mvn test

结果输出:

[DEBUG] SQL:  drop database ${databaseSchema}
[ERROR] Failed to execute:  drop database ${databaseSchema}
[ERROR] Failed to execute goal org.codehaus.mojo:sql-maven-plugin:1.5:execute
(create-db) on project billing-core: You have an error in your SQL syntax; check
the manual that corresponds to your MySQL server version for the right
syntax to use near '{databaseSchema}' at line 1 -> [Help 1]

所以,看起来 ${databaseSchema} 没有填充,或者是语法问题。我已经摆弄了,但无法让它工作,尽管它看起来很容易并且应该。

【问题讨论】:

  • 对于集成测试,你应该看看 Maven 故障保护插件。
  • Surefire 的systemPropertyVariables 将在创建执行测试的JVM 时设置系统属性。显然,当 Maven 尝试执行 sql-maven-plugin 时,该属性不是为 Maven 项目设置的属性。
  • @Tome 所以基本上 sql-maven-plugin 和 surefire 插件与我希望的方式不兼容?
  • 确实,在您的用例中,surefire 插件会在 sql-maven-plugin 需要它之后设置该属性。而且,它会为另一个 JVM 设置它。以 Java 为中心的解决方案是在测试代码中执行语句,在 @BeforeClass 方法(或类似方法)中,检索系统属性以创建适当的语句。
  • @Tome 感谢您的详细说明。我现在已经实现了一个抽象类,用于扩展依赖于 db 的测试,它处理休眠引导并使用(如果可用)由 surefire 设置的系统属性为每个分支创建唯一的模式名称。从 JUnit 扩展 RunListener 类,以在测试前后触发引导和删除 JUnit 事件。快到了,将测试,然后更新。

标签: java maven maven-surefire-plugin sql-maven-plugin


【解决方案1】:

您可能会混淆 Maven 的属性、Java 系统属性和环境变量。您似乎希望使用的变量看起来像 Maven 属性。

您可以在属性元素中定义 POM 中的属性。此外,您可以使用 ${env.PropertyName} 表单引用环境变量,使用 ${java.PropertyName} 表单引用 Java 系统属性。

您可以参考这里了解更多信息:https://maven.apache.org/pom.html#Properties

【讨论】:

  • 你是对的,我是。正如对我的问题的评论中提到的,我已经开始了另一种方法,它提供了更多的实施工作,但与我的问题相比,至少应该在理论上起作用。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 2012-02-14
  • 1970-01-01
  • 2010-10-07
相关资源
最近更新 更多