🧪
【Go】Goのテストに入門してみた! ~スライスとマップの比較テスト編~
はじめに
前回は「一時ディレクトリの作成」を見ていきました。
今回は「スライスとマップの比較テスト」に入門します!
前回の記事はこちら!
この記事でわかること
- Goの基底型の比較
- Goの複合型の比較
- 複合型の比較方法
基底型の比較
基底型とは、Goに組み込まれている基本的なデータ型のことを指します。
int
や string
などが基底型に該当します。
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