1. pomu0325

    Posted

    pomu0325
Changes in title
+sfdx force:source:deployで失敗したテスト結果を見やすく表示するワンライナー
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,73 @@
+CIでテスト失敗した時に不便だったのでワンライナーで工夫してみた。 [TL;DR](#ワンライナー)
+
+# `force:apex:test:run`はテスト結果を見やすく表示してくれる
+
+デフォルトだと `--resultformat human` で出力してくれます。[参考: コマンドリファレンス](https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_force_apex.htm#cli_reference_test_run)
+
+```
+$ 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`以外に特に結果を出力するようなオプションが見当たりません。[参考: コマンドリファレンス](https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_force_source.htm#cli_reference_deploy)
+`--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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9490/1f8881cb-1b4b-1deb-757f-5e764b76b4cf.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の結果で目立つようにエラー結果を赤で表示します。
+