go testの出力を見やすくするツール作ったった

  • 3
    いいね
  • 0
    コメント

go test してますか。
標準テストライブラリの出力を見やすくするツール richgo を作ったので、紹介をば。

TL;DR

Goには公式でリッチなテストフレームワークがないですね。
思想[1][2]は好きなんですが、とはいえ出力の見づらさはなんとかならんものか・・・。
あまりにも見づらいので、go をラップして、 test の出力を無理やり色付けするツールを作りました。

richgo

使うと、こんな感じになります。
asciicast

インストール方法

おなじみ go get

go get -u github.com/kyoh86/richgo

使い方

richgo test ./...

他の機能を阻害することはないので go のエイリアスとしてしまうのがおすすめです。

alias go=richgo
go test ./...

スタイルの設定変更

設定ファイルでスタイルを変えることもできます。
実行時に、次の順番で設定ファイルを読む仕様になっています。

  • ${CWD}/.richstyle
  • ${CWD}/.richstyle.yaml
  • ${CWD}/.richstyle.yml
  • ${GOPATH}/.richstyle
  • ${GOPATH}/.richstyle.yaml
  • ${GOPATH}/.richstyle.yml
  • ${GOROOT}/.richstyle
  • ${GOROOT}/.richstyle.yaml
  • ${GOROOT}/.richstyle.yml
  • ${HOME}/.richstyle
  • ${HOME}/.richstyle.yaml
  • ${HOME}/.richstyle.yml

環境変数に RICHGO_LOCAL=1 とすれば、カレントディレクトリの設定ファイル(${CWD}/.richstyle*)だけを読み込むようになります。

設定ファイルのフォーマット

設定は、YAML形式で次のような形で記載します。
すべての項目は、設定しなければデフォルト/または先に読み込んだ設定ファイルの内容が反映されます。

# ラベルの見せ方
labelType: (long | short | none)

# ビルドログの見た目
buildStyle:
  # 出力しない
  hide: (true | false)
  # 太字
  bold: (true | false)
  # 淡い字、または細い字
  faint: (true | false)
  # 斜体
  italic: (true | false)
  # アンダーライン
  underline: (true | false)
  # 点滅(ゆっくり)
  blinkSlow: (true | false)
  # 点滅(はやい)
  blinkRapid: (true | false)
  # 前景色と背景色を入れ替える
  inverse: (true | false)
  # 前景色と背景色を同色にする
  conceal: (true | false)
  # 取り消し線を引く
  crossOut: (true | false)
  frame: (true | false)
  encircle: (true | false)
  # アッパーライン
  overline: (true | false)
  # 文字前景色
  foreground: (#xxxxxx | rgb(0-256,0-256,0-256) | rgb(0x00-0xFF,0x00-0xFF,0x00-0xFF) | (name of colors))
  # 文字背景色
  background: # Same format as `foreground`

# テスト開始ログの見た目
startStyle:
  # Same format as `buildStyle`

# テスト通過ログの見た目
passStyle:
  # Same format as `buildStyle`

# テスト失敗ログの見た目
failStyle:
  # Same format as `buildStyle`

# テストスキップログの見た目
skipStyle:
  # Same format as `buildStyle`

# テスト対象ファイル名の見た目
fileStyle:
  # Same format as `buildStyle`

# エラーログ行番号の見た目
lineStyle:
  # Same format as `buildStyle`

# 行ごと出力したくない行を、正規表現で指定
removals:
  - (regexp)

ログの種類

設定ファイルのフォーマットに書いたように、 richgo はテストの出力を一行ごとにカテゴライズして、
それぞれに独自のスタイルを設定しています。

  • ビルドログ

    • ビルドに失敗したりすると出るログ
    • 例:
      # github.com/kyoh86/richgo/sample/buildfail
      sample/buildfail/buildfail_test.go:6: t.Foo undefined (type testing.T has no field or method Foo)
      
  • テスト開始ログ

    • テスト関数の先頭や、 testing.T.Run の先頭で表示される、テスト名のログ
    • 例:
      === RUN   TestSampleOK/SubtestOK
      
  • テスト通過ログ

    • テストが通った時に表示されるログ
    • 例:
          ---PASS: TestSampleOK/SubtestOK
      
  • テスト失敗ログ

    • テストがコケた時に表示されるログ
    • 例:
      --- FAIL: TestSampleNG (0.00s)
      sample_ng_test.go:9: It's not OK... :(
      
  • テストスキップログ

    • テストを testing.T.Skip でスキップさせたり、テストファイル(*_test.go)がない時に表示されるログ
    • 例:
      --- SKIP: TestSampleSkip (0.00s)
      sample_skip_test.go:6:
      ?     github.com/kyoh86/richgo/sample/notest  [no test files]
      

ラベルの種類

各カテゴリのログには、左側にそれと分かるようにラベルを出力しています。
ラベルの見せ方も、次の3種類を選べます。

  • Long

    • Build: "BUILD"
    • Start: "START"
    • Pass: "PASS"
    • Fail: "FAIL"
    • Skip: "SKIP"
  • Short

    • Build: "!!"
    • Start: ">"
    • Pass: "o"
    • Fail: "x"
    • Skip: "-"
  • None
    ラベルを表示しません。

デフォルト設定値

labelType: long
buildStyle:
  bold: true
  foreground: yellow
startStyle:
  foreground: lightBlack
passStyle:
  foreground: green
failStyle:
  bold: true
  foreground: red
skipStyle:
  foreground: lightBlack
fileStyle:
  foreground: cyan
lineStyle:
  foreground: magenta

あとがき

goconvey のようにリッチな出力をしてくれるテストフレームワークもありますが、やはり testing パッケージだけで構成されたテストは見通しが良いものです。
アサーションばかりは辛いので、testifyassertrequire だけは使っていますが・・・。

richgo を使えば見た目の問題も解決できるので、ぜひ Go のポリシーに沿ったテストで素敵な Go ライフを。