🧪

【Go】Goのテストに入門してみた! ~スライスとマップの比較テスト編~

に公開

はじめに

前回は「一時ディレクトリの作成」を見ていきました。
今回は「スライスとマップの比較テスト」に入門します!

前回の記事はこちら!

この記事でわかること

  • Goの基底型の比較
  • Goの複合型の比較
  • 複合型の比較方法

基底型の比較

基底型とは、Goに組み込まれている基本的なデータ型のことを指します。
intstring などが基底型に該当します。
Goにおける基底型の比較には == を使います。
例えば、以下のように使うことができます。

main_test.go
package main

import (
	"testing"
)

func TestInt(t *testing.T) {
    a := 1
    b := 1
    if a != b {
        t.Error("check error")
    }
}

実行すると、以下のような結果が得られます。

ターミナル
# go test -v
=== RUN   TestInt
--- PASS: TestInt (0.00s)
PASS
ok      go-test-practice        0.342s

複合型の比較

複合型とは、複数の基底型を組み合わせた型を指します。
スライスマップなどが該当します。
Goにおける複合型の比較には == を使うことができません。
なぜなら、複合型はメモリの場所を覚えており、仮に値が同じスライスやマップでも、それぞれ別のメモリの場所に格納されているからです。

代わりに、reflect パッケージの DeepEqual() を使うことで比較できます。
例えば、スライスに関するテストだと以下のように実装することができます。

main_test.go
package main

import (
    "reflect"
    "testing"
)

func TestSlice(t *testing.T) {
    a := []int{1, 2, 3}
    b := []int{1, 2, 3}
    
    if !reflect.DeepEqual(a, b) {
        t.Errorf("expected %v, got %v", a, b)
    }
}

実行すると、以下のような結果が得られます。

ターミナル
# go test -v
=== RUN   TestSlice
--- PASS: TestSlice (0.00s)
PASS
ok      go-test-practice        0.353s

仮にテストに失敗すると、以下のような結果が得られます。

ターミナル
# go test -v
=== RUN   TestSlice
    main_test.go:13: expected [1 2 3], got [1 2 4]
--- FAIL: TestSlice (0.00s)
FAIL
exit status 1
FAIL    go-test-practice        0.232s

また、マップに関するテストだと以下のように実装することができます。

main_test.go
package main

import (
    "reflect"
    "testing"
)

func TestMap(t *testing.T) {
    m1 := map[string]int{"a": 1, "b": 2}
    m2 := map[string]int{"a": 1, "b": 2}
    
    if !reflect.DeepEqual(m1, m2) {
        t.Errorf("expected %v, got %v", m1, m2)
    }
}

実行すると、以下のような結果が得られます。

ターミナル
# go test -v
=== RUN   TestMap
--- PASS: TestMap (0.00s)
PASS
ok      go-test-practice        0.319s

仮にテストに失敗すると、以下のような結果が得られます。

ターミナル
# go test -v
=== RUN   TestMap
    main_test.go:13: expected map[a:1 b:2], got map[a:1 b:3]
--- FAIL: TestMap (0.00s)
FAIL
exit status 1
FAIL    go-test-practice        0.310s

まとめ

今回は「スライスとマップの比較テスト」について学びました。

  • 基底型は == で比較することができる
  • 複合型は == で比較することができない
  • 複合型で比較する場合は reflect.DeepEqual() を使う

次回は「構造体の比較テスト」に入門します!

参考

Discussion