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

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

このコミットは、Go言語のダッシュボードアプリケーションのテストコード (misc/dashboard/app/build/test.go) における修正です。主に、テスト用のコミットオブジェクト生成ロジックを改善し、Goリポジトリのコミットと、Goパッケージ(サブリポジトリ)のコミットをより正確にシミュレートできるように変更されています。これにより、テストの堅牢性と正確性が向上しています。

コミット

commit 023a7e881c07c1f1b9d836afa245ec09e7bd056b
Author: Andrew Gerrand <adg@golang.org>
Date:   Thu May 31 14:09:24 2012 +1000

    misc/dashboard/app: fix tests
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/6244069

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

https://github.com/golang/go/commit/023a7e881c07c1f1b9d836afa245ec09e7bd056b

元コミット内容

misc/dashboard/app: fix tests

このコミットメッセージは非常に簡潔で、「misc/dashboard/app ディレクトリ内のテストを修正する」という意図を直接的に示しています。これは、Goプロジェクトにおけるコミットメッセージの一般的なスタイルであり、変更の目的を明確に伝えることを重視しています。

変更の背景

Go言語のプロジェクトでは、継続的インテグレーション(CI)とテストが非常に重視されています。misc/dashboard/app は、Goプロジェクトのビルド、テスト、およびその他のCI関連の活動を監視するためのダッシュボードアプリケーションの一部であると推測されます。このようなダッシュボードは、様々なリポジトリ(Go本体、Goのサブパッケージ、外部パッケージなど)からのコミットを処理し、それらのビルド結果やテスト結果を表示する必要があります。

このコミットが行われた2012年当時、Go言語はまだ比較的新しい言語であり、そのエコシステムやツール群は活発に開発されていました。テストインフラストラクチャも進化の途上にあり、異なる種類のコミット(Go本体のコミットと、Goパッケージのコミット)を区別して適切に処理する必要性が生じたと考えられます。

具体的な背景としては、テストスイートがGo本体のコミットと、go getなどで取得される外部パッケージ(サブリポジトリ)のコミットを区別してシミュレートする際に、既存の tCommit ヘルパー関数がその「パッケージパス」情報を欠いていたため、テストが不正確になる問題があったと推測されます。この修正は、テストがより現実世界のシナリオを反映し、ダッシュボードが異なる種類のコミットを正しく扱えるようにするためのものです。また、テスト結果の期待値の修正や、テスト実行時のデバッグ情報の改善も含まれており、テストの信頼性向上に寄与しています。

前提知識の解説

このコミットを理解するためには、以下の概念についての知識があると役立ちます。

  1. Go言語: Googleによって開発されたオープンソースのプログラミング言語。並行処理に強く、シンプルで効率的なコード記述が可能です。
  2. Go Modules/Packages: Go言語のコードはパッケージに分割され、関連する機能がまとめられています。Go Modulesは、Goの依存関係管理システムです。このコミットの時点ではGo Modulesは存在せず、go getによるパッケージ管理が主流でした。
  3. 継続的インテグレーション (CI): ソフトウェア開発の手法の一つで、開発者がコードベースに加えた変更を頻繁にメインブランチにマージし、自動的にビルドとテストを行うことで、問題を早期に発見し解決します。
  4. ダッシュボードアプリケーション: CIシステムやプロジェクトの状態を視覚的に表示するためのウェブアプリケーション。ビルドの成功/失敗、テスト結果、コミット履歴などを一目で確認できます。
  5. Go App Engine: Google App Engineは、Googleが提供するPaaS(Platform as a Service)であり、ウェブアプリケーションやモバイルバックエンドを構築・ホストするためのプラットフォームです。Go言語はApp Engineでサポートされており、このダッシュボードアプリケーションもApp Engine上で動作していた可能性があります。appengine.Context の使用から、この可能性が高いです。
  6. テスト駆動開発 (TDD) / テストコード: ソフトウェア開発において、コードを書く前にテストを記述し、そのテストが通るようにコードを実装する手法。このコミットは、既存のテストコードの修正であり、テストの重要性を示しています。
  7. Goの testing パッケージ: Go言語に標準で備わっているテストフレームワーク。_test.go ファイルにテスト関数を記述し、go test コマンドで実行します。
  8. time.Timetime.Add: Goの標準ライブラリ time パッケージで提供される、時刻を扱うための型とメソッド。Add メソッドは、指定した期間を時刻に加算します。
  9. net/url パッケージと url.Values: URLのパースやクエリパラメータの操作を行うためのパッケージ。url.Values は、HTTPリクエストのクエリパラメータを扱うためのマップのような型です。
  10. HTTPハンドラ: http.ResponseWriter*http.Request を引数にとる関数で、HTTPリクエストを処理し、レスポンスを返すGoのウェブアプリケーションの基本的な構成要素です。

