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")
}
}




