標準パッケージtestingでGoのユニットテストをしてみよう

Go言語
この記事は約7分で読めます。
Go初学者
Go初学者

Goの標準パッケージでユニットテストはできないんですか?

この記事ではGoの標準パッケージでのテストの基本を理解できます!
  • Goの標準パッケージ testing とは?
  • testing でユニットテストを実施するためのルール
  • testing で簡単なユニットテストを行う

Go言語の標準パッケージ testing でユニットテストを行うことができます。

今回は testing を使う際のルールや簡単なユニットテストを実施していきましょう。

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

Goの標準パッケージ・testingとは?

Go言語では testing という、ユニットテストをサポートするための標準パッケージが用意されており、Goをインストールしたら使用できます。

標準出力のテスト以外にも、ユニットテストのカバー率(カバレッジ)やベンチマークまでテストすることができるので、サードパーティ製を使用する前に、一度 testing でユニットテストを実施してみましょう。

testingでユニットテストを行う

今回のユニットテストは、パッケージ管理の記事で使用したものを利用していきます。

フォルダ構成は以下の通りです。

morip@morip-PC1:~/go/src/package$ tree
.
├── go.mod
├── main.go
└── myapp
    ├── myfunc.go
    └── myvar.go

テスト用のファイルを作成する

テスト用のファイルは、テストしたいファイル同階層に作成します。

ファイル名の付け方にはルールがあり、以下の通りです。

任意の名称_test.go

今回は myfunc.go をテストするので、テストファイルの名称を myfunc_test.go とします。

morip@morip-PC1:~/go/src/package$ tree
.
├── go.mod
├── main.go
└── myapp
    ├── myfunc.go
    ├── myfunc_test.go  // テスト用のファイル
    └── myvar.go
// myfunc.go

package myapp

// 平均値
func Ave(sl []int) int {
	sum := 0
	for _, v := range sl {
		sum += v
	}
	return int(sum / len(sl))
}

// 合計値(今回新たに追加)
func Sum(sl []int) int {
	sum := 0
	for _, v := range sl {
		sum += v
	}
	return int(sum)
}

myfunc_test.go のファイル下記のように記述しました。

// myfunc_test.go

package myapp

import "testing"

var Debug bool = false

func TestAve(t *testing.T) {
    if Debug {
        t.Skip("テストをスキップします")
    }

    v := Ave([]int{10, 20, 30, 40, 50})

    if v != 30 {
        t.Errorf("テストの値は%vで %v ではありません", v, 30)
    }
}

テストファイル作成の流れを確認する

それでは myfunc_test.go の内容を詳細に確認していきましょう。

テストファイル myfunc_test.go の内容を確認!
  • STEP1
    パッケージ宣言
    package myapp

    テスト元と同じパッケージ名で

  • STEP2
    標準パッケージをインポートする
    import "testing"

  • STEP3
    テストを実施するか?しないか?
    var Debug bool = false

    false でテスト実施
    true でテストをスキップ

  • STEP4
    テスト実施するための設定
    func TestAve(t *testing.T) {
        // テストを実施するかスキップするかを判定
        if Debug {
            t.Skip("テストをスキップします")
        }
    
        // 関数を実行
        v := Ave([]int{10, 20, 30, 40, 50})
    
        // 求められる値と違う時はエラーメッセージを返す
        if v != 30 {
            t.Errorf("テストの値は%vで %v ではありません", v, 30)
        }
    }

    テストする関数を TestXxxx と表記するのがルール Testxxxx はNG

  • STEP5
    テスト実施
    morip@morip-PC1:~/go/src/package/myapp$ go test
    PASS
    ok      package/myapp   0.002s

    カレントディレクトリでテストを実施
    ファイル名は不要

    morip@morip-PC1:~/go/src/package/myapp$ go test -v
    === RUN   TestAve
    --- PASS: TestAve (0.00s)
    PASS
    ok      package/myapp   0.002s

    詳細なテスト結果を得たい時は -v を付ける

テストを実施するコマンドについて

今回はテストファイルがひとつしかありませんが、複数のテストファイルを一気に実行したい場合はパッケージのトップディレクトリで下記のコマンドを実施してください。

morip@morip-PC1:~/go/src/package$ go test -v ./...
?       package [no test files]  // packageフォルダにテストファイルが無い
=== RUN   TestAve
--- PASS: TestAve (0.00s)
PASS
ok      package/myapp   (cached)

go test -v ./...
-v は省略可

. が3つ必要ですので、間違いないようにしましょう。

テストを実行するカレントディレクトリに注意して、コマンド入力する必要があります。

テストのカバー率を確かめる

では、アプリ全体のテストカバー率を確かめます。

go test -cover ./...

morip@morip-PC1:~/go/src/package$ go test -cover ./...
?       package [no test files]
ok      package/myapp   (cached)        coverage: 44.4% of statements

package フォルダにはテストファイルが無い状態で、package/myapp フォルダのテスト進捗が coverage: 44.4% of statements で44%であることが確認できます。

もりぴ
もりぴ

テストのカバー率は100%を目指しましょう!

【まとめ】Goの標準パッケージtestingを使ってテストする

今回はGoの標準パッケージtestingを使ったテストの基本(本当の基本…)をお伝えしてきました。

ここまでの内容をまとめてみます。

この記事で押さえておくポイント!
  • テストファイル名は 任意の名称_test.go
    任意の名称はファイル名かパッケージ名が望ましい
  • テストする関数を TestXxxx と表記するのがルール Testxxxx はNG
  • テスト用のファイルは、テストしたいファイルと同階層に作成する
  • テストを実施する時はカレントディレクトリに注意してコマンドを入力する
    パッケージのトップディレクトリなら go test -v ./…
  • テストのカバー率を確かめるなら go test -cover ./…

以上です。

この記事では testing の基本中の基本をお伝えしてきました。

あとは、あなたがパッケージを新たに作成して、プログラムコードを書いてテストを実施してみてください。

まずは、今回お伝えした基本をしっかりを理解しておきましょう。

comment

タイトルとURLをコピーしました