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

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

このコミットは、Go言語の初期のテストスイートにおけるテストコマンドの実行方法を修正し、テストが正しく機能するようにしたものです。具体的には、テストスクリプト内でファイルパスを指定する際の変数の使用方法を調整し、それによってテストの期待される出力(golden.out)も更新されました。これにより、テストが意図したコンパイルエラーを正確に検出できるようになりました。

コミット

  • コミットハッシュ: 938c5c5e2c155d32137b2230e65b95e7be52cae7
  • 作者: Robert Griesemer gri@golang.org
  • コミット日時: Fri Jun 6 17:05:53 2008 -0700
  • コミットメッセージ:
    - fixed test commands
    
    SVN=121551
    

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

https://github.com/golang/go/commit/938c5c5e2c155d32137b2230e65b95e7be52cae7

元コミット内容

このコミットの目的は、Go言語のテストスイート内で使用されているテストコマンドの不具合を修正することでした。具体的には、テストスクリプトがテスト対象のソースファイルを正しく見つけられないために発生していた「ファイルを開けない」エラーを解消し、テストが本来意図していたコンパイルエラーの検出を正常に行えるようにすることが目標でした。

変更の背景

Go言語の初期開発段階において、テストの自動化は非常に重要でした。しかし、当時のテストハーネスやスクリプトの記述方法には、まだ改善の余地がありました。このコミットが行われた背景には、以下の問題があったと考えられます。

  1. テストファイルのパス解決の失敗: 既存のテストコマンドが、テスト対象のGoソースファイル(例: bug032.go)を正しく参照できていませんでした。これは、テストが実行されるディレクトリとソースファイルの相対パスの扱いに問題があったためと考えられます。結果として、テストは「fatal error: cant open: bugXXX.go」というエラーで終了し、本来検出されるべきコンパイルエラーが検証できていませんでした。
  2. テストの有効性の欠如: テストがファイルを開けないエラーで失敗しているため、そのテストが本当に特定のバグ(この場合は「コンパイルが誤って成功する」というバグ)を検出できているのかが不明確でした。テストが正しく機能しない状態では、バグの回帰を防ぐためのセーフティネットとしての役割を果たせません。
  3. テスト結果の正確性: golden.out ファイルは、テストの期待される出力を記録するものであり、テストが正しく実行された場合にのみ意味を持ちます。ファイルオープンエラーが出力される状態では、golden.out の内容も不正確なものとなっていました。

このコミットは、これらの問題を解決し、テストスイートの信頼性と有効性を向上させるために実施されました。

前提知識の解説

このコミットを理解するためには、以下の前提知識が役立ちます。

  1. Go言語の初期開発とテスト:

    • Go言語は2009年に一般公開されましたが、このコミットはそれ以前の2008年に行われています。当時のGoコンパイラやツールチェインはまだ開発途上にあり、現在のGoとは異なる挙動やテスト手法が存在しました。
    • 初期のGoのテストは、現在のgo testコマンドのような統合されたフレームワークではなく、シェルスクリプトやMakefileを介してコンパイラを直接実行し、その出力を検証する形式が一般的でした。
  2. シェルスクリプトにおける変数とパス:

    • $G: この文脈では、GoコンパイラまたはGoツールチェインの実行可能ファイルへのパスを示すシェル変数である可能性が高いです。
    • $F: テスト対象のGoソースファイルの名前(例: bug032.go)を示すシェル変数であると考えられます。
    • $D: テスト対象のGoソースファイルが格納されているディレクトリへのパスを示すシェル変数であると考えられます。これは、テストが実行されるカレントディレクトリとは異なる場合があるため、ファイルの絶対パスまたは相対パスを正しく構築するために使用されます。
    • &&: シェルスクリプトにおける論理AND演算子です。左側のコマンドが成功した場合にのみ、右側のコマンドが実行されます。
    • echo BUG: ...: テストが特定の条件(この場合はコンパイルが誤って成功するバグ)を満たした場合に、その旨を標準出力に出力するためのコマンドです。
  3. golden.out ファイル:

    • golden.out は、テストの「ゴールデンファイル」または「リファレンス出力」として機能します。これは、テストが成功した場合に期待される標準出力や標準エラー出力の内容を事前に記録しておくファイルです。
    • テスト実行後、実際の出力が golden.out の内容と一致するかどうかを比較することで、テストの合否を判定します。特に、コンパイラのエラーメッセージや警告メッセージの正確性を検証する際に有効な手法です。
  4. コンパイルエラーのテスト:

    • ソフトウェア開発において、特定のコードが意図的にコンパイルエラーを引き起こすことを確認するテストは重要です。これは、コンパイラが不正な構文や型エラーを正しく検出できることを保証するため、あるいは特定の言語機能の制約をテストするために行われます。
    • このようなテストでは、コンパイラを実行し、その終了コードや標準エラー出力に特定のエラーメッセージが含まれていることを検証します。

