Go言語のテスト機能を触ってみる
今回はGo言語のテスト機能を使ってみます。
まずはこちらの記事で紹介したソースコードをモジュール化してみます。
nem/knock_nem_api.go
package nem
import (
"encoding/json"
"io/ioutil"
"net/http"
)
type Heartbeat struct {
Code int `json:"code"`
Type int `json:"type"`
Message string `json:"message"`
}
func GetHeartbeat() (heartbeat Heartbeat,err error){
resp, err := http.Get("http://alice2.nem.ninja:7890/heartbeat")
if err != nil {
return heartbeat,err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return heartbeat,err
}
if err := json.Unmarshal(body, &heartbeat); err != nil {
return heartbeat,err
}
return heartbeat,nil
}
main.go
package main
import (
"fmt"
"./nem"
)
func main() {
if heartbeat,err := nem.Get_heartbeat();err!=nil{
fmt.Println(err)
}else{
fmt.Println(heartbeat)
}
}
nemパッケージを作成し、GetHeartbeat()を他ファイルに分割しました。
main.goを実行するとハートビートが表示されます(結果は割愛します)。
では、nem/knock_nem_api.goのGetHeartbeat()に対してテストを実装します。 完成したものがこちらです。
nem/knock_nem_api_test.go
package nem
import (
"testing"
)
func TestGetHeartbeat(t *testing.T) {
result, err := GetHeartbeat()
if err != nil {
t.Fatalf("failed test %#v", err)
}
if result.Message != "ok" {
t.Fatal("failed test")
}
}
このテストは常に対象のノードが生きていることを前提に作られているので
あまりよろしくはないかもしれません……
それはともかく、テストを作る際はGoの作法として、
- ファイル名は”<テスト対象のファイル>_test.go”とする
- テスト用の関数名は”Test<テスト対象の関数名>(t *testing.T)“とする
- testingパッケージをimportする
ということが守られなければなりません。
ここまでできれば、後はgo testコマンドでテストを実行することが出来ます。
実行結果は以下の通りになりました。(ディレクトリ名は一部変更しています)
PASS
ok _/C_/~~~/go_example/test/nem 0.759s
より詳細な結果を表示したい場合は、-vを付与することで関数ごとの実行及びその結果が確認できます。go test -vコマンドの実行結果は以下の通り。(ディレクトリ名は一部変更しています)
=== RUN TestGetHeartbeat
--- PASS: TestGetHeartbeat (0.54s)
PASS
ok _/C_/~~~/go_example/test/nem 0.604s
これでGo言語のテスト機能を触ってみることが出来ました。