golang(Go言語)ではテストが標準で用意されており、テストコードを書くのが簡単ということで書いてみた。

まずはgoというフォルダを作成して、sample.goというファイルを作成してみた。


go
└── sample.go

ディレクトリ構造はこんな感じ。


sample.goに下記の様なランダムな文字列を作成して、作成した文字列をMD5でハッシュ化して表示するというコードを用意した。


package main

import (
	"fmt"
	"crypto/md5"
	"encoding/hex"
	"encoding/binary"
	"crypto/rand"
	"strconv"
)

func main() {
	str := MakeRandomString()
	str = Convert(str)
	fmt.Println(str)
}

//36文字のランダムな文字列を作成する
func MakeRandomString() string{
	var n uint64
	binary.Read(rand.Reader, binary.LittleEndian, &n)
	return strconv.FormatUint(n, 36)
}

//文字列をMD5でハッシュ化する
func Convert(str string) string{
	hasher := md5.New()
	hasher.Write([]byte(str))
	return hex.EncodeToString(hasher.Sum(nil))
}

このsample.goの各関数のテストコードを書いてみる。




テストコードを書くファイルは、対象ファイルと同階層に対象の「ファイル名 + _test.go」というファイルを作成する。


go
├── sample.go
└── sample_test.go

テスト用のgoファイルを作成したら、対象の関数名の前にTestという文字列を追加した関数を用意する。

この時の引数はt *testing.Tとする。


今回はConvert関数のテストコードを用意してみる。


package main

import(
	"testing"
	"fmt"
)

//Convertのテスト
func TestConvert(t *testing.T) {
	fmt.Println("\n・Check Convert Func")
	str := MakeRandomString()
	cov := Convert(str)
	if cov == "" || str == cov{
		t.Error("failed")
	}
}

Convert関数の返値はMD5でハッシュ化した文字列なので、返値が空文字、もしくはハッシュ化する前の文字列と同じであると間違いなので、


cov := Convert(str)
if cov == "" || str == cov{
	t.Error("failed")
}

if文で上記の条件を追加し、エラーの条件を満たしたら、t.Error("エラー時に表示する文字列")を追加する。

t.Errorが実行されたらエラーと見なされる。


これでテストコードは完成。


コマンドでgoフォルダまで移動し、go testを実行してみると、


~ /cygdrive/f/go
$ go test
PASS
ok      _/F_/go 1.552s

コードに問題なければ、PASSとokが表示され、


 /cygdrive/f/go
$ go test
--- FAIL: TestConvert (0.00s)
        sample_test.go:{行数}: failed
FAIL
exit status 1
FAIL    _/F_/go 1.294s

テストで引っかかると、FAILと表示される。


とりあえず、MakeRandomString関数の方もテストを書いてみる。


func TestMakeFandomString(t *testing.T) {
	rnd1 := MakeRandomString()
	rnd2 := MakeRandomString()

	//ランダムな文字列を二回生成して、同じ文字列だった場合はエラー
	if rnd1 == rnd2 {
		t.Error("failed")
	}
}