[インデックス 13612] ファイルの概要
このコミットは、Go言語の標準ライブラリであるtesting
パッケージにVerbose()
関数を追加するものです。この関数は、テスト実行時に-test.v
フラグが設定されているかどうかをプログラム的に判定できるようにするために導入されました。これにより、テストコード内で冗長モードが有効になっているかどうかに応じて、異なる振る舞いをさせることが可能になります。
コミット
commit 20bf1a94e16402ccd29fb981dc68643a31353042
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Thu Aug 9 23:41:09 2012 +0800
testing: add Verbose() to expose whether -test.v is set
Fixes #3350.
R=golang-dev, adg, r, fullung
CC=golang-dev
https://golang.org/cl/6445092
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/20bf1a94e16402ccd29fb981dc68643a31353042
元コミット内容
testing: add Verbose() to expose whether -test.v is set
Fixes #3350.
このコミットは、Goのtesting
パッケージにVerbose()
という新しい関数を追加します。この関数の目的は、テスト実行時にコマンドライン引数-test.v
(冗長モード)が指定されているかどうかを、テストコード内から確認できるようにすることです。この変更は、Issue #3350を解決するために行われました。
変更の背景
Goのテストフレームワークでは、go test
コマンドに-v
(または-test.v
)フラグを付けて実行することで、テストの実行状況や各テスト関数の詳細なログを標準出力に表示する「冗長モード」を有効にできます。しかし、これまでのtesting
パッケージには、テストコード自身がこの冗長モードが有効になっているかどうかをプログラム的に判断するための直接的なAPIが存在しませんでした。
Issue #3350は、この機能の欠如を指摘し、テストコードが冗長モードの状態に応じて異なるロギングレベルやデバッグ情報を出力できるようにするためのAPIの必要性を提起していました。例えば、冗長モードが有効な場合にのみ詳細なデバッグ情報を出力し、通常モードでは簡潔な出力に留める、といった制御が求められていました。
このコミットは、その要求に応える形でVerbose()
関数を導入し、テスト開発者がより柔軟なテストロギングやデバッグ戦略を実装できるようにすることを目的としています。
前提知識の解説
Go言語のtesting
パッケージ
Go言語には、標準ライブラリとしてtesting
パッケージが提供されており、ユニットテスト、ベンチマークテスト、例(Example)テストなどを記述するための基本的な機能を提供します。
- テスト関数:
func TestXxx(*testing.T)
というシグネチャを持つ関数がテスト関数として認識されます。 *testing.T
: テストの状態管理、エラー報告、サブテストの実行、ヘルパー関数の呼び出しなどを行うためのメソッドを提供します。- コマンドラインフラグ:
go test
コマンドは、テストの挙動を制御するための様々なコマンドラインフラグをサポートしています。
-test.v
フラグ(冗長モード)
go test -v
またはgo test -test.v
コマンドを実行すると、テストは「冗長モード」で実行されます。このモードでは、以下の情報が標準出力に表示されます。
- 各テスト関数の開始と終了。
t.Log()
やt.Logf()
で出力されたメッセージ。- ベンチマークテストの詳細な結果。
- テストがスキップされた場合の情報。
通常、テストが成功した場合は何も出力されませんが、冗長モードでは成功したテストについても詳細な情報が出力されるため、テストの進行状況やデバッグに役立ちます。
flag
パッケージとグローバル変数
Goの標準ライブラリには、コマンドライン引数をパースするためのflag
パッケージがあります。testing
パッケージも内部的にこのflag
パッケージを使用して、-test.v
などのテスト関連のフラグを処理しています。これらのフラグの値は、通常、パッケージ内のグローバル変数(ポインタ型)に格納され、プログラムの他の部分から参照できるようになります。
このコミットで追加されるVerbose()
関数は、まさにこの内部的なグローバル変数(*chatty
)の値を公開することで、-test.v
フラグの状態を外部に知らせる役割を担っています。
技術的詳細
このコミットの技術的な核心は、testing
パッケージの内部で-test.v
フラグの状態を保持しているブール型ポインタ変数(*chatty
)を、新しい公開関数Verbose()
を通じて外部に公開することです。
testing
パッケージの内部では、init()
関数などでflag
パッケージを使って-test.v
フラグを定義し、その値をchatty
という変数(*bool
型)にバインドしています。chatty
は、-test.v
フラグが指定された場合にtrue
を指し、そうでない場合はfalse
を指すようになります。
Verbose()
関数は、単にこの*chatty
の値をデリファレンスして返すだけのシンプルな実装です。これにより、テストコードはtesting.Verbose()
を呼び出すだけで、冗長モードが有効かどうかを簡単にチェックできるようになります。
このアプローチの利点は以下の通りです。
- シンプルさ: 既存の内部状態を再利用するため、新しい状態管理ロジックは不要です。
- 一貫性:
testing
パッケージの他のフラグ関連関数(例:Short()
)と同様のパターンに従っています。 - 後方互換性: 既存のテストコードに影響を与えることなく、新しい機能を追加できます。
コアとなるコードの変更箇所
変更はsrc/pkg/testing/testing.go
ファイルにのみ行われました。
--- a/src/pkg/testing/testing.go
+++ b/src/pkg/testing/testing.go
@@ -132,6 +132,11 @@ func Short() bool {
return *short
}
+// Verbose reports whether the -test.v flag is set.
+func Verbose() bool {
+ return *chatty
+}
+
// decorate prefixes the string with the file and line of the call site
// and inserts the final newline if needed and indentation tabs for formatting.
func decorate(s string) string {
具体的には、Short()
関数の定義の直後に、以下の5行が追加されています。
// Verbose reports whether the -test.v flag is set.
- この行は、新しく追加される
Verbose()
関数のドキュメンテーションコメントです。Goの慣例に従い、関数が何を行うかを簡潔に説明しています。
- この行は、新しく追加される
func Verbose() bool {
Verbose
という名前の公開関数(先頭が大文字のため)を定義しています。この関数は引数を取らず、ブール値を返します。
return *chatty
- この行が関数の本体です。
chatty
という名前のポインタ変数をデリファレンスし、そのブール値を返します。chatty
はtesting
パッケージ内部で-test.v
フラグの状態を保持するために使用されている変数です。
- この行が関数の本体です。
}
- 関数の定義を閉じます。
+
(空行)- コードの可読性を高めるための空行です。
コアとなるコードの解説
追加されたVerbose()
関数は非常にシンプルですが、その影響は大きいです。
// Verbose reports whether the -test.v flag is set.
func Verbose() bool {
return *chatty
}
-
// Verbose reports whether the -test.v flag is set.
: これはGoのドキュメンテーションコメントであり、go doc testing Verbose
コマンドやGoのドキュメントサイトでこの関数の目的が表示されます。このコメントは、この関数が-test.v
フラグが設定されているかどうかを報告することを示しています。 -
func Verbose() bool { ... }
:Verbose
という名前の関数を定義しています。Goの命名規則により、関数名の最初の文字が大文字であるため、この関数はパッケージ外からアクセス可能な公開関数となります。戻り値の型はbool
で、-test.v
フラグが設定されていればtrue
、そうでなければfalse
を返します。 -
return *chatty
: この行が関数の核心です。chatty
はtesting
パッケージ内部で定義されている*bool
型の変数です。go test
コマンドが実行される際に、-test.v
フラグが指定されているかどうかに応じて、このchatty
が指すブール値がtrue
またはfalse
に設定されます。*chatty
は、chatty
ポインタが指す実際のブール値(true
またはfalse
)をデリファレンスして取得します。したがって、この関数は-test.v
フラグの現在の状態を直接反映したブール値を返します。
この関数が追加されたことで、開発者は以下のようなコードをテスト内で記述できるようになりました。
package mypackage
import (
"testing"
)
func TestSomething(t *testing.T) {
if testing.Verbose() {
t.Log("Verbose mode is enabled. Printing detailed debug info...")
// 詳細なデバッグ情報を出力するロジック
} else {
t.Log("Verbose mode is disabled. Keeping output concise.")
}
// 通常のテストロジック
t.Log("Running test...")
// ...
}
これにより、テストの出力が冗長モードの有無によって動的に変化し、デバッグ時と通常実行時で異なる情報を提供できるようになり、テストの利便性が向上しました。
関連リンク
- Go Issue #3350:
testing: add Verbose() to expose whether -test.v is set
- このコミットが解決したGitHub Issueです。このIssueの議論を読むことで、この機能がなぜ必要とされたのか、どのようなユースケースが想定されていたのかを深く理解できます。
- https://github.com/golang/go/issues/3350
- Go Code Review (CL) 6445092:
testing: add Verbose() to expose whether -test.v is set
- このコミットに対応するGoのコードレビューシステム(Gerrit)上の変更リストです。レビューコメントや変更履歴の詳細を確認できます。
- https://golang.org/cl/6445092
参考にした情報源リンク
- Go言語の
testing
パッケージ公式ドキュメント: - Go言語の
flag
パッケージ公式ドキュメント: go test
コマンドのドキュメント(go help test
またはオンラインドキュメント)- Go言語のソースコード(
src/pkg/testing/testing.go
)- https://github.com/golang/go/blob/master/src/testing/testing.go (コミット当時のバージョンとは異なる可能性がありますが、現在の実装も参考になります)
- Go言語のIssueトラッカーとCode Reviewシステム
- Goコミュニティにおける開発プロセスと議論の場。