技術的詳細

このコミットの技術的な核心は、テストコマンドにおけるファイルパスの解決方法の変更と、それに伴う期待されるテスト出力の更新です。

  1. テストコマンドのパス解決の修正:

    • 変更前: // $G $F.go && echo BUG: compilation succeeds incorrectly
    • 変更後: // $G $D/$F.go && echo BUG: compilation succeeds incorrectly
    • この変更は、Goコンパイラ($G)に渡すソースファイルのパスを修正しています。以前はファイル名($F.go)のみが指定されていましたが、これではテストが実行されるカレントディレクトリにそのファイルがない場合、コンパイラはファイルを見つけることができませんでした。
    • $D/$F.go とすることで、$D(テストファイルのディレクトリ)と $F.go(ファイル名)を結合し、テスト対象のGoソースファイルへの正しい絶対パスまたは相対パスを構築しています。これにより、コンパイラはテストファイルを正しく開くことができるようになり、実際のコンパイル処理に進むことが可能になりました。
  2. golden.out の更新:

    • テストコマンドの修正により、コンパイラがテストファイルを正しく開けるようになったため、以前の「fatal error: cant open: bugXXX.go」という出力は発生しなくなりました。
    • 代わりに、これらのテストファイルは、本来意図されていた「コンパイルが誤って成功する」というバグを検証するためのものであったため、コンパイラがそのバグを検出した場合(または検出しない場合)の出力が golden.out に反映されるようになりました。
    • 具体的には、golden.out 内の「bugXXX.go:0: fatal error: cant open: bugXXX.go」という行が、テストスクリプトの echo コマンドによって出力される「BUG: compilation succeeds incorrectly」という行に置き換えられています。これは、テストが正しく実行され、意図したバグの検証結果が出力されるようになったことを示しています。

この修正により、Go言語のテストスイートは、特定のコンパイルバグをより正確かつ確実に検出できるようになり、開発プロセスの品質向上に貢献しました。

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

このコミットで変更されたファイルとその差分は以下の通りです。

diff --git a/test/bugs/bug032.go b/test/bugs/bug032.go
index 1e080bae43..fb11fdfbe9 100644
--- a/test/bugs/bug032.go
+++ b/test/bugs/bug032.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.\n
 // $G $F.go && echo BUG: compilation succeeds incorrectly
+// $G $D/$F.go && echo BUG: compilation succeeds incorrectly
 
 package main
 
diff --git a/test/bugs/bug033.go b/test/bugs/bug033.go
index 9dad4075b3..603a4aa915 100644
--- a/test/bugs/bug033.go
+++ b/test/bugs/bug033.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.\n
 // $G $F.go && echo BUG: compilation succeeds incorrectly
+// $G $D/$F.go && echo BUG: compilation succeeds incorrectly
 
 package main
 
diff --git a/test/bugs/bug034.go b/test/bugs/bug034.go
index 6c48851d0e..fabd5c4816 100644
--- a/test/bugs/bug034.go
+++ b/test/bugs/bug034.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.\n
 // $G $F.go && echo BUG: compilation succeeds incorrectly
+// $G $D/$F.go && echo BUG: compilation succeeds incorrectly
 
 package main
 
