開発をする上でテストを使って検証することは重要です。今回はそのテストをgithub actionsを使って自動で行うことに挑戦したので備忘録を残します。
ファイルを準備する
まずは今回テストする関数を用意します。
今回は簡単な例として、足し算を行うAdd
関数を用意しました。
// calc.go package main func Add(a, b int) int { return a + b }
次に早速テストを用意します。テストケースは5つほど用意します。
// calc_test.go package main import "testing" // TestAdd はAdd関数のテストを行う func TestAdd(t *testing.T) { testCases := []struct { name string a, b int expected int }{ {"Add 1 and 2", 1, 2, 3}, {"Add -1 and 1", -1, 1, 0}, {"Add 0 and 0", 0, 0, 0}, {"Add -5 and -3", -5, -3, -8}, {"Add 100 and 200", 100, 200, 300}, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { result := Add(tc.a, tc.b) if result != tc.expected { t.Errorf("Add(%d, %d) = %d; want %d", tc.a, tc.b, result, tc.expected) } }) } }
まずは念のためローカルで検証を行います。
$ go test ./... ok test 0.353s
test.ymlを用意
.github/workflows/test.yml
に以下の内容を記述します。
name: Go on: push: branches: [main] pull_request: branches: [main] jobs: build: name: Build runs-on: ubuntu-latest steps: - name: Set up Go uses: actions/setup-go@v2 with: go-version: "1.21" - name: Check out code into the Go module directory uses: actions/checkout@v2 - name: Get dependencies run: go get -v -t -d ./... - name: Test run: go test ./...
以上が終わればすべてリモートにpushを行います。
はい。無事にテストが実行されて通過しています
CIを失敗させる
次にテストが失敗するパターンを検証します。テストが失敗しててもCIが失敗になっていなかったら問題なのでね。
以下のように変更し、テストが失敗することを検証します。
{"Add 100 and 200", 100, 200, 500}, $ go test ./... --- FAIL: TestAdd (0.00s) --- FAIL: TestAdd/Add_100_and_200 (0.00s) calc_test.go:23: Add(100, 200) = 300; want 500 FAIL FAIL test 0.363s FAIL
ではこれをpushします。
そしてGitHub上で確認すると無事CIに失敗していました。よかった!
これで自動テストの環境は整備できましたね。これからはテストが自動でできるので便利になりますね。