統合テスト用に H2 データベースを作成して使用したいとします。
Maven には、テストを実行するためのコマンドがあります: mvn test
.
テストのためにH2データベースサーバーを起動し、完了したら停止するようにmavenに指示する方法はありますか?
これは、Maven コマンド ( mvn tomcat:run
) を介して tomcat を実行する方法と同様に機能すると思います。
この質問が無意味な場合は申し訳ありませんが、私はまだ新しい概念に頭を悩ませています。
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 を使用する必要がありました。しかし、それはうまくいきます。
データベースを開始および停止するメイン メソッドを持つ 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>
それがあなたの望むものであることを願っています
このプラグインは、統合テスト (デフォルトのプラグイン フェーズ) の前に tcp モードで新しい H2 DB を生成するために正常に動作します: github の h2-maven-plugin
十分に文書化されていませんが、設定オプションを知るために Mojo ソースを確認できます。Maven Central で公開されています。
基本的に、統合テストの場合、Maven で次のことを行うことができます。
これは、次のような 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 から実行できるようになります。
私のプロジェクトでは、単体テストのために、このデータベースの作成と初期化を処理するように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コンテキストを開始する必要があります。
maven @ bitbucket の H2 プラグインのプロジェクトを開始しました。私はそれを助けていただければ幸いです。
https://bitbucket.org/dohque/maven-h2-plugin
それが役立つことを願っています。
メモリ内に作成したい場合は、別の 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
H2 は Maven プラグインを提供しないため、maven-antrun-plugin を使用して開始する必要があります。Ant タスクで h2 エンジンを開始および停止するためのコードを記述し、統合テストの開始および停止時にそれを呼び出します。
http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testingの詳細を参照してください。