開発をする上でテストを使って検証することは重要です。今回はそのテストを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に失敗していました。よかった!
これで自動テストの環境は整備できましたね。これからはテストが自動でできるので便利になりますね。