[インデックス 14955] ファイルの概要
このコミットは、Go言語の標準ライブラリにおけるmime
パッケージとstrconv
パッケージのテストデータ配置に関する一貫性を向上させるための変更です。具体的には、これらのパッケージが使用するテストデータファイルを、他のパッケージと同様にtestdata
という専用のディレクトリに移動し、それに伴いテストコード内のファイルパス参照を更新しています。
コミット
commit a1231839b531b15e9745e92fe2396456029729a1
Author: Robin Eklind <r.eklind.87@gmail.com>
Date: Tue Jan 22 13:44:35 2013 -0800
mime, strconv: Make testdata more consistent.
All packages place testdata in a specific directory with the name
"testdata". The mime and strconv packages have been updated to use
the same convention.
mime: Move "mime/test.types" to "mime/testdata/test.types". Update test
code accordingly.
strconv: Move "strconv/testfp.txt" to "strconv/testdata/testfp.txt".
Update test code accordingly.
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/7098072
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/a1231839b531b15e9745e92fe2396456029729a1
元コミット内容
このコミットの元の内容は、mime
パッケージとstrconv
パッケージのテストデータファイルの配置を、Go言語の他の標準パッケージが採用している慣習に合わせるというものです。具体的には、以下の変更が行われました。
mime
パッケージ内のtest.types
ファイルをmime/testdata/test.types
へ移動し、関連するテストコードのパスを修正。strconv
パッケージ内のtestfp.txt
ファイルをstrconv/testdata/testfp.txt
へ移動し、関連するテストコードのパスを修正。
これにより、テストデータの管理とアクセスが一貫した方法で行われるようになります。
変更の背景
Go言語のプロジェクトでは、テストに関連する補助ファイル(テストデータ、設定ファイルなど)を、テスト対象のパッケージのルートディレクトリ直下ではなく、慣習的にtestdata
という名前のサブディレクトリに配置することが推奨されています。これは、テストデータと実際のソースコードを明確に分離し、プロジェクトの構造を整理するためです。
このコミット以前は、mime
パッケージとstrconv
パッケージがこの慣習に従っておらず、テストデータファイルがパッケージのルートディレクトリに直接置かれていました。このため、プロジェクト全体でのファイル配置の一貫性が損なわれていました。本コミットは、この不整合を解消し、Goプロジェクト全体でのテストデータ管理のベストプラクティスに準拠させることを目的としています。これにより、コードベースの可読性と保守性が向上し、新しい開発者がプロジェクトに参加した際に、テストデータの場所を容易に特定できるようになります。
前提知識の解説
Go言語のパッケージ構造とテスト
Go言語では、コードは「パッケージ」という単位で整理されます。各パッケージは通常、ファイルシステム上のディレクトリに対応します。テストコードは、慣習的にテスト対象のパッケージと同じディレクトリに配置され、ファイル名の末尾に_test.go
が付きます。
testdata
ディレクトリの慣習
Goのテストフレームワーク(go test
コマンド)は、特定のディレクトリ構造を認識します。その一つがtestdata
ディレクトリです。testdata
ディレクトリは、テストコードが読み込む必要のある静的なデータファイル(例: 入力ファイル、期待される出力ファイル、設定ファイルなど)を格納するために使用されます。
- 目的:
- テストコードとテストデータを明確に分離し、プロジェクトの整理を促進する。
go test
コマンドがtestdata
ディレクトリ内のファイルを無視するように設計されているため、テスト実行時にこれらのファイルが誤ってコンパイルされたり、テストとして実行されたりするのを防ぐ。- テストデータの場所に関する一貫した慣習を提供し、開発者がテストデータを容易に見つけられるようにする。
os.Open
関数
Go言語の標準ライブラリos
パッケージには、ファイルシステム上のファイルを開くためのOpen
関数があります。この関数は、指定されたパスのファイルを開き、*os.File
型のポインタとエラーを返します。ファイルパスは、通常、実行中のプログラムの現在の作業ディレクトリからの相対パスとして解釈されます。テストコード内でtestdata
ディレクトリ内のファイルを開く場合、"testdata/filename.txt"
のようにパスを指定する必要があります。
mime
パッケージ
mime
パッケージは、MIME(Multipurpose Internet Mail Extensions)タイプを扱うための機能を提供します。これは、インターネット上で様々な種類のデータ(テキスト、画像、音声、動画など)を識別するための標準的な方法です。例えば、HTTPレスポンスのContent-Type
ヘッダを設定する際などに使用されます。このパッケージは、ファイル拡張子に基づいてMIMEタイプを推測したり、MIMEタイプに基づいて適切なファイル拡張子を決定したりする機能を提供します。
strconv
パッケージ
strconv
パッケージは、基本的なデータ型(数値、真偽値など)と文字列との間の変換機能を提供します。例えば、文字列を整数に変換したり(Atoi
)、浮動小数点数を文字列に変換したり(FormatFloat
)する際に使用されます。このパッケージは、数値の解析やフォーマットにおいて非常に重要であり、多くのアプリケーションで利用されます。
技術的詳細
このコミットの技術的な変更は、主にファイルパスの参照の更新と、それに伴うテストデータの物理的な移動に集約されます。
-
ファイル移動:
src/pkg/mime/test.types
がsrc/pkg/mime/testdata/test.types
に移動されました。src/pkg/strconv/testfp.txt
がsrc/pkg/strconv/testdata/testfp.txt
に移動されました。 この移動は、Gitのrename
操作として記録されており、ファイルの履歴が保持されます。
-
コードの変更:
src/pkg/mime/type_unix.go
:initMimeForTests
関数内で、typeFiles
スライスに設定されるパスが"test.types"
から"testdata/test.types"
に変更されました。これは、mime
パッケージがテスト時にMIMEタイプ定義を読み込む際のファイルパスを更新するものです。src/pkg/strconv/fp_test.go
:TestFp
関数内で、os.Open
関数に渡されるファイルパスが"testfp.txt"
から"testdata/testfp.txt"
に変更されました。これは、strconv
パッケージの浮動小数点数テストが使用するテストデータファイルへのパスを更新するものです。 また、エラーメッセージ内のファイルパス参照も同様に更新され、デバッグ時の情報が正確になるように修正されています。
これらの変更は、Goのテスト慣習に準拠するための単純ながらも重要なリファクタリングであり、コードベース全体の一貫性と保守性を高めます。
コアとなるコードの変更箇所
src/pkg/mime/type_unix.go
--- a/src/pkg/mime/type_unix.go
+++ b/src/pkg/mime/type_unix.go
@@ -52,7 +52,7 @@ func initMime() {
}
func initMimeForTests() map[string]string {
- typeFiles = []string{"test.types"}
+ typeFiles = []string{"testdata/test.types"}
return map[string]string{
".t1": "application/test",
".t2": "text/test; charset=utf-8",
src/pkg/strconv/fp_test.go
--- a/src/pkg/strconv/fp_test.go
+++ b/src/pkg/strconv/fp_test.go
@@ -96,9 +96,9 @@ func myatof32(s string) (f float32, ok bool) {
}
func TestFp(t *testing.T) {
-\tf, err := os.Open("testfp.txt")
+\tf, err := os.Open("testdata/testfp.txt")
\tif err != nil {
-\t\tt.Fatal("testfp: open testfp.txt:", err)
+\t\tt.Fatal("testfp: open testdata/testfp.txt:", err)
\t}\n \tdefer f.Close()\n \n@@ -111,7 +111,7 @@ func TestFp(t *testing.T) {
\t\t\tbreak
\t\t}\n \t\tif err2 != nil {
-\t\t\tt.Fatal("testfp: read testfp.txt: " + err2.Error())
+\t\t\tt.Fatal("testfp: read testdata/testfp.txt: " + err2.Error())
\t\t}\n \t\tline = line[0 : len(line)-1]\n \t\tlineno++
@@ -120,21 +120,21 @@ func TestFp(t *testing.T) {
\t\t}\n \t\ta := strings.Split(line, " ")
\t\tif len(a) != 4 {
-\t\t\tt.Error("testfp.txt:", lineno, ": wrong field count")
+\t\t\tt.Error("testdata/testfp.txt:", lineno, ": wrong field count")
\t\t\tcontinue
\t\t}\n \t\tvar s string
@@ -130,21 +130,21 @@ func TestFp(t *testing.T) {
\t\t\tvar ok bool
\t\t\tv, ok = myatof64(a[2])
\t\t\tif !ok {
-\t\t\t\tt.Error("testfp.txt:", lineno, ": cannot atof64 ", a[2])
+\t\t\t\tt.Error("testdata/testfp.txt:", lineno, ": cannot atof64 ", a[2])
\t\t\t\tcontinue
\t\t\t}\n \t\t\ts = fmt.Sprintf(a[1], v)
\t\tcase "float32":
\t\t\tv1, ok := myatof32(a[2])
\t\t\tif !ok {
-\t\t\t\tt.Error("testfp.txt:", lineno, ": cannot atof32 ", a[2])
+\t\t\t\tt.Error("testdata/testfp.txt:", lineno, ": cannot atof32 ", a[2])
\t\t\t\tcontinue
\t\t\t}\n \t\t\ts = fmt.Sprintf(a[1], v1)
\t\t\tv = float64(v1)
\t\t}\n \t\tif s != a[3] {
-\t\t\tt.Error("testfp.txt:", lineno, ": ", a[0], " ", a[1], " ", a[2], " (", v, ") ",
+\t\t\tt.Error("testdata/testfp.txt:", lineno, ": ", a[0], " ", a[1], " ", a[2], " (", v, ") ",
\t\t\t\t"want ", a[3], " got ", s)
\t\t}\n \t}
コアとなるコードの解説
src/pkg/mime/type_unix.go
の変更
initMimeForTests()
関数は、mime
パッケージがテスト時に使用するMIMEタイプ定義ファイルを初期化するために呼び出されます。この変更により、typeFiles
スライスに格納されるファイルパスが"test.types"
から"testdata/test.types"
に更新されました。これは、test.types
ファイルがmime
パッケージのルートディレクトリからtestdata
サブディレクトリに移動されたことに対応しています。これにより、テスト実行時に正しいパスからテストデータが読み込まれるようになります。
src/pkg/strconv/fp_test.go
の変更
TestFp()
関数は、strconv
パッケージの浮動小数点数変換のテストを行うためのものです。この関数内で、os.Open("testfp.txt")
という行がos.Open("testdata/testfp.txt")
に変更されました。これは、浮動小数点数テストの入力データを含むtestfp.txt
ファイルが、strconv
パッケージのルートディレクトリからtestdata
サブディレクトリに移動されたため、その新しい場所を正確に参照するように修正されたものです。
また、ファイルを開く際や読み込む際に発生するエラーメッセージも、新しいファイルパス(testdata/testfp.txt
)を反映するように更新されています。これにより、テストが失敗した場合に表示されるエラーメッセージがより正確になり、デバッグが容易になります。
これらの変更は、Goの標準的なテストデータ管理の慣習に準拠するためのものであり、コードの可読性と保守性を向上させます。
関連リンク
- Go言語の公式ドキュメント: https://golang.org/
- Go言語のテストに関する公式ドキュメント: https://go.dev/doc/code#Testing
- Goの
testdata
ディレクトリに関する慣習: https://go.dev/blog/testdata (このブログ記事はコミット日より後に書かれていますが、testdata
の慣習について詳しく説明しています)
参考にした情報源リンク
- Go言語のコミットレビューシステム (Gerrit): https://golang.org/cl/7098072
- GitHub上のコミットページ: https://github.com/golang/go/commit/a1231839b531b15e9745e92fe2396456029729a1
- Go言語の
os
パッケージドキュメント: https://pkg.go.dev/os - Go言語の
mime
パッケージドキュメント: https://pkg.go.dev/mime - Go言語の
strconv
パッケージドキュメント: https://pkg.go.dev/strconv