[インデックス 12232] ファイルの概要
本コミットは、Go言語のgo/printer
パッケージにおけるテストの修正に関するものです。具体的には、Goのインポートパスに関する新しい制約(スペースを含むパスが不正となる)に対応し、テストコードからtesting.Short()
のチェックを削除しています。
コミット
commit 0706d00cb8af873b82a0a0878e595a4369a76e52
Author: Anthony Martin <ality@pbrane.org>
Date: Mon Feb 27 10:01:45 2012 -0800
go/printer: fix test for new import path restrictions
Import paths with spaces are now invalid.
The builders would've caught this if they were running
the long tests. I've removed the check for short tests
in this package since the current tests are fast enough
already.
R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/5694082
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/0706d00cb8af873b82a0a0878e595a4369a76e52
元コミット内容
go/printer: fix test for new import path restrictions
Import paths with spaces are now invalid.
The builders would've caught this if they were running
the long tests. I've removed the check for short tests
in this package since the current tests are fast enough
already.
R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/5694082
変更の背景
このコミットは、Go言語のインポートパスに関する仕様変更に対応するために行われました。以前は許容されていたインポートパス内のスペースが、この変更により不正と見なされるようになったため、既存のテストデータとテストコードを修正する必要が生じました。
具体的には、以下の2点が変更の主な背景です。
- インポートパスの制約強化: Goの仕様において、インポートパスにスペースが含まれることが許可されなくなりました。これにより、
"much longer name"
や"short name"
といったスペースを含むインポートパスを使用している既存のテストデータが、新しい仕様に準拠しなくなり、テストが失敗するようになりました。 testing.Short()
の削除: コミットメッセージによると、この変更はGoのビルドシステム(builders
)が「長いテスト」(long tests
)を実行していれば捕捉できたはずの問題でした。しかし、このパッケージの現在のテストは十分に高速であるため、testing.Short()
によるテストのスキップチェックが不要と判断され、削除されました。これは、開発者がgo test -short
コマンドでテストを高速実行する際に、このパッケージのテストが常にフルで実行されることを意味します。
前提知識の解説
Goのインポートパスの制約
Go言語において、パッケージをインポートする際には、そのパッケージのパスを指定します。このインポートパスには厳格な制約があります。
- スペースの禁止: Goの仕様では、インポートパスにスペースを含めることは明示的に禁止されています。インポートパスは、UnicodeのL, M, N, P, Sカテゴリ(スペースを含まないグラフィック文字)に属する文字のみで構成される非空の文字列である必要があります。これは、
"invalid import path"
エラーの一般的な原因の一つです。 - フォワードスラッシュの使用: オペレーティングシステムに関わらず、インポートパスでは常にフォワードスラッシュ(
/
)を使用します。 - パッケージ名の慣習: Goのパッケージ名は、通常、小文字で単一の単語であり、簡潔であることが推奨されます。アンダースコアやキャメルケースは避けるべきとされています。パッケージ名は、そのパッケージが提供する機能や目的を明確に伝えるものであるべきです。
- モジュールパス: Go 1.11で導入されたGo Modulesでは、モジュールパスがモジュールの正規名となり、そのモジュール内のパッケージパスのプレフィックスとして機能します。モジュールパスにも、許可される文字に関する字句的な制約があります。
これらの制約は、Goのコードベースの一貫性を保ち、ツールがインポートパスを正確に解析できるようにするために重要です。
testing.Short()
について
Goの標準ライブラリであるtesting
パッケージには、Short()
という関数が提供されています。
- 機能:
testing.Short()
は、go test
コマンドが-short
フラグ付きで実行された場合にtrue
を返し、それ以外の場合はfalse
を返します。 - 目的: この関数の主な目的は、開発者がテストの実行時間を制御できるようにすることです。特に、実行に時間がかかるテストや、リソースを大量に消費するテスト(例: ネットワークアクセス、ファイルI/O、大規模な計算など)を、日常の開発ワークフローではスキップし、CI/CDパイプラインやリリース前の最終確認時など、より完全なテストが必要な場合にのみ実行するために使用されます。
- 使用例: 一般的には、テスト関数内で
if testing.Short() { t.Skip("skipping test in short mode.") }
のように記述し、-short
フラグが指定された場合にテストをスキップします。 - このコミットでの削除の理由: このコミットでは、
go/printer
パッケージのテストが既に十分に高速であるため、testing.Short()
によるスキップの必要がないと判断され、削除されました。これにより、このパッケージのテストは常にフルで実行されるようになります。
技術的詳細
このコミットは、Goのコードフォーマッタであるgo/printer
パッケージのテストに関連するものです。go/printer
は、GoのAST(抽象構文木)を整形し、標準的なGoのフォーマットルールに従ってソースコードを生成する役割を担っています。
変更は主に以下の2つの側面で行われています。
-
テストデータの修正:
src/pkg/go/printer/testdata/declarations.golden
とsrc/pkg/go/printer/testdata/declarations.input
というテストデータファイルが修正されました。これらのファイルは、go/printer
がコードを整形する際の入力と期待される出力(ゴールデンファイル)を定義しています。インポートパスの制約変更に伴い、スペースを含むインポートパス(例:"much longer name"
,"short name"
)が、アンダースコアに置き換えられた形式(例:"much_longer_name"
,"short_name"
)に修正されています。これは、go/printer
が新しいインポートパスの制約に準拠した出力を生成するようにするためです。 -
テストコードの修正:
src/pkg/go/printer/printer_test.go
内のTestFiles
関数から、testing.Short()
によるテストスキップのロジックが削除されました。// 変更前 func TestFiles(t *testing.T) { for i, e := range data { source := filepath.Join(dataDir, e.source) golden := filepath.Join(dataDir, e.golden) check(t, source, golden, e.mode) // TODO(gri) check that golden is idempotent //check(t, golden, golden, e.mode) if testing.Short() && i >= 3 { // ここでスキップ break } } } // 変更後 func TestFiles(t *testing.T) { for _, e := range data { // i の使用も削除 source := filepath.Join(dataDir, e.source) golden := filepath.Join(dataDir, e.golden) check(t, source, golden, e.mode) // TODO(gri) check that golden is idempotent //check(t, golden, golden, e.mode) } }
この変更により、
TestFiles
関数は常にdata
スライス内のすべてのテストエントリを処理するようになります。コミットメッセージにあるように、このパッケージのテストは既に十分に高速であるため、testing.Short()
による部分的な実行は不要と判断されたためです。
コアとなるコードの変更箇所
src/pkg/go/printer/printer_test.go
--- a/src/pkg/go/printer/printer_test.go
+++ b/src/pkg/go/printer/printer_test.go
@@ -154,15 +154,12 @@ var data = []entry{
}
func TestFiles(t *testing.T) {
- for i, e := range data {
+ for _, e := range data {
source := filepath.Join(dataDir, e.source)
golden := filepath.Join(dataDir, e.golden)
check(t, source, golden, e.mode)
// TODO(gri) check that golden is idempotent
//check(t, golden, golden, e.mode)
- if testing.Short() && i >= 3 {
- break
- }
}
}
src/pkg/go/printer/testdata/declarations.golden
--- a/src/pkg/go/printer/testdata/declarations.golden
+++ b/src/pkg/go/printer/testdata/declarations.golden
@@ -83,13 +83,13 @@ import (
// more import examples
import (
"xxx"
- "much longer name" // comment
- "short name" // comment
+ "much_longer_name" // comment
+ "short_name" // comment
)
import (
_ "xxx"
- "much longer name" // comment
+ "much_longer_name" // comment
)
import (
src/pkg/go/printer/testdata/declarations.input
--- a/src/pkg/go/printer/testdata/declarations.input
+++ b/src/pkg/go/printer/testdata/declarations.input
@@ -84,13 +84,13 @@ import (
// more import examples
import (
"xxx"
- "much longer name" // comment
- "short name" // comment
+ "much_longer_name" // comment
+ "short_name" // comment
)
import (
_ "xxx"
- "much longer name" // comment
+ "much_longer_name" // comment
)
import (
コアとなるコードの解説
src/pkg/go/printer/printer_test.go
の変更
TestFiles
関数は、go/printer
パッケージのテストスイートの一部であり、様々なGoソースファイルの整形結果を検証します。
for i, e := range data
からfor _, e := range data
への変更:- 元のコードでは、
data
スライスをイテレートする際にインデックスi
も取得していました。 - 変更後では、インデックス
i
が不要になったため、_
(ブランク識別子)を使用して破棄しています。これは、Goの慣習に従い、使用しない変数を宣言しないようにするためのものです。
- 元のコードでは、
if testing.Short() && i >= 3 { break }
の削除:- この行は、
go test -short
フラグが指定され、かつテストエントリのインデックスi
が3以上の場合に、ループを中断してテストを早期に終了させるためのロジックでした。 - コミットメッセージにあるように、このパッケージのテストは既に十分に高速であるため、このスキップロジックは不要と判断され削除されました。これにより、
TestFiles
は常にすべてのテストケースを実行するようになります。これは、テストの網羅性を高める一方で、テスト実行時間の増加には繋がらないという判断があったことを示唆しています。
- この行は、
src/pkg/go/printer/testdata/declarations.golden
および src/pkg/go/printer/testdata/declarations.input
の変更
これらのファイルは、go/printer
のテストで使用される入力と期待される出力のサンプルです。
"much longer name"
と"short name"
から"much_longer_name"
と"short_name"
への変更:- これは、Goのインポートパスに関する新しい制約(スペースの禁止)に直接対応する修正です。
- 元のファイルでは、インポートパスにスペースが含まれていましたが、新しい仕様ではこれが不正となるため、スペースをアンダースコア(
_
)に置き換えることで、有効なインポートパスに修正されています。 declarations.input
はgo/printer
への入力として使用され、declarations.golden
はgo/printer
が生成する期待される出力として使用されます。この変更により、go/printer
がスペースを含むインポートパスを処理する際に、アンダースコアに変換して出力する、あるいはそのような不正なパスをそもそも受け付けないようにする、といった挙動がテストされることになります。
これらの変更は、Go言語の進化に伴う仕様変更に既存のツールとテストが適切に対応していることを保証するために不可欠なものです。
関連リンク
- Go CL 5694082: https://golang.org/cl/5694082
参考にした情報源リンク
- Go import paths cannot contain spaces: https://stackoverflow.com/questions/24070900/go-import-paths-cannot-contain-spaces
- Go package naming conventions: https://mohitkhare.com/blog/go-package-naming-conventions/
- Go package names: https://rakyll.org/go-package-names/
testing.Short()
in Go: https://stackoverflow.com/questions/20001050/what-does-testing-short-do-in-go- Go testing package documentation: https://pkg.go.dev/testing
- Go Modules: https://go.dev/blog/using-go-modules