Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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行が追加されています。

  1. // Verbose reports whether the -test.v flag is set.
    • この行は、新しく追加されるVerbose()関数のドキュメンテーションコメントです。Goの慣例に従い、関数が何を行うかを簡潔に説明しています。
  2. func Verbose() bool {
    • Verboseという名前の公開関数(先頭が大文字のため)を定義しています。この関数は引数を取らず、ブール値を返します。
  3. return *chatty
    • この行が関数の本体です。chattyという名前のポインタ変数をデリファレンスし、そのブール値を返します。chattytestingパッケージ内部で-test.vフラグの状態を保持するために使用されている変数です。
  4. }
    • 関数の定義を閉じます。
  5. + (空行)
    • コードの可読性を高めるための空行です。

コアとなるコードの解説

追加された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: この行が関数の核心です。chattytestingパッケージ内部で定義されている*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

参考にした情報源リンク