LoginSignup
4
1

More than 3 years have passed since last update.

sfdx force:source:deployで失敗したテスト結果を見やすく表示するワンライナー

Posted at

CIでテスト失敗した時に不便だったのでワンライナーで工夫してみた。 TL;DR

force:apex:test:runはテスト結果を見やすく表示してくれる

デフォルトだと --resultformat human で出力してくれます。参考: コマンドリファレンス

$ sfdx force:apex:test:run --tests HogeTest.test -w 10
=== Test Results
TEST NAME      OUTCOME  MESSAGE                                              RUNTIME (MS)
─────────────  ───────  ───────────────────────────────────────────────────  ────────────
HogeTest.test  Fail     System.AssertException: Assertion Failed: テスト失敗しました  12
                        Class.HogeTest.test: line 4, column 1

force:source:deployでテスト失敗したときは教えてくれない

--json以外に特に結果を出力するようなオプションが見当たりません。参考: コマンドリファレンス
--json指定するとめっちゃ長い結果JSONが出力されてテスト結果の場所を見つけるのが大変です。
force:source:deploy:reportしてもThe metadata deploy operation failed. くらいしか教えてくれません。
issueも立っていた https://github.com/forcedotcom/cli/issues/57

$ sfdx force:source:deploy -p "force-app/main/default/classes/HogeTest.cls" --testlevel RunSpecifiedTests --runtests HogeTest -w 10 --checkonly
Job ID | 0Af1y000002kGUICA2
SOURCE PROGRESS | ████████████████████░░░░░░░░░░░░░░░░░░░░ | 1/2 Files
$ sfdx force:source:deploy:report -i 0Af1y000002kGUICA2
Job ID | 0Af1y000002kGUICA2
SOURCE PROGRESS | ████████████████████░░░░░░░░░░░░░░░░░░░░ | 1/2 Files
ERROR running force:source:deploy:report:  The metadata deploy operation failed.

ワンライナー

--jsonの結果を見やすく加工してみます。
force:source:deploy --jsonの結果を > result.jsonというファイルに吐き出しています。

ワンライナーと言いつつ長いので見やすく改行しています。

if [ "$?" != "0" ]; then 
  cat result.json \
  | jq -r '.result.details.runTestResult.failures | if type=="array" then .[] else . end | [.name, .methodName, .message, .stackTrace] | @tsv' \
  | column -t -s $'\t' \
  | grep --color=auto -e '^.*$'
fi

Travis CI上での結果表示はこんな感じになります

image.png

解説

  • if [ "$?" != "0" ]; then: テストに成功するとforce:source:deployが終了コード0を返すので成功した場合は特に何もしません。

jqで結果のjsonをバラす

  • .result.details.runTestResult.failures: resultの中のdetailsの中の ...と辿っていきます。
  • if type=="array" then .[] else . end: 失敗が1つの場合はobject、複数の場合は配列で返ってくるというひどいフォーマットなので型で判定して結果をバラします
  • [.name, .methodName, .message, .stackTrace]: 欲しい属性だけを配列で取り出してレコード化
  • @tsv: 最後にタブ区切りにして標準出力で次のパイプに繋げます

参考: https://qiita.com/Nakau/items/272bfd00b7a83d162e3a

columnsコマンドで見やすく整形

  • column -t -s $'\t'

色を付ける

  • grep --color=auto -e '^.*$': CIの結果で目立つようにエラー結果を赤で表示します。
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1