こんにちは。KOUKIです。
とあるWeb系企業で、Goエンジニアをしています。
プログラムを実装するにあたり、テストは重要な立ち位置に存在します。Goでのプログラムの実装には慣れてきましたが、最近テストコードの実装は疎かにしているなと思い、復習がてらこの記事を書きました。
Goでのテストコードの書き方を一緒に復習しましょう!

<目次>
Go言語によるTDD
TDDとはテスト駆動開発のことを指します。プロダクトコードを実装する前にテストコードを書き、そのテストがクリアするようにプロダクトコードを実装することで綺麗でバグのないプログラムが書ける、といった手法です。
テストファイルの用意
テストファイルは、「XXXX_test.go」と名付けましょう。
1 2 |
touch main.go touch main_test.go |
テスト関数
テスト関数には「TestXXX」という命名規則があるので、ご注意を!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package main import "testing" func TestSum(t *testing.T) { input1 := 5 input2 := 6 expected := 11 res := sum(input1, input2) if res != expected { t.Errorf( "Our sum functions doesn't work, %d+%d isn't %d.\n", input1, input2, res) } } |
この関数は、2つの入力値(input1, input2)の合計(sum)をチェックするテストコードです。合計値に誤りがある場合は、テストは失敗します。
また、テストコードにはtestingパッケージを使用します。
プロダクトコードの実装
テストコードを実装したので、プロダクトコードを実装しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package main import ( "fmt" "os" "strconv" ) func sum(a, b int) int { return a + b } func main() { // terminalからの入力値はstring型 input1, _ := strconv.Atoi(os.Args[1]) input2, _ := strconv.Atoi(os.Args[2]) result := sum(input1, input2) fmt.Printf("The sum of %d and %d is %d.\n", input1, input2, result) } |
このコードは、terminalから与えた入力値の合計値を返します。
1 2 |
$ go run main.go 5 6 The sum of 5 and 6 is 11. |
テストコードの実行
テストコードを実行してみましょう。「go test」で実行できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# カレントディレクトリにあるテストを全て実行 $ go test PASS ok github.com/hoge/go-algorithms/tdd 0.473s # 他の子階層含めて全て実行 $ go test ./... ok github.com/hoge/go-algorithms/tdd 0.186s # 詳細情報を表示 $ go test -v === RUN TestSum --- PASS: TestSum (0.00s) PASS ok github.com/hoge/go-algorithms/tdd 0.440s # テストメソッドを指定 $ go test -run TestSum PASS ok github.com/hoge/go-algorithms/tdd 0.644s |
テストが失敗すると以下のような出力になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ go test --- FAIL: TestSum (0.00s) main_test.go:12: Our sum functions doesn't work, 5+7 isn't 12. FAIL exit status 1 FAIL github.com/hoge/go-algorithms/tdd 0.659s $ go test -v === RUN TestSum main_test.go:12: Our sum functions doesn't work, 5+7 isn't 12. --- FAIL: TestSum (0.00s) FAIL exit status 1 FAIL github.com/hoge/go-algorithms/tdd 0.198s |
テストカバレッジを表示する
テストカバレッジとは、対象の関数のテストがどれだけカバーされているかを示す指標です。
go testコマンドに「-cover」オプションを付けることで計測できます。
1 2 3 4 5 6 7 |
$ go test -cover --- FAIL: TestSum (0.00s) main_test.go:12: Our sum functions doesn't work, 5+7 isn't 12. FAIL coverage: 20.0% of statements exit status 1 FAIL github.com/hoge/go-algorithms/tdd 0.698s |
「coverage: 20.0% of statements」と表示されました
おわりに
「テストコードを制するものは、プログラミングを制す」
すみません、僕の格言です^^
しかし、馬鹿にできたものではありません。テストコードが実装してあると、プログラムを変更した時に既存の処理を壊していないかチェックできるので安心して開発業務に専念できます。
逆にテストコードを実装していないプロダクトを手渡されても「はぁ?」となりますねw
皆さんもテストコードは実装するようにしましょう!
それでは、また!
Go記事まとめ
ソースコード
main.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package main import ( "fmt" "os" "strconv" ) func sum(a, b int) int { return a + b } func main() { // terminalからの入力値はstring型 input1, _ := strconv.Atoi(os.Args[1]) input2, _ := strconv.Atoi(os.Args[2]) result := sum(input1, input2) fmt.Printf("The sum of %d and %d is %d.\n", input1, input2, result) } |
main_test.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package main import "testing" func TestSum(t *testing.T) { input1 := 5 input2 := 7 expected := 11 res := sum(input1, input2) if res != expected { t.Errorf( "Our sum functions doesn't work, %d+%d isn't %d.\n", input1, input2, res) } } |
コメントを残す
コメントを投稿するにはログインしてください。