いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-109 (go test 時に -tags を付けて実行するテストを制御)

概要

ちょっとしたTipsです。知ってると便利かもしれません。

go test する際などに

  • 普段常に実行するテストではないけど必要なテスト
  • 結構重いので毎回実行したくないテスト

などがあったりする場合に

-tags オプションを付けて、実行をON/OFF出来たりします。

やり方ですが、追加で行いたいテストたちを含めたテストファイルの先頭にビルドタグをつけます。

// +build extratests

package xxx

ビルドタグ付ける場合は以下の点に注意。

  • package宣言よりも前に書かないといけない
  • // の後に空白あける
  • ビルドタグとpackage宣言の間にブランクが一行以上必要

最後に go test 時に以下のようにオプションを付けます。

$ go test -v -tags=extratests ./...

-tags オプションを付けた場合のみ、該当のビルドタグが付いたテストが実行されます。

オプションを付けない場合、ビルドタグが付いたテストは実行されません。

サンプルについて

今回もサンプルはついでなので github にアップしてあります。良かったらご参照ください。

github.com

試してみる

テスト対象を用意

以下のようなクソ関数があったとします。

package calc

func Add(x, y uint32) uint64 {
    return uint64(x) + uint64(y)
}

テストを用意

普段実行するテストが以下とします。

package calc

import "testing"

func TestAdd(t *testing.T) {
    x := uint32(100)
    y := uint32(200)

    ans := Add(x, y)
    if ans != uint64(300) {
        t.Errorf("want: %d\tgot: %d\n", uint64(300), ans)
    }
}

追加テストで実行するテストを用意

普段は毎回実行対象じゃないけど、たまに実施したテストを用意

// +build extratests
//
// REFERENCES:
//   - https://medium.com/tech-at-wildlife-studios/testing-golang-code-our-approach-at-wildlife-6f41e489ff36
//
// このテストは go test にて -tags=extratests が指定された時だけ実行されます.
//
// buildコメントは、以下のルールに従わないといけない
//   - package よりも前に書く
//   - package の前に空行をあける
//

package calc

import (
    "testing"
    "time"
)

func TestSuperHeavy(t *testing.T) {
    time.Sleep(3 * time.Second)

    want := uint64(300)
    x := uint32(100)
    y := uint32(200)
    ans := Add(x, y)

    if ans != want {
        t.Errorf("want: %d\tgot: %d\n", want, ans)
    }

    time.Sleep(2 * time.Second)
}

ビルドタグを指定せずに実行

-tags オプションを指定せずに実行すると以下のようになります。

$ go clean -testcache
$ go test -v ./...
=== RUN   TestAdd
--- PASS: TestAdd (0.00s)
PASS
ok      github.com/devlights/go-test-tags-option/internal/calc  0.005s

ビルドタグを付けたテストファイルに定義されているテストは実行されていません。

ビルドタグを指定して実行

-tags オプションを指定して実行すると以下のようになります。

$ go clean -testcache
$ go test -v -tags=extratests ./...
=== RUN   TestSuperHeavy
--- PASS: TestSuperHeavy (5.00s)
=== RUN   TestAdd
--- PASS: TestAdd (0.00s)
PASS
ok      github.com/devlights/go-test-tags-option/internal/calc  5.017s

ビルドタグを付けたテストファイルに定義されているテストが実行されていますね。

参考情報

medium.com

stackoverflow.com

golang.org

おすすめ書籍

自分が読んだGo関連の本で、いい本って感じたものです。

Go言語による並行処理

Go言語による並行処理

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

  • 作者:松尾 愛賀
  • 発売日: 2016/04/15
  • メディア: 単行本(ソフトカバー)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com