Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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 ライフを。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away