2010-01-22 55 views
3

我有一堆绑定到pre-integration-test阶段的SQL命令,其作用是创建一个“测试”数据库并将应用程序指向它。在命令行上运行目标的所有绑定实例

有时,我只想“重建”我的测试数据库,而没有生命周期中的所有其他东西。例如,如果我的测试是灾难性的失败并且搞砸了测试数据库,那么我可能需要重建几次,直到我找出问题所在。

这里是我的POM样子:

<profile> 
    <id>test-setup-teardown</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.codehaus.mojo</groupId> 
        <artifactId>sql-maven-plugin</artifactId> 
        <version>1.3</version> 

        <dependencies> 
         <dependency> 
          <groupId>${database-dependency-groupId}</groupId> 
          <artifactId>${database-dependency-artifactId}</artifactId> 
          <version>${database-dependency-version}</version> 
         </dependency> 
        </dependencies> 

        <configuration> 
         <url>${test-database-admin-url}</url> 
         <username>${test-database-admin-username}</username> 
         <password>${test-database-admin-password}</password> 
         <driver>${database-driver}</driver> 
         <autocommit>true</autocommit> 
        </configuration> 

        <executions> 
         <execution> 
          <id>test-database-pre-setup</id> 
          <phase>pre-integration-test</phase> 
          <goals> 
           <goal>execute</goal> 
          </goals> 
          <configuration> 
           <sqlCommand>${test-database-teardown}</sqlCommand> 
           <onError>continue</onError> 
          </configuration> 
         </execution> 

         <execution> 
          <id>test-database-setup</id> 
          <phase>pre-integration-test</phase> 
          <goals> 
           <goal>execute</goal> 
          </goals> 
          <configuration> 
           <sqlCommand>${test-database-setup}</sqlCommand> 
          </configuration> 
         </execution> 

         <execution> 
          <id>test-database-schema</id> 
          <phase>pre-integration-test</phase> 
          <goals> 
           <goal>execute</goal> 
          </goals> 
          <configuration> 
           <url>${test-database-url}</url> 
           <username>${database-user}</username> 
           <password>${database-password}</password> 
           <srcFiles> 
            <srcFile>${basedir}/metadata/build/database/${database-engine}/appx.sql</srcFile> 
           </srcFiles> 
          </configuration> 
         </execution> 

         <execution> 
          <id>test-database-teardown</id> 
          <phase>post-integration-test</phase> 
          <goals> 
           <goal>execute</goal> 
          </goals> 
          <configuration> 
           <sqlCommand>${test-database-teardown}</sqlCommand> 
          </configuration> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 

我怎样才能运行这个文件的所有执行?像mvn sql:execute只能运行其中一个执行(我认为最后一个)。

我试图使绑定阶段是一个属性,然后允许用户指定其他配置文件其更改默认从pre-integration-testvalidate,但为什么重建的执行正是如此解释给别人:

mvn validate -Pforce-rebuild,test-setup-teardown 

只是强制实施非玩具项目在POM中有很多魔力的事实。请给我指路!

<ed>也许一个好的解决方案是从命令行通过id运行执行的一种方法? </ed >

回答

1

也许一个很好的解决办法是通过ID在命令行中运行执行的方法吗?

这是不可能的。执行是为了绑定到生命周期。

,并呼吁sql:execute并通过在命令行上所有参数似乎并没有成为一个可行的选择(这可能是在一个批处理脚本完成,但会有与srcFiles可选参数的问题反正)。

所以,在我看来,“少雪上加霜”的办法是复制(叹气)其他配置文件中的sql-maven-plugin设置,例如rebuild,结合对validate阶段所需的执行,并宣告validate目标作为此配置文件中的默认目标。这将允许像这种类型的东西:

mvn -Prebuild 

也许一些优化是可能的,以避免重复(由variablelizing执行阶段像你这样),但是这意味着更多的黑魔法我(这可能不是理想的)。

+0

良好的默认目标调用。我也不喜欢重复,但同意这可能是最差的解决方案。谢谢! – 2010-01-28 15:36:09

0

“预集成测试”是您可以直接调用的阶段。

mvn -Ptest-setup-teardown pre-integration-test 

这仍然会经过编译的生命周期,复制资源,单元测试等,您可以尝试添加-DskipTests=true到命令(不知道这是否会跳过集成测试阶段太):

mvn -Ptest-setup-teardown pre-integration-test -DskipTests=true 
+2

我特别试图避免经历生命周期,因为它需要3-4分钟才能进行预集成测试。我已经尝试将所有插件添加到配置文件中,以便它们可以轻松关闭,但是当尝试进行分支行为时(例如有时执行此操作,有时执行此操作等),这会增加很多复杂性。 – 2010-01-22 22:17:29

+0

这种类型的任务听起来像是在maven之外完成的最好的任务类型,因为它实际上与构建主应用程序没有多大关系 – 2010-01-23 03:28:40

相关问题