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

[インデックス 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)する際に使用されます。このパッケージは、数値の解析やフォーマットにおいて非常に重要であり、多くのアプリケーションで利用されます。

技術的詳細

このコミットの技術的な変更は、主にファイルパスの参照の更新と、それに伴うテストデータの物理的な移動に集約されます。

  1. ファイル移動:

    • src/pkg/mime/test.typessrc/pkg/mime/testdata/test.typesに移動されました。
    • src/pkg/strconv/testfp.txtsrc/pkg/strconv/testdata/testfp.txtに移動されました。 この移動は、Gitのrename操作として記録されており、ファイルの履歴が保持されます。
  2. コードの変更:

    • 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の標準的なテストデータ管理の慣習に準拠するためのものであり、コードの可読性と保守性を向上させます。

関連リンク

参考にした情報源リンク