40

統合テスト用に H2 データベースを作成して使用したいとします。

Maven には、テストを実行するためのコマンドがあります: mvn test.

テストのためにH2データベースサーバーを起動し、完了したら停止するようにmavenに指示する方法はありますか?

これは、Maven コマンド ( mvn tomcat:run) を介して tomcat を実行する方法と同様に機能すると思います。

この質問が無意味な場合は申し訳ありませんが、私はまだ新しい概念に頭を悩ませています。

4

9 に答える 9

20

Maven 経由で H2 に依存関係を追加し、この Bean を使用するだけで、外部サーバーを使用せずに動作させることができました。

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.h2.Driver"/>
    <property name="url" value="jdbc:h2:file:h2\db"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>        
</bean>

繰り返しになりますが、これにはインメモリではなくファイルベースの DB を使用する必要がありました。しかし、それはうまくいきます。

于 2010-02-08T06:53:57.817 に答える
12

データベースを開始および停止するメイン メソッドを持つ 2 つの小さなクラスを作成できます。アイデアは、統合テストが実行される前に StartServer クラスを実行し、テストが実行された後に StopServer クラスを実行することです。

このドキュメントのどこかで説明されているように、DB サーバーに対して同じことを行う必要があります(説明は、統合テストで Jetty を開始および停止するためのものです)。

pom.xml で、maven-exec-plugin を定義してexec:javaゴールを実行し、2 つの実行を作成する必要があります (1 つは StartServer の呼び出し用、もう 1 つは StopServer の呼び出し用)。

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>1.1.1</version>
  <executions>
    <execution>
      <!-- start server before integration tests -->
      <id>start</id>
      <phase>pre-integration-test</phase>
      <goals>
        <goal>java</goal>
      </goals>
      <configuration>
        <mainClass>com.foo.StartServer</mainClass>
      </configuration>
     </execution>
     <execution>
      <!-- stop server after integration tests -->
      <id>stop</id>
      <phase>post-integration-test</phase>
      <goals>
        <goal>java</goal>
      </goals>
      <configuration>
        <mainClass>com.foo.StopServer</mainClass>
      </configuration>
     </execution>
   </executions>
 </plugin>

それがあなたの望むものであることを願っています

于 2010-02-05T13:24:27.350 に答える
8

このプラグインは、統合テスト (デフォルトのプラグイン フェーズ) の前に tcp モードで新しい H2 DB を生成するために正常に動作します: github の h2-maven-plugin

十分に文書化されていませんが、設定オプションを知るために Mojo ソースを確認できます。Maven Central で公開されています。


基本的に、統合テストの場合、Maven で次のことを行うことができます。

  • Tomcat サーバーと H2 用に、ランダムに使用可能なネットワーク ポートを予約します (ポートの競合を避けるため)。
  • H2 サーバーを起動する
  • Tomcat サーバーを起動する
  • 統合テストを実行する
  • Tomcat サーバーを停止する
  • H2 サーバーを停止する

これは、次のような Maven 構成で実現できます。統合テストにカスタム インターフェース JUnit カテゴリで注釈が付けられていると仮定します。

@Category(IntegrationTest.class)

このMaven構成は私にとってはうまくいきます:

