TL; DR
CodeBuild のテストレポート生成コマンドは、 build または post_build シーケンスの commands セクションで指定しましょう。
そうしないと、テスト失敗時にテストレポートを表示してくれません。
はじめに
CodeBuild に、テストレポート機能がリリースされて久しいですね。
僕も、既にいくつか記事を書いていますが、テストカバレッジが表示できるようになり、使いやすさに拍車がかかりました。
- CodeBuildのテストレポート機能が一般公開されたから使ってケチつけてみた - Qiita
- CodeBuildのテストレポート機能でコードカバレッジレポートがサポートされたから、また使ってケチつけてみた - Qiita
そんな便利なテストレポート機能ですが、何度か使っていくうちに、とある現象に気付いたので、記述していきます。
テストレポート生成コマンドを指定できるのは build または post_build だけ?
ドキュメントに記載されている、次の文言を見つけました。
buildまたはpost_buildシーケンスのcommandsセクションで、レポートグループに対して指定したテストケースを実行するコマンドを指定します。
これが何を意味するのかというと、 buildspec.yml ファイルにおいて、次のように記述する必要があることを意味します。
つまり、 CodeBuild では、テストレポート生成コマンドである npm run test を、 build または post_build シーケンスの commands セクションで指定するように要求しているわけです。
version: 0.2
phases:
install:
commands:
- npm install
pre_build:
commands:
# この pre_build シーケンスではテストレポート生成コマンドを指定しない
- npm run test
build:
commands:
# この build シーケンスか、
- npm run test
post_build:
commands:
# この post_build シーケンスでテストレポート生成コマンドを指定する
- npm run test
しかし、テストレポート生成コマンドを pre_build シーケンスで指定しても、テスト成功時には CodeBuild のテストレポートに表示されます。
この現象は、単純にドキュメントの不備なのかと軽く思っていたのですが、別の問題で明らかになりました。
テストレポート生成コマンドを pre_build で指定するとテストレポートが表示されない
しばらくして、テストが失敗してしまうと、なぜか CodeBuild のテストレポートに表示されない問題にぶつかりました。
いろいろ試行錯誤した結果、どうやら pre_build では、テスト失敗時のテストレポートファイルを、 CodeBuild のテストレポート機能が読取ってくれないようです。
version: 0.2
phases:
install:
commands:
- npm install
pre_build:
commands:
# pre_build でテストが失敗すると、失敗結果がテストレポートとして読取ってくれない
- npm run test
build:
commands:
# build か post_build でテストが失敗すると、失敗結果がテストレポートとして読取ってくれる
- npm run test
テストレポートは、成功時であっても失敗時であっても表示してほしいため、テスト失敗時にテストレポートを表示しない事象に遭遇してしまった際は、非常に焦りました。
最初は npm run test 失敗結果(利用している Jest コマンドの失敗結果)である Error Code 1 に未対応なのかなーと、的外れなところを調べていました。
- node.js - npm error ELIFECYCLE while running the test - Stack Overflow
- npm ERR! code ELIFECYCLE if 1 test fails · Issue #7803 · facebook/jest
おわりに
少しは仕様書を信じようと思いました。