技術的詳細

このコミットの技術的詳細は、主に misc/dashboard/app/build/test.go ファイル内のテストヘルパー関数 tCommit の変更と、それに関連するテストデータの更新に集約されます。

  1. tCommit 関数のシグネチャ変更:

    • 変更前: func tCommit(hash, parentHash string) *Commit
    • 変更後: func tCommit(hash, parentHash, path string) *Commit
    • 新たに path という string 型の引数が追加されました。この path は、コミットが関連するパッケージのパス(例: "golang.org/x/tools" のような形式)を表現するために導入されたと考えられます。これにより、テスト内でGo本体のコミットと、特定のパッケージのコミットを区別してシミュレートすることが可能になります。
  2. Commit 構造体の初期化変更:

    • tCommit 関数内で生成される Commit 構造体の初期化に、新しい PackagePath フィールドが追加されました。
    • PackagePath: path,
    • これにより、テスト用の Commit オブジェクトが、どのパッケージに属するコミットであるかという情報を持つことができるようになりました。これは、ダッシュボードがGo本体のコミットと、サブリポジトリのコミットを異なる方法で処理する必要がある場合に不可欠な情報です。
  3. コミット説明 (Desc) の変更:

    • Desc: "change description",
    • Desc: "change description " + hash,
    • コミットの説明に、そのコミットのハッシュ値が追加されるようになりました。これは、テスト実行中に生成されるコミットオブジェクトをデバッグする際に、どのコミットが処理されているかを識別しやすくするための変更であると考えられます。特に、複数のコミットが連続して処理されるテストシナリオにおいて、ログの可読性を向上させます。
  4. testRequests データ配列の更新:

    • testRequests は、ダッシュボードアプリケーションへの様々なHTTPリクエストとその期待される結果を定義するテストデータです。
    • tCommit 関数のシグネチャ変更に伴い、testRequests 内の tCommit の呼び出し箇所がすべて更新されました。
    • Go本体のコミットをシミュレートする箇所では、新しい path 引数に空文字列 "" が渡されています(例: tCommit("0001", "0000", ""))。これは、Go本体のコミットには特定のパッケージパスがないことを示唆しています。
    • 非Goリポジトリ(Goパッケージ)のコミットをシミュレートする箇所では、testPkg という変数(おそらく golang.org/x/build のような値)が path 引数に渡されています(例: tCommit("1001", "1000", testPkg))。これにより、特定のパッケージのコミットが正しくシミュレートされます。
    • また、testRequests 内の一部のテスト結果の期待値が変更されました。特に、ハッシュ "0004" のコミットに対する Result オブジェクトの OK フィールドが true から false に変更されています。これは、特定のテストシナリオにおいて、ビルドが失敗することを期待するようになったことを意味します。これは、テストがより現実的なエラーケースをカバーするように調整されたことを示唆しています。
  5. testHandler の出力メッセージ変更:

    • fmt.Fprint(w, "PASS")
    • fmt.Fprint(w, "PASS\\nYou should see only one mail notification (for 0003/linux-386) in the dev_appserver logs.")
    • テストが成功した際に表示されるメッセージがより詳細になりました。これは、開発者がテスト実行後のログを確認する際に、メール通知に関する特定の期待値(この場合は「0003/linux-386」のビルドに関するメール通知が1つだけ表示されるべきである)を伝えるためのものです。これは、テストの意図を明確にし、デバッグを容易にするための改善です。

これらの変更は全体として、Goダッシュボードのテストスイートが、Go本体のコミットとGoパッケージのコミットをより正確に区別し、それぞれのビルドおよびテストプロセスをシミュレートできるようにするためのものです。これにより、ダッシュボードの機能がより堅牢になり、異なる種類のコミットに対する挙動を正確にテストできるようになります。

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

