LoginSignup
0
0

More than 3 years have passed since last update.

Golangのテストで関数名に日本語を使ってわかりやすくする方法

Last updated at Posted at 2020-11-27

標準テストの場合

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だと無理だったので適当な漢字(卍)を使ってみました。

余談ですが、シャープっぽく見える井口さんの井の字も候補でした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0