Go言語の関数のテストを書く基本!単体テストのやり方を解説
生徒
「Go言語で作った関数がちゃんと動くか確かめたいんですけど、どうすればいいですか?」
先生
「Go言語では、testingというパッケージを使って関数のテストを書くことができますよ。」
生徒
「それって難しくないですか?何か特別な設定が必要ですか?」
先生
「大丈夫、すごくシンプルです。基本的な使い方を一緒に見ていきましょう!」
1. Go言語のテストとは?
Go言語の単体テスト(ユニットテスト)は、関数などの「小さな部品」が正しく動くかを自動で確かめる仕組みです。人が目で結果を見るのではなく、プログラムが「期待した結果」と「実際の結果」を比べて判定します。間違いを早く見つけられるので、修正やリファクタリングをしても安心して前に進めます。
Goには最初からtestingパッケージが用意されており、追加のインストールなしで始められます。「同じ入力なら必ず同じ出力になるか?」「境界値でも壊れないか?」といった基本を機械的に確認できるのがポイントです。まずは“結果を比べる”という発想をつかんでおきましょう。
// 例:テストのイメージ(まずは「期待」と「結果」を比べる感覚)
package main
func Add(a, b int) int {
return a + b
}
// 期待:Add(2, 3) は 5 になるはず(=期待値)
// 実際:プログラムが計算した結果
// テストでは「期待値」と「実際の結果」を自動で比較して、ズレていれば失敗として知らせます。
このように、単体テストは「意図通りに動いているか」を繰り返しチェックする安全網です。以降のセクションでは、この考え方を具体的な形にするための基本ルールや書き方を順番に見ていきます。
2. テストを書くためのファイルのルール
Goの単体テストでは、テスト専用ファイル名の規則が決まっています。対象ソースのベース名に_test.goを付けたファイルを、同じディレクトリ・同じパッケージに置きます。これによりgo testが自動で検出して実行します(通常のgo buildでは_test.goはビルド対象外になるため本番バイナリに混ざりません)。
例:calc.goをテストする場合はcalc_test.goを用意します。テストファイルは複数あっても構いません(例:calc_add_test.go/calc_mul_test.goなど)。まずは「同じ場所・同じパッケージ名・_test.go」を覚えておきましょう。
myapp/
├─ calc.go // 本体コード(package main など)
└─ calc_test.go // テストコード(同じpackageで置く)
// calc_test.go(サンプル:配置と名前だけ確認)
package main
// ここでは「_test.go という名前で同じディレクトリに置く」点が大事。
// 実際のテスト関数の書き方は次のセクションで扱います。
パッケージを分けて外部利用の視点から検証する方法(package xxx_test)もありますが、まずは同一パッケージで配置ルールに慣れるのがおすすめです。名前と置き場所さえ守れば、go testだけで実行できる下準備は整います。
3. 基本的なテスト関数の書き方
Goのテスト関数は、関数名がTestで始まり、引数に*testing.Tを1つ取る形が決まりです。テストでは「準備 → 実行 → 確認(比較)」の流れをコードで表現します。まずは最小の例で“結果を比べる”感覚をつかみましょう。テスト用の関数はテストファイル(_test.go)に書き、testingパッケージをインポートします。
package main
import "testing"
// 本体コード(例)
func Add(a, b int) int {
return a + b
}
// 基本のテスト関数:Testで始め、*testing.T を受け取る
func TestAdd(t *testing.T) {
// 準備(Arrange)
a, b := 2, 3
want := 5
// 実行(Act)
got := Add(a, b)
// 確認(Assert): 期待値(want)と実際の結果(got)を比較
if got != want {
// テスト失敗として分かりやすいメッセージを出す
t.Errorf("Add(%d, %d) = %d; want %d", a, b, got, want)
}
}
上の例では、TestAddが自動でテスト関数として認識されます。got(実際の結果)とwant(期待値)を比べ、違えば失敗として知らせます。まずはこの“名前のルール”と“比較の書き方”を押さえておけば、次のステップ(実行方法や他の関数のテスト)にスムーズに進めます。
4. テストを実行する方法
テストファイルを作成したら、次に実行する方法です。ターミナル(黒い画面)を開いて、該当のファイルがあるディレクトリに移動し、以下のコマンドを入力します。
go test
すると、テストが実行されて、成功したかどうかが表示されます。失敗した場合には、どのテストが失敗したのかもわかります。
5. テスト関数を複数書くこともできる
複数の関数をテストしたい場合、それぞれにTestで始まる関数を用意することで対応できます。
func Multiply(a, b int) int {
return a * b
}
func TestMultiply(t *testing.T) {
result := Multiply(4, 5)
expected := 20
if result != expected {
t.Errorf("Multiply(4, 5) = %d; want %d", result, expected)
}
}
このように、関数ごとにテストを書くと、どの部分に問題があるかが明確になり、あとでバグを見つけやすくなります。
6. テストの失敗を表示するt.Errorfの意味
t.Errorfは、テストの中で条件が間違っていた場合にエラーメッセージを表示する関数です。"Add(2, 3) = %d; want %d"のように書くと、どのような結果だったのかが分かりやすく表示されます。
7. テストの基本を知ることで開発が安全に
テストを書くことは、プログラムが間違っていないかを確認するためにとても大事です。自分が書いた関数が正しく動くかをチェックできれば、自信を持って開発ができるようになります。
Go言語ではテスト機能が最初から入っているので、特別な準備をしなくてもすぐに始められます。
まとめ
Go言語で関数のテストを書く方法を学ぶことで、作ったプログラムが正しく動いているかを自分で確認できるようになります。とくに、Go言語は最初からテストの仕組みが組み込まれているので、追加のライブラリを入れたり、難しい設定をしたりする必要がありません。_test.goというファイル名のルールに従い、Testで始まる関数を作り、*testing.Tを受け取る形でテストを書くと、自分の関数が間違っているかどうかを確かめられます。間違っていたときは、t.Errorfで分かりやすいメッセージを表示できるので、どこを直せばよいのかをすぐに見つけられます。
また、複数の関数をテストしたいときは、関数ごとにテストを追加するだけでよく、処理の変更や再利用がしやすくなります。たとえば、足し算を確認する関数と掛け算を確認する関数があっても、どちらが壊れているかはテストを実行すればすぐに分かります。プログラムを改修したときにも、テストを実行して問題が出ないか確認できるので、安心してコードを変更できます。
テストは小さな範囲から始めて大丈夫です。まずは一つの関数から、値の確認をできるようにしましょう。慣れてくると、条件や入力のパターンを増やして、「正しい結果を返すか」「間違った入力でも落ちないか」なども確認できます。テストを書くことは、ただ動作を確かめるだけでなく、将来の自分やチーム全体にとって安心材料になります。
下にまとめとして、シンプルなテストの例をもう一度載せておきます。「こういう形で書けばよかったな」と思い出せるようにしておくと便利です。
シンプルなサンプルコードの振り返り
package main
import "testing"
func Divide(a, b int) int {
return a / b
}
func TestDivide(t *testing.T) {
result := Divide(10, 2)
expected := 5
if result != expected {
t.Errorf("Divide(10, 2) = %d; want %d", result, expected)
}
}
このテストも、名前がTestで始まり、*testing.Tを受け取っています。Divide(10, 2)の結果が5になるかどうかを確認しています。もし違う結果になれば、t.Errorfで理由を表示してくれるので、どこを直すべきかすぐに気づけます。「練習したいけどどこからやればいいか分からない」と感じたときは、このような小さなテストから挑戦すると、考え方がつかみやすくなります。
開発を続けていくと、関数の数が増えたり、新しい機能の追加でコードが大きくなったりします。そんなときにテストがあると、動作確認が一気に楽になります。自分の手で一つずつ試すより、コマンド一つで何十個も確認できるのは、とても効率的で心強い仕組みです。
生徒
「最初はテストって難しそうだと思っていましたけど、やってみると意外とシンプルなんですね。」
先生
「そうでしょう。特にGo言語はテストの機能が標準で入っているから、設定に悩まなくていいんです。」
生徒
「ファイル名を_test.goにするだけでいいっていうのも分かりやすかったです!テストの結果もすぐ見られるから、書いていて楽しくなりますね。」
先生
「その調子です。小さなテストが積み重なると、大きな安心につながります。困ったときは、まずテストを書いて確かめる習慣をつけてください。」
生徒
「はい!これから作る機能にもテストをつけてみます!」
この記事を読んだ人からの質問
プログラミング初心者からのよくある疑問/質問を解決します
Go言語の単体テストとユニットテストは同じ意味ですか?違いはありますか?
Go言語で使う単体テストという言葉は、一般的なユニットテストと同じ意味です。どちらも小さな機能や関数が正しく動くかを確認するためのテストで、Go言語では標準パッケージであるtestingを使って簡単に実行できます。
【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導
「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。
本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。
具体的な開発内容と環境
【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。
【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。
この60分で得られる3つの理解
「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。
データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。
ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。
※本講座は、将来的にバックエンドエンジニアやクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。
初めてのGo言語を一緒に学びましょう!