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