festを使用していくつかの単体テストを作成しました。今度は、ヘッドレス システムで maven を使用して mvn my test を実行する必要があります。Xvfb を使用してテストを実行したいのですが、テストの前に Xvfb を開始し、すべてが完了したら停止するように maven を構成するのに助けが必要です。
3 に答える
とexec-maven-plugin
:
サーバーの起動用と停止用の 2 つの実行を定義する必要があります。これらの実行構成を適切な Maven フェーズと結び付ける必要があります。テスト フェーズの前に Xvfb を開始し、テスト フェーズの後に Xvfb を停止します。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<id>exec-at-test-compile</id>
<phase>test-compile</phase> <!-- runs right before 'test' -->
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>/home/anew/bin/manage-xvfb.sh</executable>
<arguments>
<argument>start</argument>
</arguments>
</configuration>
</execution>
<execution>
<id>exec-at-prepare-package</id>
<phase>prepare-package</phase> <!-- runs right after 'test' -->
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>/home/anew/bin/manage-xvfb.sh</executable>
<arguments>
<argument>stop</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
manage-xvfb.sh
スクリプトの内容は次のとおりです。
#!/bin/bash
XVFB_CMD="sudo /usr/bin/Xvfb :15 -ac -screen 0 1024x768x8"
function stop_xvfb {
XVFB_PID=`ps ax | pgrep "Xvfb"`
if [ "${XVFB_PID}" != "" ]; then
sudo kill ${XVFB_PID}
fi
}
if [ "${1}" == "start" ]; then
stop_xvfb
${XVFB_CMD} &
elif [ "${1}" == "stop" ]; then
stop_xvfb
fi
NOPASSWD
sudoers ファイルに設定する必要があることに注意してください。
実際、私はこのプラグイン構成を使用しています:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>start-xvfb</id>
<phase>process-test-classes</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo message="Starting xvfb ..." />
<exec executable="Xvfb" spawn="true">
<arg value=":1" />
</exec>
</tasks>
</configuration>
</execution>
<execution>
<id>shutdown-xvfb</id>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo message="Ending xvfb ..." />
<exec executable="killall">
<arg value="Xvfb" />
</exec>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
良い点は、( を使用して) バックグラウンド プロセスを取得し、スクリプトを記述しなくてもspawn = "true"
Xvfb プロセスを ( で) 強制終了できることです。killall
さらに、私のUbuntuディストリビューションでは、これを機能させるためにsudoersファイルに特別な設定をする必要はありません。
shutdown-xvfb の実行はテスト フェーズの最後に実行されますが、(ここに問題があります) テストが失敗した場合は実行されません。別のテストを再開したい場合、これは問題ではありません (古い Xvfb はまだ実行中で、新しいものは実行できませんが、これは問題ではありません) が、問題は、リソースが Xvfb によってまだビジー状態であることです。これの回避策は、maven-surefire-plugin の構成に追加testFailureIgnore = "true"
することですが、この方法では、一部のテストが失敗したかどうかを簡単に確認できません。
このジョブは、 selenium-maven-pluginを介して簡単に実行できます。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>selenium-maven-plugin</artifactId>
<executions>
<execution>
<id>setup-xvfb</id>
<phase>pre-integration-test</phase>
<goals>
<goal>xvfb</goal>
</goals>
</execution>
</executions>
</plugin>
残念ながら、このプラグインはまったくメンテナンスされていないようです。最近 からに移行したmojohaus プロジェクトの一部でした。誰もまだを github に移植していないようです。そのため、ソースとドキュメントは現在 mojohaus の github ページで利用できません。codehaus.org
github.com
selenium-maven-plugin
ただし、JAR はMaven Centralで入手でき、プラグインは引き続き使用できます。さらに構成パラメーターを検索する必要がある場合は、 github hereで利用可能なソースとサイトのフォークがあります。