テスト駆動開発(TDD)に興味があり、Goのテストも勉強中でしたのでCIを利用してモダンな開発環境を試してみようと思いつきました。
DockerでGo環境を構築し、Githubでソース管理、Travis CIでテストを実行してTDDする、という構成で試してみます。
仕様するツール、サービス
- Docker
- Github
- Travis CI
ディレクトリ構成
.
|-- docker-compose.yml
|-- .travis.yml
|-- go.mod
|-- main.go
`-- samples
|-- sample.go
`-- sample_test.go
Docker
まずはdocker-composeでGo環境を作成します。
docker-compose.yml
version: '3'
services:
app:
image: golang:latest
container_name: go_container
tty: true
environment:
- GO111MODULE=on
volumes:
- ./:/go/src/app
working_dir: /go/src/app
$ docker-compose up -d
$ docker-compose exec app bash
これでGoが使用できる環境となりました。
テストを失敗させる
まずはテストを失敗させるところまで実装します。
今回はフィボナッチ数を求める関数を作成してテストしてみます。
sample_test.go
package samples
import "testing"
func TestFib(t *testing.T){
result := Fib(8)
expected := 21
if result != expected {
t.Fatal("failed")
}
}
8のフィボナッチ数は21なのでそれ以外の数値が返ってきた場合にはfailedとなるテストを作成しました。
テストが通るようにmain.goとsample.goも実装します。
main.go
package main
import (
"fmt"
"app/samples"
)
func main(){
fmt.Println(samples.Fib(10))
}
sample.go
package samples
func Fib(n int) int {
return n
}
現状は受け取ったintを返却しているだけなのでテストは失敗します。
ローカルで実行してみましょう。
$ go test -cover -v ./samples
=== RUN TestFib
--- FAIL: TestFib (0.00s)
sample_test.go:9: failed
FAIL
coverage: 100.0% of statements
FAIL app/samples 0.002s
sample_test.go:9 failed
となっているのでテストが失敗していることがわかります。
Travis CI
続いてTravisでのCI環境を作ってみます。
まずはTravisにアクセスしGithubアカウントと連携します。
アカウントが連携できるとリポジトリを選択できるので、今回使用するリポジトリにチェックをつけます。
次にTravisの設定ファイルを作成します。
.travis.yml
language: go
go:
- 1.12.5
install: true
script:
- env GO111MODULE=on go test -cover -v ./samples
内容はほぼ公式のコピペです。。。
これでTravisを使用する準備ができたので、変更をGithubにpushします。
pushが完了するとTravisでテストが実行され以下のように失敗が確認できます。
テストを成功させる
次にテストが成功するように関数を実装します。
sample.go
package samples
func Fib(n int) int {
switch(n){
case 0, 1:
return n
default:
return Fib(n-1) + Fib(n-2)
}
}
フィボナッチ数で調べるとこの数式が出てくるのでそれをそのまま実装した形です。
これをGithubにpushしてTravisを確認してみます。
テストの成功が確認できました。
まとめ
今回はDocker,Github,Travisを使用しましたが、この構成でもかなりシンプルな環境と思います。
本番環境にデプロイするためにKubernetesを利用したり、
Gitにpushする前に(pre-push)テストを実行するように設定したり、など、
身につけるべきスキルはたくさんありますので少しずつ学んで最適な開発環境にしたいです。