<profile>
   <id>it</id>
   <build>
     <plugins>

       <!-- Reserve randomly available network ports -->
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>build-helper-maven-plugin</artifactId>
         <executions>
           <execution>
             <id>reserve-network-port</id>
             <goals>
               <goal>reserve-network-port</goal>
             </goals>
             <phase>process-resources</phase>
             <configuration>
               <portNames>
                 <portName>tomcat.test.http.port</portName>
                 <portName>h2.test.tcp.port</portName>
               </portNames>
             </configuration>
           </execution>
         </executions>
       </plugin>


       <!-- Start H2 before integration tests, accepting tcp connections on the randomly selected port -->
       <plugin>
         <groupId>com.edugility</groupId>
         <artifactId>h2-maven-plugin</artifactId>
         <version>1.0</version>
         <configuration>
           <port>${h2.test.tcp.port}</port>
         </configuration>
         <executions>
             <execution>
               <id>Spawn a new H2 TCP server</id>
               <goals>
                 <goal>spawn</goal>
               </goals>
             </execution>
             <execution>
               <id>Stop a spawned H2 TCP server</id>
               <goals>
                 <goal>stop</goal>
               </goals>
             </execution>
           </executions>
       </plugin>


       <!-- Start Tomcat before integration tests on the -->
       <plugin>
         <groupId>org.apache.tomcat.maven</groupId>
         <artifactId>tomcat7-maven-plugin</artifactId>
         <configuration>
           <systemProperties>
             <spring.profiles.active>integration_tests</spring.profiles.active>
             <httpPort>${http.test.http.port}</httpPort>
             <h2Port>${h2.test.tcp.port}</h2Port>
           </systemProperties>
           <port>${http.test.http.port}</port>
           <contextFile>src/main/java/META-INF/tomcat/webapp-test-context-using-h2.xml</contextFile>
           <fork>true</fork>
         </configuration>
         <executions>
           <execution>
             <id>run-tomcat</id>
             <phase>pre-integration-test</phase>
             <goals>
               <goal>run</goal>
             </goals>
           </execution>
           <execution>
             <id>stop-tomcat</id>
             <phase>post-integration-test</phase>
             <goals>
               <goal>shutdown</goal>
             </goals>
           </execution>
         </executions>
         <dependencies>
           <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>${mysql.version}</version>
           </dependency>
           <dependency>
             <groupId>com.h2database</groupId>
             <artifactId>h2</artifactId>
             <version>${h2.version}</version>
           </dependency>
         </dependencies>
       </plugin>


       <!-- Run the integration tests annotated with @Category(IntegrationTest.class) -->
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-failsafe-plugin</artifactId>
         <!-- Bug in 2.12.x -->
         <version>2.11</version>
         <dependencies>
           <dependency>
             <groupId>org.apache.maven.surefire</groupId>
             <artifactId>surefire-junit47</artifactId>
             <version>2.12.4</version>
           </dependency>
         </dependencies>
         <configuration>
           <groups>com.mycompany.junit.IntegrationTest</groups>
           <failIfNoTests>false</failIfNoTests>
           <junitArtifactName>junit:junit-dep</junitArtifactName>
           <systemPropertyVariables>
             <httpPort>${tomcat.test.http.port}</httpPort>
             <h2Port>${h2.test.tcp.port}</h2Port>
           </systemPropertyVariables>
         </configuration>
         <executions>
           <execution>
             <goals>
               <goal>integration-test</goal>
             </goals>
           </execution>
         </executions>
       </plugin>

     </plugins>
   </build>
 </profile>

ポートが置き換えられるように、Tomcat コンテキスト ファイルで maven フィルターを使用することができます。

   <contextFile>src/main/java/META-INF/tomcat/webapp-test-context-using-h2.xml</contextFile>

ファイルの内容は次のとおりです。

  <Resource name="jdbc/dataSource"
            auth="Container"
            type="javax.sql.DataSource"
            maxActive="100"
            maxIdle="30"
            maxWait="10000"
            username=""
            password=""
            driverClassName="org.h2.Driver"
            url="jdbc:h2:tcp://localhost:${h2.test.tcp.port}/mem:db;DB_CLOSE_ON_EXIT=FALSE;MODE=MySQL"/>

または、JNDI データソースが必要ない場合は、同じプロパティを使用して、Spring で宣言された dataSource を使用できます...


統合テスト tomcat をセットアップし、IDE から統合テストを実行できるようにする場合は、さらに 1 回:

プロパティを使用して、Tomcat サーバーを fork するかどうかを指定できます。

<fork>${integrationTestsForkTomcatJvm}</fork>

fork=false を設定すると、サーバーがブロックされて Maven が続行されなくなるため、統合テストは実行されませんが、IDE から実行できるようになります。

于 2013-04-19T08:28:36.550 に答える
5

私のプロジェクトでは、単体テストのために、このデータベースの作成と初期化を処理するようにSpringに依頼しました。H2ドキュメントに記載されているように、そのためのBeanを作成できます。

<bean id = "org.h2.tools.Server"
    class="org.h2.tools.Server"
    factory-method="createTcpServer"
    init-method="start"
    destroy-method="stop">
    <constructor-arg value="-tcp,-tcpAllowOthers,true,-tcpPort,8043" />
</bean>

単体テストを開始するときは、この構成でSpringコンテキストを開始する必要があります。

于 2010-02-05T07:13:59.423 に答える
5

maven @ bitbucket の H2 プラグインのプロジェクトを開始しました。私はそれを助けていただければ幸いです。

https://bitbucket.org/dohque/maven-h2-plugin

それが役立つことを願っています。

于 2011-02-24T19:29:03.563 に答える
3

メモリ内に作成したい場合は、別の URL を使用してください。

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.h2.Driver"/>
    <property name="url" value="jdbc:h2:mem:db"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>        
</bean>

次のような追加のオプションを指定できます: ;DB_CLOSE_DELAY=-1

参照: http://www.h2database.com/html/features.html#in_memory_databases

于 2011-12-01T15:26:51.460 に答える
1

H2 は Maven プラグインを提供しないため、maven-antrun-plugin を使用して開始する必要があります。Ant タスクで h2 エンジンを開始および停止するためのコードを記述し、統合テストの開始および停止時にそれを呼び出します。

http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testingの詳細を参照してください。

于 2010-02-05T05:02:36.813 に答える