日: 2019年4月5日

  • go言語でtestingを使ったunittestの方法

    go言語でtestingを使ったunittestの方法

    はじめに

    あらゆるプログラミング言語でunitテストという作業は必要だが、今回はそのgo言語版について説明する。

    今回はgoのデフォルトの “` testing “` を使い、ライブラリのテストを行うものとする。

    ディレクトリ構成

    $ tree
    .
    ├── library
    │   ├── Ave.go # ライブラリ
    │   └── Ave_test.go # ライブラリのテストプログラム
    └── main.go # 呼び出し元

    テスト対象

    library/Ave.go は以下の通り

    package library
    
    func Average(s []int) int {
    	total := 0
    	for _, i := range s {
    		total += i
    	}
    	return int(total / len(s))
    }

    受け取ったスライスを元に、平均を計算し、

    平均値を返す

    テストプログラム

    テストプログラムは

    “` import “testing” “`

    を行い、functionは 

    “` func TestAverage(t *testing.T) “`

    という名前で作成する必要がある。

    package library
    
    import "testing"
    
    func TestAverage(t *testing.T) {
    	v := Average([]int{1, 2, 3, 4, 5})
    	if v != 3 {
    		t.Error("Expected 3, got", v)
    	}
    }

    テストプログラムを実施する

    テスト実施コマンドはこちら

    “` go test ./… “`

    現在のディレクトリで全てのテストプログラムを実施するという意味。

     

    テスト結果(成功時のパターン)

    $ go test ./...
    ?       github.com/GitSumito/go-sample  [no test files] # testがありません
    ok      github.com/GitSumito/go-sample/library  0.009s

    libraryのテストが完了した

    詳細を確認する際は “` -v “` オプションを実施する

    $ go test ./... -v
    ?       github.com/GitSumito/go-sample  [no test files]
    === RUN   TestAverage
    --- PASS: TestAverage (0.00s)
    PASS
    ok      github.com/GitSumito/go-sample/library  0.008s

     

    テスト結果(失敗時のパターン)

    テストコードをあえて失敗するよう修正する

    package library
    
    import "testing"
    
    func TestAverage(t *testing.T) {
    	v := Average([]int{1, 2, 3, 4, 5, 6, 7, 8, 9})
    	if v != 3 {
    		t.Error("Expected 3, got", v)
    	}
    }

    再度テストを実行

    $ go test ./... -v
    ?       github.com/GitSumito/go-sample  [no test files]
    === RUN   TestAverage
    --- FAIL: TestAverage (0.00s)
            Ave_test.go:8: Expected 3, got 5
    FAIL
    FAIL    github.com/GitSumito/go-sample/library  0.008s

    テストをskipさせる

    Skipを使うことによりスキップさせることが可能

    package library
    
    import "testing"
    
    var Debug bool = true
    
    func TestAverage(t *testing.T) {
    
    	if Debug {
    		t.Skip("Skip Reason")
    	}
    
    	v := Average([]int{1, 2, 3, 4, 5, 6, 7, 8, 9})
    	if v != 3 {
    		t.Error("Expected 3, got", v)
    	}
    }

    結果

    $ go test ./... -v
    ?       github.com/GitSumito/go-sample  [no test files]
    === RUN   TestAverage
    --- SKIP: TestAverage (0.00s)
            Ave_test.go:10: Skip Reason
    PASS
    ok      github.com/GitSumito/go-sample/library  0.009s

     参考情報

    本記事は、udemyの講座で得た情報をメモとしてまとめました。非常に濃厚な講義ですので、以下の講座を強くお勧めします。

    https://www.udemy.com/go-fintech/