[インデックス 10836] ファイルの概要
このコミットは、Go言語の標準ライブラリである io/ioutil
パッケージのテストファイル src/pkg/io/ioutil/ioutil_test.go
に関連するものです。このファイルは、io/ioutil
パッケージが提供するユーティリティ関数、特にディレクトリの読み取り (ReadDir
) の動作を検証するための単体テストを含んでいます。
コミット
- コミットハッシュ:
0358c8957aa6d3de1ad855d95f3ab4334e63b77c
- 作者: Russ Cox (
rsc@golang.org
) - コミット日時: 2011年12月15日 木曜日 19:32:47 -0500
- コミットメッセージ:
io/ioutil: remove another reference to _test R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/5492051
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/0358c8957aa6d3de1ad855d95f3ab4334e63b77c
元コミット内容
このコミットは、io/ioutil
パッケージのテストコード ioutil_test.go
から、_test
という特定のディレクトリへの参照を削除することを目的としています。具体的には、TestReadDir
関数内で、テスト対象のディレクトリを現在のディレクトリ (.
) から親ディレクトリ (..
) に変更し、それに伴い期待されるファイル名とディレクトリ名を更新しています。
変更の背景
この変更の背景には、Go言語のテストフレームワークやディレクトリ構造に関する慣習の進化があります。初期のGo開発では、特定のテストシナリオや一時的なファイルのために _test
という名前のディレクトリが使用されることがありました。しかし、Goの標準的なテストの慣習は、テスト対象のソースコードと同じディレクトリに _test.go
ファイルを配置し、パッケージレベルでテストを行うというものです。
このコミットは、「_test
への別の参照を削除する」と明記されており、これはおそらく、以前のコミットで同様の _test
参照の削除が行われたことの続き、または、Goプロジェクト全体で _test
ディレクトリへの依存を減らすという方針の一環であると考えられます。これにより、テストの堅牢性が向上し、特定のテスト環境や一時的なディレクトリ構造に依存しない、より一般的なテストが可能になります。
前提知識の解説
Go言語の io/ioutil
パッケージ
io/ioutil
パッケージは、Go言語の標準ライブラリの一部であり、I/O操作を補助するユーティリティ関数を提供します。これには、ファイルの読み書き、ディレクトリの内容のリストアップ、一時ファイルの作成などが含まれます。
ioutil.ReadDir(dirname string) ([]os.FileInfo, error)
: 指定されたディレクトリdirname
の内容を読み取り、そのディレクトリ内のファイルとサブディレクトリの情報をos.FileInfo
スライスの形で返します。os.FileInfo
インターフェースは、ファイル名、サイズ、パーミッション、最終更新日時、ディレクトリであるかどうかの情報などを提供します。
Go言語のテスト
Go言語には、標準で組み込みのテストフレームワークが用意されています。
- テストファイルの命名規則: テストファイルは、テスト対象のソースファイルと同じディレクトリに配置され、ファイル名の末尾に
_test.go
を付けます(例:ioutil.go
のテストはioutil_test.go
)。 - テスト関数の命名規則: テスト関数は
Test
で始まり、その後に続く名前の最初の文字は大文字である必要があります(例:func TestReadDir(t *testing.T)
)。 testing
パッケージ: テストの実行、アサーション、エラー報告などを行うための機能を提供します。*testing.T
型は、テストの状態を管理し、テストの失敗を報告するためのメソッドを提供します。- ディレクトリ構造とテスト: 通常、Goのテストはパッケージの内部で行われ、テストファイルはテスト対象のパッケージと同じディレクトリに存在します。このコミットのように、親ディレクトリや他のパッケージのファイルをテストで参照する場合、相対パス (
.
や..
) を使用することがあります。
.
と ..
の意味
.
(ドット): 現在のディレクトリを表します。..
(ドット2つ): 親ディレクトリを表します。
これらの特殊なディレクトリ名は、ファイルシステム内の相対パスを指定する際に使用されます。
技術的詳細
このコミットの技術的な詳細は、ioutil_test.go
内の TestReadDir
関数における ReadDir
のテスト対象ディレクトリの変更と、それに伴う期待値の調整にあります。
元のコードでは、dirname = "."
と設定されており、ReadDir
はテストファイル自身 (ioutil_test.go
) が存在するディレクトリを読み取っていました。そして、そのディレクトリ内に ioutil_test.go
というファイルと _test
というディレクトリが存在することを期待していました。これは、テストが実行される環境に特定の _test
ディレクトリが存在することを前提としていました。
変更後のコードでは、dirname = ".."
と設定されており、ReadDir
はテストファイルが存在するディレクトリの親ディレクトリを読み取るようになります。src/pkg/io/ioutil/ioutil_test.go
の親ディレクトリは src/pkg/io/ioutil/
です。このディレクトリは io/ioutil
パッケージのルートディレクトリであり、Goの標準ライブラリの構造上、その親ディレクトリは src/pkg/io/
となります。
したがって、dirname = ".."
とすることで、ReadDir
は src/pkg/io/
ディレクトリを読み取ることになります。このディレクトリには、io
パッケージのテストファイルである io_test.go
や、ioutil
パッケージのディレクトリ (ioutil/
) が存在することが期待されます。
この変更により、テストはより一般的なファイルシステム構造に対して行われるようになり、特定のテスト実行環境に依存する _test
ディレクトリの存在を前提としなくなります。これは、テストのポータビリティと堅牢性を向上させる上で重要な変更です。
コアとなるコードの変更箇所
diff --git a/src/pkg/io/ioutil/ioutil_test.go b/src/pkg/io/ioutil/ioutil_test.go
index 63be71cdf9..3e85e3d0c8 100644
--- a/src/pkg/io/ioutil/ioutil_test.go
+++ b/src/pkg/io/ioutil/ioutil_test.go
@@ -70,26 +70,26 @@ func TestReadDir(t *testing.T) {
t.Fatalf("ReadDir %s: error expected, none found", dirname)
}
- dirname = "."
+ dirname = ".."
list, err := ReadDir(dirname)
if err != nil {
t.Fatalf("ReadDir %s: %v", dirname, err)
}
- foundTest := false
- foundTestDir := false
+ foundFile := false
+ foundSubDir := false
for _, dir := range list {
switch {
- case !dir.IsDir() && dir.Name() == "ioutil_test.go":
- foundTest = true
- case dir.IsDir() && dir.Name() == "_test":
- foundTestDir = true
+ case !dir.IsDir() && dir.Name() == "io_test.go":
+ foundFile = true
+ case dir.IsDir() && dir.Name() == "ioutil":
+ foundSubDir = true
}
}
- if !foundTest {
- t.Fatalf("ReadDir %s: test file not found", dirname)
+ if !foundFile {
+ t.Fatalf("ReadDir %s: io_test.go file not found", dirname)
}
- if !foundTestDir {
- t.Fatalf("ReadDir %s: _test directory not found", dirname)
+ if !foundSubDir {
+ t.Fatalf("ReadDir %s: ioutil directory not found", dirname)
}
}
コアとなるコードの解説
このコミットのコアとなる変更は、TestReadDir
関数内の以下の部分です。
-
dirname
の変更:- 変更前:
dirname = "."
- 変更後:
dirname = ".."
- これにより、
ReadDir
が読み取る対象ディレクトリが、テストファイルが存在するディレクトリ(src/pkg/io/ioutil/
)から、その親ディレクトリ(src/pkg/io/
)に変更されました。
- 変更前:
-
期待されるファイル/ディレクトリ名の変更:
- 変更前は、現在のディレクトリ (
.
) 内でioutil_test.go
というファイルと_test
というディレクトリを探していました。foundTest
とfoundTestDir
という変数名が使用されていました。dir.Name() == "ioutil_test.go"
でテストファイルを探していました。dir.Name() == "_test"
で_test
ディレクトリを探していました。- エラーメッセージもそれぞれ「
test file not found
」と「_test directory not found
」でした。
- 変更後は、親ディレクトリ (
..
) 内でio_test.go
というファイルとioutil
というディレクトリを探すようになりました。foundFile
とfoundSubDir
というより一般的な変数名に変更されました。dir.Name() == "io_test.go"
でio
パッケージのテストファイルを探しています。これは、src/pkg/io/
ディレクトリにio_test.go
が存在するためです。dir.Name() == "ioutil"
でioutil
ディレクトリを探しています。これは、src/pkg/io/
ディレクトリにioutil/
サブディレクトリが存在するためです。- エラーメッセージもそれぞれ「
io_test.go file not found
」と「ioutil directory not found
」に更新されました。
- 変更前は、現在のディレクトリ (
この変更は、テストの対象と期待値を、よりGoの標準ライブラリのディレクトリ構造に合致させることで、テストの正確性と汎用性を高めています。
関連リンク
- Go CL 5492051: https://golang.org/cl/5492051
参考にした情報源リンク
- Go言語の公式ドキュメント(
io/ioutil
パッケージ、testing
パッケージに関する情報) - Go言語のテストに関する一般的な慣習とベストプラクティスに関する情報