[Go + Travis]Go言語でTDDを体験してみる


テスト駆動開発(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)テストを実行するように設定したり、など、
身につけるべきスキルはたくさんありますので少しずつ学んで最適な開発環境にしたいです。


Leave a Reply

Your email address will not be published. Required fields are marked *