まえがき
お久しぶりです。Fuseです
今回はGithub Actionsなる物に手を出してみました。
様々な処理を自動化して、いろいろ便利になるんだと聞き、いても立ってもいられなくなり筆を執ってみました。
ソースコード
解説
Go編
まずはテスト対象の関数を書く
テストの自動化をやってみる前にまずテスト対象の関数を作らねば話になりません。
まずは今回テストする関数であるAdd
関数の仕様を考えてみます。
intのスライス を入力されると、値の合計 を int で返す。
その仕様をもとに出来上がったAdd
関数がこちらになります。
package TestofTest
func Add(x []int) int { //intスライスの合計を返す
sum := 0 //合計を格納する変数
for _, v := range x { //スライスの中身を1つずつ取り出す
sum += v //加える
}
return sum //合計を返す
}
テストを書く
テストケースを作る
考えた仕様をもとに、テストケース をいくつか考えてみます。
args | want |
---|---|
(8,4) | 12 |
(2,3) | 5 |
(1,3,5) | 9 |
(1,2,3,4) | 10 |
テストケースを考えたら、それをテストケース用の構造体のスライスに起こします
type TestCase struct { //テストケース用構造体
identifier string//名前
args []int//入力値
want int//想定した出力
}
tc := []TestCase{
{"test01", []int{8, 4}, 12},
{"test02", []int{2, 3}, 5},
{"test03", []int{1, 3, 5}, 9},
{"test04", []int{1, 2, 3, 4}, 10}
}
サブテスト用関数の実装
テストケースを考えたら、今度は小さなテストである サブテスト を実装していきます。
構造体TestCase
にテストを実行するTesting
関数を実装しましょう。
func (c TestCase) Testing(t *testing.T) {//テストを行う関数
out := Add(c.args)//関数の出力値を取得
success := out == c.want//テストは成功か?
if success {//成功なら
fmt.Printf("Success want:%d out:%d\n", c.want, out)//ログを出す
} else {//失敗したら
t.Errorf("Failed want:%d out:%d\n", c.want, out)//失敗のログを出す
}
}
goのテストにてテストの失敗を通知するときはError
関数かErrorf
関数を使います。
Errorf
関数はPrintf
のようなもので、文の中に値を埋め込むことができ、便利です。
メインテスト用の関数の実装
最後に、配列化したテストケースを1つずつ実行する関数を作れば完成です。
func TestAdd(t *testing.T) {
tc := []TestCase{
{"test01", []int{8, 4}, 12},
{"test02", []int{2, 3}, 5},
{"test03", []int{1, 3, 5}, 9},
{"test04", []int{1, 2, 3, 4}, 10},
}
for _, v := range tc {
t.Run(v.identifier, v.Testing)
}
}
最後に、go work init .
とターミナルに入力し、workファイルを生成すれば完了です。
ここでworkファイルを生成しないと、GitHubでのビルドが失敗します。
GitHub編
ここからは、 GitHub Actions を使って、プルリクエストとmasterへのプッシュを自動でテストして通知する仕組みを使っていきたいと思います。
前準備
GitHubで作業する前に、通知を受け取る側であるDiscordでの設定を行います。
サーバ設定の連携サービスから新しいWebHooksを設定します。
アイコンはCHARATにて作成しました
このウェブフックURLは絶対に外部に漏らさないように気を付けてください。
悪意を持った人間がGitHubになりすましあなたのサーバーに投稿を行えてしまいます。
Discordでの作業が終わったら、いよいよGitHubでの作業に移ります。
ウェブフックURLを隠ぺいするために、Actions secrets and variables
にウェブフックURLを設定します。
GitHub Actionsはpublicリポジトリでは無料ですが、
privateリポジトリでは使用時間に応じ料金がかかります。
ワークフローを作る
コードを自動でビルドしてテストするワークフローを作りましょう。
といってもビルドしてテストするワークフローはGitHubの公式が提供してくれています。
これをちょっといじってWebHooksを使ってDiscordに通知する機能をくっ付けちゃいましょう。
# This workflow will build a golang project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go
name: Go
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
+ name: Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v3
with:
go-version: 1.19
- name: Build
run: go build -v ./...
- name: Test
run: go test -v ./...
+ notify:
+ runs-on: ubuntu-latest
+ needs: [build]
+ steps:
+ - name: notify to Discord
+ env:
+ SECRET_ENV: ${{ secrets.WEBHOOK_URL }}
+ run: curl $SECRET_ENV -i -H "Content-Type:application/json" -d '{"content":"プルリクエストが来てるみたいだね!"}'
WebHooksをつかってDiscordに投稿するには、JSONをURLにぶん投げます。
ワークフローを作ってプルリクを立てて、テストが通るとこんな感じの通知が無事Discordに届きました。
それが終わったら、テストが通らないとマージできないように、master
ブランチを保護するように設定します。
設定を終えてもう一度プルリクを立ててみると、ちゃんとテストが終わるまでプルリクがマージできないようになりました!
あとがきと感想
最後の方は駆け足になってしまいましたが、これにて完成です!
軽い気持ちで触れてみましたが、自動テストで開発がもっと便利になりそうです!