🧪

【Go】Goのテストに入門してみた! ~一部のテストをスキップ編~

に公開

はじめに

前回は「一部のサブテストを実行する方法」を見ていきました。
今回は「一部のテストをスキップする方法」に入門していきます!

前回の記事はこちら!
https://zenn.dev/tmyhrn/articles/bdef9d3d5ef218

この記事でわかること

  • t.Skip()t.Skipf() を使ってテストをスキップする方法
  • testing.Short()-shortフラグ を活用して重い処理を避ける方法
  • サブテスト単位で条件に応じてテストをスキップする方法

基本的なスキップの方法

main_test.go
package main

import (
    "testing"
    "time"
    "unicode/utf8"
)

func Length(s string) int {
    // 擬似的に高負荷処理を実行
    time.Sleep(30 * time.Second)
    return utf8.RuneCountInString(s)
}

func TestLength(t *testing.T) {
    if testing.Short() {
        t.Skip("スキップ")
    }
    if got := Length("Hello"); got != 5 {
        t.Errorf("Length(\"Hello\") = %d; want 5", got)
    }
}

以下のように実行すると、テストをスキップすることができます。

ターミナル
# go test -v -short

=== RUN   TestLength
    main_test.go:17: スキップ
--- SKIP: TestLength (0.00s)
PASS
ok      go-test-practice        0.349s

1. t.Skip()またはt.Skipf()でスキップする

テストをスキップするには t.Skip() または t.Skipf() を指定します。

2. testing.Short()の利用

テストの実行時間が長くなる場合、testing.Short() を用いることができます。
-shortフラグ を使うことで testing.Short() がtrueを返し、後続の処理(主にスキップ処理)を実行することができます。

3. その他の活用例

テストによっては特定のOSでは実行できないものもあります。
その場合も t.Skip() または t.Skipf() を使ってスキップすることができます。

サブテストでのスキップ

main_test.go
package main

import (
    "testing"
    "unicode/utf8"
)

func Length(s string) int {
    return utf8.RuneCountInString(s)
}

func TestLength(t *testing.T) {
    tests := []struct {
        name  string
        input string
        want  int
    }{
        {"ascii", "Hello", 5},
        {"full-width-japanese", "こんにちは", 5},
        {"half-width-japanese", "コンニチハ", 5},
        {"emoji", "😃😃😃", 3},
        {"empty", "", 0},
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            if tt.name == "emoji" {
                t.Skip("emojiをスキップ")
            }
            if got := Length(tt.input); got != tt.want {
                t.Errorf("Length = %d, want %d", got, tt.want)
            }
        })
    }
}
ターミナル
=== RUN   TestLength
=== RUN   TestLength/ascii
=== RUN   TestLength/full-width-japanese
=== RUN   TestLength/half-width-japanese
=== RUN   TestLength/emoji
    main_test.go:27: emojiをスキップ
=== RUN   TestLength/empty
--- PASS: TestLength (0.00s)
    --- PASS: TestLength/ascii (0.00s)
    --- PASS: TestLength/full-width-japanese (0.00s)
    --- PASS: TestLength/half-width-japanese (0.00s)
    --- SKIP: TestLength/emoji (0.00s)
    --- PASS: TestLength/empty (0.00s)
PASS
ok      go-test-practice        0.190s

# 「emoji」というサブテストが「SKIP」されていることがわかる

まとめ

今回は「一部のテストをスキップする方法」について学びました。

  • t.Skip()t.Skipf() を使うことで、特定の条件下でテストの実行を制御できる
  • testing.Short()-shortフラグ を組み合わせることで、負荷の高い処理を省略できる
  • テーブル駆動テストと組み合わせれば、サブテスト単位で柔軟にスキップ処理が書ける

次回は、「テストの前処理・後処理」に入門します!

参考

https://pkg.go.dev/testing#hdr-Skipping
https://future-architect.github.io/articles/20250509a/#テストをスキップしたい
https://zenn.dev/y_yuita/articles/6605cf2af61f33#テストのスキップ
https://zenn.dev/canary_techblog/articles/2c11335be49f84#17.--short
https://golang.hateblo.jp/entry/golang-testing

Discussion