💯

【超初学者向け】Goでユニットテストを初めて実装する

2024/07/07に公開

Goの標準パッケージのtestingを使ってGoにおけるテストの書き方を紹介します。

プログラミング超初心者を対象に超超簡単な足し算関数でテストコードを書いていきます。というのも、個人的にテストは早いうちから学習すべきだと思うからです。

自分はある程度APIを作れるくらいになって初めてテストを勉強したのですが、いざテストコードを書こうと思ってもコードが汚い&絡まり散らかしていてほとんど作り直すことになりました。

早いうちにユニットテストについての最低限の知識があればプログラムを書くときに常にテストのしやすさを意識してコーディングできるので、テストは早いうちから理解だけでもしとくべきだと感じています。

以上のことから、プログラミング超初学者のためにユニットテストとは?を実際のコードで説明していきます。

ユニットテストの原則

ユニットテストは、プログラムの最小単位である関数やメソッドなどが単独で正しく動作するかを確認するテストです。ユニットテストは、他の部分と独立して実行され、そのユニットの動作が期待通りであるかどうかを検証します。つまり、部分と絡み合っているとそれだけテストするときに独立させにくいということです。

ユニットテストの目的

調べれば以下のように色々出てきますが、とりあえずコードが期待通りの動きを本当にするかを確かめるという理解で問題ないです。

調べると出てくるユニットテストの目的(今はふーん程度でいいです)
  • コードの品質向上: ユニットテストは、バグや不具合を早期に発見し修正するために使用されます。これにより、コードの品質が向上します。
  • リファクタリングの安全性: コードをリファクタリングする際に、ユニットテストがあれば、変更が既存の機能を壊していないか確認できます。
  • 設計の明確化: ユニットテストを書くことで、関数やメソッドの設計が明確になり、仕様が明確になります。

ユニットテストの基本構造

ユニットテストは一般的に以下の3つのステップで構成されます:

  1. セットアップ (Setup): テストに必要な準備を行う。例えば、テスト対象のオブジェクトを作成したり、必要なデータや期待する結果を用意したりします。
  2. 実行 (Exercise): テスト対象の関数やメソッドを実行して結果を取得します。
  3. 検証 (Verify): 実行結果が期待する結果通りであるかを確認します。
  4. 後処理 (Teardown): テストが終わった後の後処理を行います(オプション)。

特にこの1から3の流れは理解しましょう。 どんなに複雑に見えるユニットテストのコードも基本的には色々セットアップした上でこの手順で実施しているはずです。

testingによるテスト

testingの特徴

Goの標準ライブラリとして提供されている(追加でインストールが不要な)testingの特徴は以下です。

  • シンプルで軽量
  • 単体テスト、ベンチマークテストの作成と実行ができる
  • ログ出力やエラーメッセージのカスタマイズも可能

基本的な使い方

  1. 足し算関数Add()とそのユニットテストを作成
// main_test.go (ファイル名の後ろに'_test'をつけてください)
package main

import (
    "testing"
)

// a+bをするだけの関数
func Add(a, b int) int {
    return a + b
}

// Add()のテスト関数
// テスト関数はテスト対象の関数名の先頭に'Test'をつける
func TestAdd(t *testing.T) {
    expected := 3 // 手順1. セットアップ:必要なデータ(期待する結果)を用意
    result := Add(1, 2) // 手順2. 実行:Add()を(a, b)=(1, 2)で実行

    if result != expected { // 手順3. 検証:期待する結果(expected)と実行結果(result)を比較
        t.Errorf("Expected %d, but got %d", expected, result) // 期待する結果と実行結果が違えばエラーを出力する
    }
}
  1. コマンドラインでのテストの実行

このテストを実行するにはターミナルを起動して以下を実行します:

go test

ターミナル上で以下の結果が返ってこればテスト成功です:

PASS
ok      myproject    0.278s

ついでにexpectedを3以外にしてテストが失敗することも確認してみましょう。例えばexpectedを5にしてテストを実行すると以下の結果が返ってきます:

go test
--- FAIL: TestAdd (0.00s)
    main_test.go:14: Expected 5, but got 3
FAIL
exit status 1
FAIL    myproject    0.234s

失敗ケースのテストを実装することもよくあるので、このエラーの書き方なんかも知っておくといいかもしれません。

まとめ

以上、プログラミング初学者のためのユニットテストの紹介と、超簡単な足し算関数を例にテストを実装してみました。

テストとは?っていう方やテストの学習を後回しにしている方に少しでも参考になれば幸いです!

Discussion