LoginSignup
2
3

More than 5 years have passed since last update.

Goでテストを書く

Posted at

きほん

golangでテストを書く場合は以下のように書く。

main_test.go

package main

import "testing"

func TestHelloWorldを返すか確認するテスト(t *testing.T){
    get := foo()
    if get != "Hello World" {
        t.Errorf("foo() get = %s", get)
    }
}

いろいろなテストパターンを試す

これが一番シンプルな方法だが、いろいろなパターンを試したいときもある。
そのときは以下のように書く。

main_test.go

package cli

import (
    "testing"
)

func Test入力した英語の単語を日本語に変換できることを確認するテスト(t *testing.T) {
    type args struct {
        input string
    }
    tests := []struct {
        name    string
        args    args
        want    string
        wantErr bool
    }{
        {
           name: "ユーザーの入力「hello」を「こんにちは」に変換できることを確認する",
           args: args{
               input: "hello",
           },
           want: "こんにちは",
        },
        {
            name: "ユーザーの入力「world」を「世界」に変換できることを確認する",
            args: args{
                input: "world",
            },
            want: "世界",
        },
        {
            name: "ユーザーの入力「こんにちは」が入力されたときにエラーを返すことを確認する",
            args: args{
                input: "こんにちは",
            },
            want: "",
            wantErr: true,
        },
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            get, err := translate(tt.args.input)
            if wantErr && err == nil {
                t.Errorf("エラーが出力されていません: get = %s err = %v", get, err)
            }
            if !wantErr && get != tt.want) {
                t.Errorf("値が一致していません: get = %v, want = %v", get, tt.want)
            }
        })
    }




処理をまとめる

処理をまとめたいときはHelperを使う

example.go

package example
 import (
     "testing"
 )

 //こっちは出力されない
 func errorf(tb testing.TB, want, got int) {
     tb.Errorf("want = %d, got = %d", want, got)
 }

 //tb.Helper()を宣言しないと出力されない
 func errorfHelper(tb testing.TB, want, got int) {
     tb.Helper()
     tb.Errorf("want = %d, got = %d", want, got)
 }

前後に処理をはさむ

example.go

//テストの前後に処理を挟むにはTestMain(m *testing.M)を使う
 func TestMain(m *testing.M) {
     func() {
         fmt.Println("Prepare test")
     }()
     //m.Run()前後に処理を書くことでm.Run()を中心に処理が実行される。
     ret := m.Run()
     func() {
         fmt.Println("Teardown test")
     }()
     os.Exit(ret)
 }

間違いなどがあれば指摘していただければと思います!

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3