sugiii8's tech blog.
post: 2021-12-14
update: 2023-01-05
INDEX

goでtest

thumbnail

メインで使ってるわけでな無いがGoを使う機会があり、ある程度実装はできてるものの、既存コードの見様見真似で書いてる箇所も多く不安が残る状態でした。
であればテストを書いて安心したいと思ってテスト書く作業を進めました。


サンプルコード

この記事ではサンプルとしてmainとmainから呼ばれる関数が1つあるコードを書きます。
関数についてはカバレッジの確認をしたいので分岐あるようにしておきます。

package main

import "fmt"

func main() {
  fmt.Println(Greet("hello"))
  fmt.Println(Greet("what's up"))
  fmt.Println(Greet("aaaaa"))
}

func Greet(name string) string {
  if name == "hello" {
    return "こんにちは"
  } else if name == "what's up" {
    return "調子どう"
  } else {
    return "やあ"
  }
}

この関数についてテストを書いていきます。

go testインストール

まずはテストツールをインストールします。
goのテストツールはいくつかありますが今回はgo test を使います。

go get -u github.com/cweill/gotests/...


テストコード出力

Greet関数についてのみ、ファイル出力します

gotests -only Greet -w .  


出力された雛形を確認します

package main

import "testing"

func TestGreet(t *testing.T) {
	type args struct {
		name string
	}
	tests := []struct {
		name string
		args args
		want string
	}{
		// TODO: Add test cases.
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := Greet(tt.args.name); got != tt.want {
				t.Errorf("Greet() = %v, want %v", got, tt.want)
			}
		})
	}
}


// TODO: Add test cases.


ここにテストケースを書いていきます。
テストデータの型も決まっているので楽です。
今回の場合はここ

  type args struct {
    name string
  }
  tests := []struct {
    name string
    args args
    want string
  }


name: テストケース名を書く
args: 実際にテストする関数に合わせて型が決まる。今回はname: string。
want: 期待値を書く

上記を踏まえると下記のようなテストケースを書きます。

    {
      name: "hello",
      args: args{
        name: "hello",
      },
      want: "こんにちは",
    },
    {
      name: "what's up",
      args: args{
        name: "what's up",
      },
      want: "調子どう",
    },
    {
      name: "else",
      args: args{
        name: "aaaaaaaa",
      },
      want: "やあ",
    },


go test実行

go test ./sample.go ./sample_test.go


結果が下記の様に出力されます

ok      command-line-arguments  0.301s


ちなみにテストケースが間違ってる場合は

    {
      name: "hello",
      args: args{
        name: "hello",
      },
      want: "グーテンモルゲン",
    },


このように出力されます。まあまあわかりやすい。

--- FAIL: TestGreet (0.00s)
    --- FAIL: TestGreet/hello (0.00s)
        sample_test.go:40: Greet() = こんにちは, want グーテンモルゲン
FAIL
FAIL    command-line-arguments  0.214s
FAIL


カバレッジ

カバレッジを取りたい場合はオプションをつけます

go test -cover ./sample.go ./sample_test.go                                                                                                 ✘ 1 
ok      command-line-arguments  0.244s  coverage: 62.5% of statements


カバレッジ見やすく

具体的にコードのどのパスを通ったか確認したい場合

go test -cover -coverprofile=cover.out ./sample.go ./sample_test.go 


出力されたcover.outからhtmlを出力

go tool cover -html=cover.out -o cover.html


これを確認するとhtmlでグラフィカルにテストカバレッジ状況が分かります。

終わり

以上です。
シンプルで使いやすいです!