ls -al

仮想通貨やプログラミングに関する事などをつらつらと書き綴ります

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言語のテスト機能を触ってみることが出来ました。

参考

Qiita - Go言語のテスト方法初歩の初歩
Qiita - Goのプログラムをパッケージに分ける方法