TeamCityでのjUnitテストのカスタム処理

TeamCityはオンザフライでjUnitをサポートし、テストの実行に特別な問題はありません。 ただし、標準サポートではすべてのユーザーケースがカバーされるわけではありません。 たとえば、テストがどの順序で合格するかを確認することはできません。 さらに、デフォルトをjUnitにすることは単に不可能なテストアーキテクチャの他のバリエーションがあります。 たとえば、ランタイムで実行するテストと実行しないテストを決定します。 また、テストを無視せずにTeamCityのレポートに出力します。



これは時々非常に混乱します。 Webサーバーをテストするためのテストが作成され、すべてが正常に機能する状況がありました。 しかし、どういうわけかWebサーバー自体が落ちました(テストにはWebサーバーを停止/開始するロジックがありませんでした)が、TeamCityレポートの一部のテストは成功としてマークされました(すべて無視されたものはリストにマークされています)。 当然のことながら、顧客は「What the ...」と言いました。

TeamCityサービスメッセージを使用するのは複雑なことではないようです。 しかし、TeamCityには、TestOutputのサービスメッセージが読み取られない公式のバグがあります。



1.メッセージ出力



便宜上、メッセージを表示するためのカスタムクラスを作成します。 コマンドをTeamCityに転送するには、コマンドを標準出力ストリームに送信する必要があります。

public class Log { public static void logTCTestSuiteStart( String message ) { System.out.println( "##teamcity[testSuiteStarted name='" + message + "']" ); } public static void logTCTestSuiteFinished( String message ) { System.out.println( "##teamcity[testSuiteFinished name='" + message + "']" ); } public static void logTCTestStart( String message ) { System.out.println( "##teamcity[testStarted name='" + message + "']" ); } public static void logTCTestFinished( String message ) { System.out.println( "##teamcity[testFinished name='" + message + "']" ); } public static void logTCTestFailed( String message, AssertionError e ) { System.out.println( "##teamcity[testFailed name='" + message + "' message='" + e.getMessage() + "']" ); } }
      
      







各テストグループは、「 testSuiteStarted 」および「 testSuiteFinishedコマンドを使用してTestSuiteブロックに配置する必要があります 。 各テストは「 testStarted 」で始まり、「 testFinished 」で終わる必要があります。 テストブロック内に ' testFailed 'コマンドがない場合、テストは成功したと見なされます。

TeamCity サポートされているサービスメッセージの詳細については、 こちらをご覧ください



2.簡単なテスト



これで、次のようなテストを作成できます。

 public class BasicTests1 { BasicTester tester = new BasicTester( {constructor_args} ); @BeforeClass public static void setUp() { tester.initialize(); } @Test public void orderedTestRun() throws Exception { Log.logTCTestSuiteStart( "Basic tests" ); tester.testOne(); tester.testTwo(); tester.testThree(); Log.logTCTestSuiteFinished( "Basic tests" ); } @AfterClass public static void tearDown() { tester.dispose(); } } public class BasicTester { protected {field1}; protected {field2}; protected {field3}; protected BasicTester( {class_fields} ); protected void testOne() { Log.logTCTestStart( "testOne" ); try { //test logic } catch( AssertionError e ) { Log.logTCTestFailed( "testOne", e ); } Log.logTCTestFinished( "testOne" ); } protected void testTwo() { Log.logTCTestStart( "testTwo" ); try { //test logic } catch( AssertionError e ) { Log.logTCTestFailed( "testTwo", e ); } Log.logTCTestFinished( "testTwo" ); } protected void testThree() { Log.logTCTestStart( "testThree" ); try { //test logic } catch( AssertionError e ) { Log.logTCTestFailed( "testThree", e ); } Log.logTCTestFinished( "testThree" ); } }
      
      







エラーを手動で報告するため、エラーをキャッチするのは理にかなっています。 そうでない場合、それらは単に無視され、testFailedコマンドを待たずにTeamCityはテストが成功したと見なします。



3. Antタスク



ここではすべてが標準です。 唯一のポイントは、 ' junit 'タスクに ' showoutput = "yes" 'を含める必要があることです。 これにより、TestsOuputは強制的に標準出力ストリームに出力されます。



4. TeamCityビルド設定



TeamCityはTestOutput junitからサービスコマンドを読み取らないため、junitテストの認識を完全に無効にする必要があります。 これを行うには、ビルド構成を開き、[ビルドパラメーター]タブに移動して、次のパラメーターを追加します。





以上です。 これで、TeamCityでjUnitテストを自由に変更できます。



All Articles