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

`go test` してますか。
標準テストライブラリの出力を見やすくするツール [richgo](https://github.com/kyoh86/richgo) を作ったので、紹介をば。


# TL;DR

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

[richgo](https://github.com/kyoh86/richgo)

使うと、こんな感じになります。
<a href="https://asciinema.org/a/99292"><img src="https://asciinema.org/a/99292.png" alt="asciicast"></a>

# インストール方法

おなじみ `go get`

```
go get -u github.com/kyoh86/richgo
```

## 使い方

```sh
richgo test ./...
```

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

```zsh
# 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形式で次のような形で記載します。
すべての項目は、設定しなければデフォルト／または先に読み込んだ設定ファイルの内容が反映されます。

```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` はテストの出力を一行ごとにカテゴライズして、
それぞれに独自のスタイルを設定しています。

* ビルドログ
    * ビルドに失敗したりすると出るログ
    * 例： <pre><code># github.com/kyoh86/richgo/sample/buildfail
  sample/buildfail/buildfail_test.go:6: t.Foo undefined (type testing.T has no field or method Foo)</code></pre>

* テスト開始ログ
    * テスト関数の先頭や、 `testing.T.Run` の先頭で表示される、テスト名のログ
    * 例：<pre><code>=== RUN   TestSampleOK/SubtestOK</code></pre>

* テスト通過ログ
    * テストが通った時に表示されるログ
    * 例：<pre><code>    ---PASS: TestSampleOK/SubtestOK</code></pre>

* テスト失敗ログ
    * テストがコケた時に表示されるログ
    * 例：<pre><code>--- FAIL: TestSampleNG (0.00s)
  sample_ng_test.go:9: It's not OK... :(</code></pre>

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

### ラベルの種類

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

* Long
  * Build: "BUILD"
  * Start: "START"
  * Pass: "PASS"
  * Fail: "FAIL"
  * Skip: "SKIP"

* Short
  * Build: "!!"
  * Start: ">"
  * Pass: "o"
  * Fail: "x"
  * Skip: "-"

* None
  ラベルを表示しません。

### デフォルト設定値

```yaml
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` パッケージだけで構成されたテストは見通しが良いものです。
アサーションばかりは辛いので、[testify](https://godoc.org/github.com/stretchr/testify) の `assert` と `require` だけは使っていますが・・・。

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