自動テストのテスト結果(JUnit.xml形式のファイル)の活用 - GitHub Commit StatusとSlack通知
はじめに
以前、次のような記事を書きました。
デバイスファームで出力されるテスト結果の話と、CI/CDサービスでどう活用するかという話です。
このテスト結果のJUnit.xml形式のファイルですが、CI/CDサービスではテストケース数を表示するのに利用しています。
BitriseのTest Reportsであれば次のような感じです。
しかし、私としてはCI/CDサービスに直接見に行かなくても、どれぐらいテストが成功/失敗したかの結果を知りたいというのがありました。
というわけで、このJUnit.xml形式のファイルを自前でも活用してみました。
JUnit.xml形式からデータの取得
JUnit.xml形式の例としては、次のような感じです。
(※ただし、どのようなkey/valueがあるかは出力させているものによって変わる傾向があるため、1つ1つどういった感じに出力させているのかを確認する必要があります)
<?xml version='1.0' encoding='UTF-8' ?>
<testsuite name="" tests="2" failures="0" errors="0" skipped="0" time="4.041" timestamp="2020-05-16T02:13:23" hostname="localhost">
<properties />
<testcase name="typeTextInInput_clickButton_ChangesText" classname="com.example.android.testing.espresso.web.BasicSample.WebViewActivityTest" time="2.134" />
<testcase name="typeTextInInput_clickButton_SubmitsForm" classname="com.example.android.testing.espresso.web.BasicSample.WebViewActivityTest" time="1.38" />
</testsuite>
このファイルの中身を利用すれば、次のようなことがわかります。
- 成功、失敗したテストケース数
- かかった時間
そこで、グループでなにか中身を取得できる手段として楽なのが無いかを聞いたところ、同僚が作っている次のライブラリを紹介してもらいました。
これを利用し、json化をしてからjqを利用して必要な値を取得しています。BitriseのStepで次のように書いています。
TOTAL_TEST_CASES=`npx junit2json "${JUNIT_XML_PATH}" | jq .testsuite[0].tests`
TOTAL_FAILURE_CASES=`npx junit2json "${JUNIT_XML_PATH}" | jq .testsuite[0].failures`
TOTAL_ERROR_CASES=`npx junit2json "${JUNIT_XML_PATH}" | jq .testsuite[0].errors`
TOTAL_SUCCESS_CASES=$((TOTAL_TEST_CASES-TOTAL_FAILURE_CASES-TOTAL_ERROR_CASES))
envman add --key TOTAL_TEST_CASES --value $TOTAL_TEST_CASES
envman add --key SUCCESS_TEST_CASES --value $TOTAL_SUCCESS_CASES
envman add --key FAILURES_TEST_CASES --value $TOTAL_FAILURE_CASES
envman add --key ERRORS_TEST_CASES --value $TOTAL_ERROR_CASES
JUNIT_XML_PATHは、そのままJUnit.xmlファイルまでのパスになります。
これによって、成功、失敗したテストケース数がわかるようになりました。
テスト結果の利用
このテストケース数を次の2箇所で利用するようにしました。
- GitHubのCommit Status
- Slack通知
GitHubのCommit Status
Bitriseでは、GitHub Statusのステップを利用して次のように設定をしています。
これにより、GitHubのCommit Statusに次のように表示されます(今回の例として私のtokenを使った例なのでアイコンが私になっています)。
これによって単にジョブが成功、失敗したのかだけでなくどのようなテストケース数だったのかもあとからわかるようにしています。
Slack通知
Bitriseでは、Slackのステップを利用して次のように設定しています。
これにより、次のようにSlack通知がきます。
おわりに
JUnit.xml形式のファイルが手に入れば、このようにかんたんに情報を取得して出すことができます。
今はこれぐらいしかしてないのですが、そのうち他の情報も活用したり、GitHubのCommit Statusに設定した値を履歴データとして活用しようかと思っています。
蛇足
BitriseのFirebase Test Labのステップ([BETA] iOS Device Testing)ではFirebase Test Labの成果物を次のステップでも利用できるようにDLすることができます。
ただし、DLをするとディレクトリ単位で分かれてはいません。
そのため、Result Bundleを利用したい場合はもとの形に戻す必要がありますが、JUnit.xml形式のファイルはそのまま利用することができます。