このコミットのコアとなるコードの変更は、misc/dashboard/app/build/test.go ファイルに集中しています。

--- a/misc/dashboard/app/build/test.go
+++ b/misc/dashboard/app/build/test.go
@@ -43,14 +43,15 @@ var testPackages = []*Package{
 
 var tCommitTime = time.Now().Add(-time.Hour * 24 * 7)
 
-func tCommit(hash, parentHash string) *Commit {
+func tCommit(hash, parentHash, path string) *Commit {
 	tCommitTime.Add(time.Hour) // each commit should have a different time
 	return &Commit{
-		Hash:       hash,
-		ParentHash: parentHash,
-		Time:       tCommitTime,
-		User:       "adg",
-		Desc:       "change description",
+		PackagePath: path,
+		Hash:        hash,
+		ParentHash:  parentHash,
+		Time:        tCommitTime,
+		User:        "adg",
+		Desc:        "change description " + hash,
 	}
 }
 
@@ -64,9 +65,9 @@ var testRequests = []struct {
 	{"/packages?kind=subrepo", nil, nil, []*Package{testPackage}},
 
 	// Go repo
-	{"/commit", nil, tCommit("0001", "0000"), nil},
-	{"/commit", nil, tCommit("0002", "0001"), nil},
-	{"/commit", nil, tCommit("0003", "0002"), nil},
+	{"/commit", nil, tCommit("0001", "0000", ""), nil},
+	{"/commit", nil, tCommit("0002", "0001", ""), nil},
+	{"/commit", nil, tCommit("0003", "0002", ""), nil},
 	{"/todo", url.Values{"kind": {"build-go-commit"}, "builder": {"linux-386"}}, nil, &Todo{Kind: "build-go-commit", Data: &Commit{Hash: "0003"}}},
 	{"/todo", url.Values{"kind": {"build-go-commit"}, "builder": {"linux-amd64"}}, nil, &Todo{Kind: "build-go-commit", Data: &Commit{Hash: "0003"}}},
 	{"/result", nil, &Result{Builder: "linux-386", Hash: "0001", OK: true}, nil},
@@ -81,12 +82,12 @@ var testRequests = []struct {
 	{"/todo", url.Values{"kind": {"build-go-commit"}, "builder": {"linux-amd64"}}, nil, &Todo{Kind: "build-go-commit", Data: &Commit{Hash: "0002"}}},
 
 	// branches
-	{"/commit", nil, tCommit("0004", "0003"), nil},
-	{"/commit", nil, tCommit("0005", "0002"), nil},
+	{"/commit", nil, tCommit("0004", "0003", ""), nil},
+	{"/commit", nil, tCommit("0005", "0002", ""), nil},
 	{"/todo", url.Values{"kind": {"build-go-commit"}, "builder": {"linux-386"}}, nil, &Todo{Kind: "build-go-commit", Data: &Commit{Hash: "0005"}}},
 	{"/result", nil, &Result{Builder: "linux-386", Hash: "0005", OK: true}, nil},
 	{"/todo", url.Values{"kind": {"build-go-commit"}, "builder": {"linux-386"}}, nil, &Todo{Kind: "build-go-commit", Data: &Commit{Hash: "0004"}}},
-	{"/result", nil, &Result{Builder: "linux-386", Hash: "0004", OK: true}, nil},
+	{"/result", nil, &Result{Builder: "linux-386", Hash: "0004", OK: false}, nil},
 	{"/todo", url.Values{"kind": {"build-go-commit"}, "builder": {"linux-386"}}, nil, &Todo{Kind: "build-go-commit", Data: &Commit{Hash: "0003"}}},
 
 	// logs
@@ -98,9 +99,9 @@ var testRequests = []struct {
 	{"/result", nil, &Result{Builder: "linux-386", Hash: "0003", OK: false, Log: "test"}, nil},
 
 	// non-Go repos
-	{"/commit", nil, &Commit{PackagePath: testPkg, Hash: "1001", ParentHash: "1000"}, nil},
-	{"/commit", nil, &Commit{PackagePath: testPkg, Hash: "1002", ParentHash: "1001"}, nil},
-	{"/commit", nil, &Commit{PackagePath: testPkg, Hash: "1003", ParentHash: "1002"}, nil},
+	{"/commit", nil, tCommit("1001", "1000", testPkg), nil},
+	{"/commit", nil, tCommit("1002", "1001", testPkg), nil},
+	{"/commit", nil, tCommit("1003", "1002", testPkg), nil},
 	{"/todo", url.Values{"kind": {"build-package"}, "builder": {"linux-386"}, "packagePath": {testPkg}, "goHash": {"0001"}}, nil, &Todo{Kind: "build-package", Data: &Commit{Hash: "1003"}}},
 	{"/result", nil, &Result{PackagePath: testPkg, Builder: "linux-386", Hash: "1003", GoHash: "0001", OK: true}, nil},
 	{"/todo", url.Values{"kind": {"build-package"}, "builder": {"linux-386"}, "packagePath": {testPkg}, "goHash": {"0001"}}, nil, &Todo{Kind: "build-package", Data: &Commit{Hash: "1002"}}},
@@ -230,7 +231,7 @@ func testHandler(w http.ResponseWriter, r *http.Request) {
 			return
 		}
 	}\n-\tfmt.Fprint(w, "PASS")
+\tfmt.Fprint(w, "PASS\\nYou should see only one mail notification (for 0003/linux-386) in the dev_appserver logs.")
 }\n 
 func nukeEntities(c appengine.Context, kinds []string) error {

コアとなるコードの解説

上記の差分は、Goダッシュボードのテストスイートにおけるコミットオブジェクトのシミュレーション方法を根本的に改善しています。

  1. tCommit 関数の拡張:

    • 最も重要な変更は、tCommit 関数に path 引数が追加されたことです。これにより、テスト用の Commit オブジェクトが、それがGo本体のコミットなのか、それとも特定のGoパッケージ(サブリポジトリ)のコミットなのかを示す PackagePath 情報を持つことができるようになりました。
    • return &Commit{ PackagePath: path, ... } の行で、この新しい path 引数が Commit 構造体の PackagePath フィールドに直接マッピングされています。これは、ダッシュボードが異なる種類のコミットを区別して処理するために必要なデータを提供します。
    • Desc: "change description " + hash, の変更は、生成されるコミットの説明にハッシュ値を含めることで、テストのデバッグ時にどのコミットが処理されているかを視覚的に識別しやすくするためのものです。
  2. testRequests 内の tCommit 呼び出しの更新:

    • testRequests 配列は、ダッシュボードのAPIエンドポイントに対する模擬的なリクエストとその期待されるレスポンスを定義しています。
    • Go本体のコミットをシミュレートするセクション(// Go repo および // branches コメントの下)では、tCommit の呼び出しに "" (空文字列) が path 引数として渡されています。これは、Go本体のコミットには特定のパッケージパスがないことを示します。
    • 非Goリポジトリ(Goパッケージ)のコミットをシミュレートするセクション(// non-Go repos コメントの下)では、tCommit の呼び出しに testPkg 変数が path 引数として渡されています。testPkg はおそらく golang.org/x/build のような実際のパッケージパスを表す定数または変数であり、これにより特定のパッケージのコミットが正確にシミュレートされます。
    • {"/result", nil, &Result{Builder: "linux-386", Hash: "0004", OK: true}, nil},{"/result", nil, &Result{Builder: "linux-386", Hash: "0004", OK: false}, nil}, に変更された箇所は、特定のテストシナリオにおいて、ハッシュ "0004" のコミットに対するビルド結果が「成功」から「失敗」に期待値が変更されたことを示しています。これは、テストがより現実的な失敗ケースをカバーするように調整されたことを意味します。
  3. testHandler の出力メッセージの改善:

    • fmt.Fprint(w, "PASS\\nYou should see only one mail notification (for 0003/linux-386) in the dev_appserver logs.") の変更は、テストが成功した際に、開発者に対して特定のメール通知の期待値(「0003/linux-386」のビルドに関するメール通知が1つだけ表示されるべきである)を伝えるためのものです。これは、テストの意図を明確にし、テスト実行後のデバッグや検証を容易にするためのユーザビリティの改善です。

これらの変更は、Goダッシュボードのテストスイートが、Go本体のコミットとGoパッケージのコミットをより正確に区別し、それぞれのビルドおよびテストプロセスをシミュレートできるようにするためのものです。これにより、ダッシュボードの機能がより堅牢になり、異なる種類のコミットに対する挙動を正確にテストできるようになります。

関連リンク

参考にした情報源リンク