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

[インデックス 11110] ファイルの概要

このコミットは、Go言語のテストツール (go test) における出力メッセージの表示形式を調整するものです。具体的には、テストファイルが存在しないパッケージに対して表示される「no test files」メッセージのインデント(タブ文字)を修正し、出力の視認性と整列を改善しています。

コミット

go test: align "no test files" message

R=rsc
CC=golang-dev
https://golang.org/cl/5533070

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/b8f76764cbed4d383d667d53ddd20b5c08fc606d

元コミット内容

commit b8f76764cbed4d383d667d53ddd20b5c08fc606d
Author: Robert Griesemer <gri@golang.org>
Date:   Wed Jan 11 11:15:36 2012 -0800

    go test: align "no test files" message
    
    R=rsc
    CC=golang-dev
    https://golang.org/cl/5533070

変更の背景

この変更は、go test コマンドがテストファイルを持たないパッケージを処理する際に表示するメッセージの出力フォーマットを改善するために行われました。以前のバージョンでは、パッケージのインポートパスと「[no test files]」というメッセージの間にタブ文字が1つしかなく、ターミナルやコンソールでの表示において、インポートパスの長さによってはメッセージが適切に整列されない可能性がありました。

開発者は、コマンドラインツールの出力が読みやすく、一貫性のあるフォーマットであることを重視します。特に、複数のパッケージを一度にテストする際など、出力がリスト形式になる場合には、各行の要素が縦に揃っていることがユーザーエクスペリエンスを向上させます。このコミットは、この小さな視覚的な不整合を解消し、よりクリーンで整列された出力を提供することを目的としています。

前提知識の解説

このコミットを理解するためには、以下のGo言語および関連ツールの基本的な知識が必要です。

  • go test コマンド: Go言語に組み込まれているテスト実行ツールです。Goプロジェクトのテストコード(通常は _test.go で終わるファイルに記述)をコンパイルし、実行するために使用されます。パッケージ内にテストファイルが存在しない場合、go test はその旨を示すメッセージを出力します。
  • fmt.Printf 関数: Go言語の標準ライブラリ fmt パッケージに含まれる関数で、C言語の printf に似たフォーマット済み文字列を出力するために使用されます。第一引数にフォーマット文字列を取り、その後の引数でフォーマット指定子 (%s など) に対応する値を渡します。
  • フォーマット指定子 %s: fmt.Printf で使用されるフォーマット指定子の一つで、文字列の値を挿入するために使われます。このコミットでは、パッケージのインポートパス (a.p.ImportPath) がこの指定子によって挿入されます。
  • タブ文字 (\t): 特殊文字の一つで、出力において水平方向のタブスペースを挿入します。これにより、テキストを特定のカラム位置に揃えることができます。複数のタブ文字を使用することで、より広いスペースを確保したり、異なる長さの文字列でも後続のテキストを揃えたりすることが可能になります。
  • Go言語のパッケージとインポートパス: Go言語のコードはパッケージに分割され、他のパッケージの機能を利用する際にはそのパッケージの「インポートパス」を指定してインポートします。例えば、"fmt""net/http" などがインポートパスです。

技術的詳細

このコミットの技術的な変更は非常にシンプルですが、その影響はユーザーインターフェースの改善に繋がります。

変更は src/cmd/go/test.go ファイル内の notest 関数にあります。この関数は、go test コマンドがテストファイルを持たないパッケージを検出した際に呼び出されます。

元のコードでは、fmt.Printf のフォーマット文字列は以下のようになっていました。

fmt.Printf("?   \t%s [no test files]\n", a.p.ImportPath)

ここで、? の後にタブ文字 (\t) が一つあり、その後にパッケージのインポートパス (%s) が挿入され、さらにその後にスペースと [no test files] という文字列が続いていました。

このコミットでは、このフォーマット文字列が以下のように変更されました。

fmt.Printf("?   \t%s\t[no test files]\n", a.p.ImportPath)

変更点は、%s (インポートパス) の直後にもう一つタブ文字 (\t) が追加されたことです。

この追加されたタブ文字の目的は、インポートパスの長さに関わらず、「[no test files]」というメッセージがより右側に、かつ他の出力行と揃うように整列されるようにすることです。例えば、短いインポートパスの後にタブが一つだけだと、「[no test files]」メッセージが比較的左寄りに表示されますが、長いインポートパスの後にタブが一つだと、メッセージが右寄りに表示され、結果として縦の整列が崩れる可能性があります。タブをもう一つ追加することで、インポートパスの長さによる影響を吸収し、メッセージの開始位置をより一貫性のあるものにしています。

これは、コマンドラインインターフェースにおける「アラインメント(整列)」の典型的な例であり、ユーザーが複数の行にわたる出力を一目で理解しやすくするための細かな調整です。

コアとなるコードの変更箇所

--- a/src/cmd/go/test.go
+++ b/src/cmd/go/test.go
@@ -518,7 +518,7 @@ func (b *builder) printTest(a *action) error {
 
 // notest is the action for testing a package with no test files.
 func (b *builder) notest(a *action) error {
-	fmt.Printf("?   \t%s [no test files]\n", a.p.ImportPath)
+	fmt.Printf("?   \t%s\t[no test files]\n", a.p.ImportPath)
 	return nil
 }
 

コアとなるコードの解説

変更が行われたのは、src/cmd/go/test.go ファイル内の notest 関数です。

// notest is the action for testing a package with no test files.
func (b *builder) notest(a *action) error {
	fmt.Printf("?   \t%s\t[no test files]\n", a.p.ImportPath)
	return nil
}
  • func (b *builder) notest(a *action) error: これは builder 型のメソッドとして定義された notest 関数です。go test コマンドの内部処理において、テスト対象のパッケージがテストファイルを含まない場合にこの関数が呼び出されます。引数 a *action は、テスト対象のパッケージに関する情報(例えばインポートパス)を含む構造体へのポインタです。
  • fmt.Printf("? \t%s\t[no test files]\n", a.p.ImportPath): この行が実際の出力処理を行っています。
    • "? \t": これは出力のプレフィックスです。? はテスト結果が不明(テストがないため)であることを示し、その後にスペースとタブが続きます。
    • %s: ここに a.p.ImportPath、つまり現在処理しているGoパッケージのインポートパスが挿入されます。
    • \t: このコミットで追加されたタブ文字です。 これにより、インポートパスの後にさらにタブスペースが追加され、後続のメッセージがより右側に整列されます。
    • [no test files]\n: テストファイルがないことを示すメッセージです。\n は改行コードで、出力の最後に新しい行を開始します。

この変更により、go test の出力は、パッケージのインポートパスの長さにかかわらず、「[no test files]」メッセージがより一貫した位置に表示されるようになり、全体的な可読性が向上します。

関連リンク

  • Go Gerrit Change-ID: https://golang.org/cl/5533070 このリンクは、Goプロジェクトがコードレビューに利用しているGerritシステム上の変更セット(Change-ID)を指します。Goプロジェクトでは、GitHubにプッシュされる前に、Gerrit上で全てのコミットがレビューされます。このページでは、コミットの詳細な変更内容、レビューコメント、承認状況などを確認できます。

参考にした情報源リンク