標準テストの場合
package hoge_test
import (
"reflect"
"runtime"
"strings"
"testing"
)
func Test(t *testing.T) {
t.Run("足し算テスト", func(t *testing.T) {
Run(t, 卍1プラス1イコール2)
})
}
// Run [標準のテスト] 関数名を説明文として設定する処理
func Run(t *testing.T, f func(*testing.T)) {
fv := reflect.ValueOf(f)
funcFullName := runtime.FuncForPC(fv.Pointer()).Name()
list := strings.Split(funcFullName, ".")
funcName := list[len(list)-1]
t.Run(funcName, f)
}
// テスト本体 先頭の卍は、数字全角が先頭にくるとコンパイルエラーとなるための苦し紛れ
func 卍1プラス1イコール2(t *testing.T) {
actual := 1 + 2
expected := 2
if actual != expected {
t.Errorf("actual=%d, expected=%d", actual, expected)
}
}
実行結果
--- FAIL: Test (0.00s)
--- FAIL: Test/足し算テスト (0.00s)
--- FAIL: Test/足し算テスト/卍1プラス1イコール2 (0.00s)
hoge_test.go:33: actual=3, expected=2
FAIL
テストライブラリ:goblinを使った場合
package hoge_test
import (
"reflect"
"runtime"
"strings"
"testing"
"github.com/franela/goblin"
. "github.com/franela/goblin"
)
func Test(t *testing.T) {
g := Goblin(t)
g.Describe("足し算テスト", func() {
RunG(g, 卍1プラス1イコール2)
})
}
// RunG [goblinテスト] 関数名を説明文として設定する処理
func RunG(g *goblin.G, f func(g *goblin.G)) {
fv := reflect.ValueOf(f)
funcFullName := runtime.FuncForPC(fv.Pointer()).Name()
list := strings.Split(funcFullName, ".")
funcName := list[len(list)-1]
g.It(funcName, func() {
f(g)
})
}
// テスト本体 先頭の卍は、数字全角が先頭にくるとコンパイルエラーとなるための苦し紛れ
func 卍1プラス1イコール2(g *goblin.G) {
actual := 1 + 2
expected := 2
g.Assert(actual).Equal(expected)
}
実行結果
=== RUN Test
足し算テスト
1) 卍1プラス1イコール2
0 tests complete (0 ms)
1 tests failed:
1) 足し算テスト 卍1プラス1イコール2:
3 does not equal 2
/home/daijin/go/pkg/mod/github.com/franela/goblin@v0.0.0-20200825194134-80c0062ed6cd/assertions.go:67 +0x197
/home/daijin/src/testp/hoge_test.go:61 +0x9e
/home/daijin/src/testp/hoge_test.go:53 +0x2e
/home/daijin/go/pkg/mod/github.com/franela/goblin@v0.0.0-20200825194134-80c0062ed6cd/goblin.go:228 +0x24
/home/daijin/go/pkg/mod/github.com/franela/goblin@v0.0.0-20200825194134-80c0062ed6cd/goblin.go:351 +0x7f
/home/daijin/go/pkg/mod/github.com/franela/goblin@v0.0.0-20200825194134-80c0062ed6cd/goblin.go:228 +0x7b
/home/daijin/go/pkg/mod/github.com/franela/goblin@v0.0.0-20200825194134-80c0062ed6cd/goblin.go:225 +0x371
--- FAIL: Test (0.00s)
上記のようにはせず、普通に書く場合、タイトルと関数名の同じものを並んで2個書くことになり冗長。
日本語関数名だけセットすれば、それがタイトルになると良いなぁという感じで書きました。
githubにでも上げるか?とかおもったのですが、コード量少ないので、使うのであれば、テストのユーティリティにでも入れてもらえばと思います。
終わりに一言
TDD Boot Camp 2020 Online #1 基調講演/ライブコーディング
twadaさんのテスト駆動開発ライブコーディングで、Javaだと日本語でテスト書けていてうらやまだったので、Golangでも同じように出来ないか?頑張ってみたという感じでした。
先頭が数字から始まるとコンパイルエラーとなります。
Javaだとアンダーバーでしたが、Golangだと無理だったので適当な漢字(卍)を使ってみました。
余談ですが、シャープっぽく見える井口さんの井の字も候補でした。