1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【GitHub Actions】【Go】Goのテストに入門するついでにプルリクのテストの自動化と自動通知をやってみた

Last updated at Posted at 2023-03-19

まえがき

お久しぶりです。Fuseです
今回はGithub Actionsなる物に手を出してみました。
様々な処理を自動化して、いろいろ便利になるんだと聞き、いても立ってもいられなくなり筆を執ってみました。

ソースコード

解説

Go編

まずはテスト対象の関数を書く

テストの自動化をやってみる前にまずテスト対象の関数を作らねば話になりません。
まずは今回テストする関数であるAdd関数の仕様を考えてみます。

intのスライス を入力されると、値の合計int で返す。

その仕様をもとに出来上がったAdd関数がこちらになります。

calc.go
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関数を実装しましょう。

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つずつ実行する関数を作れば完成です。

この際、メインテストの関数名は必ずTestで始まり、
その後の1文字目は大文字か数字かアンダースコアにしましょう。
下の画像のように表示されていればOKです。
image.png

TestAdd関数
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 testと入力すると…
image.png

無事テストが完了し、このように表示されます。
image.png

ちなみに失敗したときの表示はこんな感じ。
image.png

最後に、go work init .とターミナルに入力し、workファイルを生成すれば完了です。

ここでworkファイルを生成しないと、GitHubでのビルドが失敗します。

GitHub編

ここからは、 GitHub Actions を使って、プルリクエストとmasterへのプッシュを自動でテストして通知する仕組みを使っていきたいと思います。


前準備

GitHubで作業する前に、通知を受け取る側であるDiscordでの設定を行います。
サーバ設定の連携サービスから新しいWebHooksを設定します。
image.png

アイコンはCHARATにて作成しました

このウェブフックURLは絶対に外部に漏らさないように気を付けてください。
悪意を持った人間がGitHubになりすましあなたのサーバーに投稿を行えてしまいます。

Discordでの作業が終わったら、いよいよGitHubでの作業に移ります。
ウェブフックURLを隠ぺいするために、Actions secrets and variablesにウェブフックURLを設定します。
image.png

GitHub Actionsはpublicリポジトリでは無料ですが、
privateリポジトリでは使用時間に応じ料金がかかります。

ワークフローを作る

コードを自動でビルドしてテストするワークフローを作りましょう。
といってもビルドしてテストするワークフローはGitHubの公式が提供してくれています。
image.png

これをちょっといじって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に届きました。
image.png
それが終わったら、テストが通らないとマージできないように、masterブランチを保護するように設定します。
image.png
image.png
image.png

設定を終えてもう一度プルリクを立ててみると、ちゃんとテストが終わるまでプルリクがマージできないようになりました!
image.png

あとがきと感想

最後の方は駆け足になってしまいましたが、これにて完成です!
軽い気持ちで触れてみましたが、自動テストで開発がもっと便利になりそうです!

1
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?