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テストを自由に変更できます。

Source: https://habr.com/ru/post/J149063/


All Articles