diff --git a/test/golden.out b/test/golden.out
index 1ae34df1fd..269a08c46e 100644
--- a/test/golden.out
+++ b/test/golden.out
@@ -240,31 +240,31 @@ BUG: known to succeed incorrectly
 BUG: known to succeed incorrectly
 
 =========== bugs/bug032.go
-bug032.go:0: fatal error: cant open: bug032.go
+BUG: compilation succeeds incorrectly
 
 =========== bugs/bug033.go
-bug033.go:0: fatal error: cant open: bug033.go
+BUG: compilation succeeds incorrectly
 
 =========== bugs/bug034.go
-bug034.go:0: fatal error: cant open: bug034.go
+BUG: compilation succeeds incorrectly
 
 =========== bugs/bug035.go
-bug035.go:0: fatal error: cant open: bug035.go
+BUG: compilation succeeds incorrectly
 
 =========== bugs/bug036.go
-bug036.go:0: fatal error: cant open: bug036.go
+BUG: compilation succeeds incorrectly
 
 =========== bugs/bug037.go
-bug037.go:0: fatal error: cant open: bug037.go
+BUG: compilation succeeds incorrectly
 
 =========== bugs/bug038.go
-bug038.go:0: fatal error: cant open: bug038.go
+BUG: compilation succeeds incorrectly
 
 =========== bugs/bug039.go
-bug039.go:0: fatal error: cant open: bug039.go
+BUG: compilation succeeds incorrectly
 
 =========== bugs/bug040.go
-bug040.go:0: fatal error: cant open: bug040.go
+BUG: compilation succeeds incorrectly
 
 =========== fixedbugs/bug000.go
 

コアとなるコードの解説

  1. test/bugs/bug032.go, test/bugs/bug033.go, test/bugs/bug034.go の変更:

    • これらのファイルは、Go言語の特定のコンパイルバグをテストするために作成されたものです。ファイル冒頭のコメント行は、テストハーネスがこれらのテストを実行する際に使用するコマンドを示しています。
    • 変更前は // $G $F.go && ... となっていました。ここで $F.go は現在のファイル名(例: bug032.go)を指しますが、テストが実行される環境によっては、コンパイラがこのファイルを見つけられない可能性がありました。
    • 変更後は // $G $D/$F.go && ... となっています。$D はテストファイルが格納されているディレクトリのパスを表す変数であり、$D/$F.go とすることで、コンパイラに対してテストファイルの完全なパス(またはテスト実行環境から見た正しい相対パス)を提供します。これにより、コンパイラはファイルを正しく開いてコンパイル処理を進めることができるようになりました。
  2. test/golden.out の変更:

    • golden.out ファイルは、Go言語のテストスイートにおける期待される出力結果を記録しています。テスト実行後、実際の出力がこのファイルの内容と一致するかどうかでテストの合否が判断されます。
    • 変更前は、bug032.go などのテストがファイルを開けなかったために、「bug032.go:0: fatal error: cant open: bug032.go」のようなエラーメッセージが記録されていました。これは、テストが本来の目的(コンパイルバグの検出)を達成できていないことを示していました。
    • テストコマンドの修正により、ファイルオープンエラーが解消されたため、これらのテストは正しく実行されるようになりました。その結果、テストスクリプト内の echo BUG: compilation succeeds incorrectly コマンドが実行され、その出力が golden.out に反映されるようになりました。
    • この変更は、テストが正しく機能し、意図したコンパイルバグの検証結果(この場合は「コンパイルが誤って成功する」というバグの報告)が golden.out に記録されるようになったことを明確に示しています。これにより、テストスイートの信頼性が向上し、将来的に同じバグが再発した場合にそれを検出できるようになりました。

関連リンク

参考にした情報源リンク

  • Go言語の初期のテストに関する公式ドキュメントやメーリングリストのアーカイブ(具体的なURLはコミット情報からは特定できませんが、当時のGo開発コミュニティの議論が背景にあると考えられます)。
  • シェルスクリプトにおける変数展開とパス解決に関する一般的なドキュメント。
  • テストにおけるゴールデンファイル(Golden File Testing)の概念に関する一般的な情報。
  • Go言語のテストの進化に関する歴史的資料(例: Goのリリースノートやブログ記事)。