[インデックス 1141] ファイルの概要
このコミットは、Go言語のテストスイートにおけるtest/golden.out
ファイルとtest/run
スクリプトの更新を含んでいます。test/golden.out
は、特定のテストの期待される出力やエラーメッセージを記録する「ゴールデンファイル」として機能します。test/run
は、Goのテストを実行し、その結果を処理するためのシェルスクリプトです。
コミット
- コミットハッシュ:
869c3f4cd0e9a7cccb83a25cbf263080c27ffe12
- Author: Russ Cox rsc@golang.org
- Date: Mon Nov 17 12:44:22 2008 -0800
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/869c3f4cd0e9a7cccb83a25cbf263080c27ffe12
元コミット内容
update golden.out.
fix bug in run that was missing output.
make run warn about tests in bugs/ that succeed with no output
(should be moved to fixedbugs/).
R=r
DELTA=21 (18 added, 0 deleted, 3 changed)
OCL=19381
CL=19381
変更の背景
このコミットは、Go言語のテストインフラストラクチャにおけるいくつかの改善とバグ修正を目的としています。
golden.out
の更新: 新しいテストケースや既存のテストの挙動変更に伴い、期待される出力が変更されたため、test/golden.out
ファイルを最新の状態に保つ必要がありました。これは、テストの正確性を保証し、将来の回帰を防ぐために重要です。test/run
スクリプトの出力欠落バグの修正: 以前のtest/run
スクリプトには、テストの出力が正しく捕捉されないバグが存在していました。これにより、テストが実際には失敗しているにもかかわらず、その詳細な出力が確認できないという問題が発生していました。このコミットは、この出力欠落の問題を解決し、テスト結果の可視性を向上させます。bugs/
ディレクトリ内のテストに対する警告機能の追加:bugs/
ディレクトリは、既知のバグを再現するためのテストケースを格納する場所として使用されます。これらのテストは、バグが修正されるまでは失敗することが期待されます。しかし、もしbugs/
内のテストが予期せず成功し、かつ何の出力も生成しない場合、それはバグが修正された可能性を示唆しています。このコミットは、このような状況を検出し、開発者にそのテストをfixedbugs/
ディレクトリ(修正されたバグのテストを格納する場所)に移動するよう促す警告を出す機能を追加します。これにより、テストスイートの整理と保守が促進されます。
前提知識の解説
- Go言語のテストフレームワーク: Go言語には、標準ライブラリに
testing
パッケージが組み込まれており、ユニットテストやベンチマークテストを簡単に記述できます。テストファイルは通常、テスト対象のファイルと同じディレクトリに_test.go
というサフィックスを付けて配置されます。 test/golden.out
ファイル: ソフトウェア開発において、「ゴールデンファイル」または「スナップショットファイル」は、プログラムの出力や状態の期待されるバージョンを保存するために使用されます。テスト実行時に、現在の出力がゴールデンファイルの内容と比較され、一致しない場合はテストが失敗します。これにより、意図しない変更や回帰を検出できます。test/golden.out
は、Goのテストスイートにおいて、特定のテスト(特にコンパイラやランタイムのエラー出力など)の期待される出力を記録するために使用されていると考えられます。test/run
スクリプト: これは、Goのテストスイート全体を実行するためのシェルスクリプトです。Goのテストは通常go test
コマンドで実行されますが、より複雑なテストシナリオ(例えば、特定のディレクトリ構造を持つテスト、エラー出力のチェック、特定の環境設定での実行など)を管理するために、カスタムのシェルスクリプトが使用されることがあります。このスクリプトは、テストの実行、出力のキャプチャ、結果の解析、そして場合によっては特定の条件に基づく警告の生成を担当します。bugs/
およびfixedbugs/
ディレクトリ: Goプロジェクトのテストスイートでは、慣習的にbugs/
ディレクトリに既知のバグを再現するテストケースを配置し、fixedbugs/
ディレクトリに修正されたバグのテストケースを配置することがあります。bugs/
内のテストは、バグが修正されるまでは失敗することが期待されます。これにより、バグが再発した場合にすぐに検出できます。
技術的詳細
このコミットは、主にtest/golden.out
とtest/run
の2つのファイルに影響を与えています。
test/golden.out
の変更
test/golden.out
には、bugs/bug119.go
とbugs/bug120.go
に関する新しいエントリが追加されています。これらのエントリは、それぞれのテストファイルが生成するパニックメッセージやエラー出力の期待値を示しています。
-
bugs/bug119.go
:=========== bugs/bug119.go 3 74256 panic on line 85 PC=xxx BUG: should not fail
これは、
bug119.go
が実行時にパニックを起こし、そのパニックメッセージが期待される出力であることを示しています。BUG: should not fail
というコメントは、このパニックがバグであり、将来的には修正されるべきであることを示唆しています。 -
bugs/bug120.go
:=========== bugs/bug120.go Bad float64 const: 456.7 want 456.7 got 456.70000000000005 Bad float64 const: 100000000000000008388608 want 1.0000000000000001e+23 got 2.0037642052907827e+17 Bad float64 const: 1e23+8.388608e6 want 1.0000000000000001e+23 got 1e+23 bug120 panic on line 139 PC=xxx BUG: bug120
bug120.go
は、浮動小数点定数の精度に関する問題と、それに続くパニックを示しています。Bad float64 const
というメッセージは、コンパイラが浮動小数点数を正しく処理できていない可能性を示唆しており、これも既知のバグとして追跡されています。
これらの追加は、これらのバグがテストスイートによって適切に捕捉され、その出力がgolden.out
に記録されることで、将来の変更がこれらのバグの挙動に影響を与えないことを保証するためのものです。
test/run
スクリプトの変更
test/run
スクリプトは、シェルスクリプトであり、テストの実行と結果の評価ロジックを含んでいます。
-
出力欠落バグの修正: 変更前:
elif test -s $TMP1FILE
変更後:elif test -s $TMP1FILE || test -s $TMP2FILE
この変更は、テストの標準出力(
$TMP1FILE
)と標準エラー出力($TMP2FILE
)のいずれかに内容がある場合に、その出力を表示するように修正しています。以前は標準出力のみをチェックしていたため、標準エラーにのみ出力があった場合に、その出力が無視され、テストが「出力がない」と誤って判断される可能性がありました。||
(OR演算子) を使用することで、どちらかのファイルに内容があれば、そのテストの出力として認識されるようになり、出力欠落のバグが修正されました。 -
bugs/
ディレクトリ内のテストに対する警告機能の追加:+\t\telif [ $dir = "bugs" ] +\t\tthen +\t\t\techo $i succeeded with no output.
この新しいコードブロックは、現在のテストが
bugs/
ディレクトリに属しており([ $dir = "bugs" ]
)、かつ、そのテストが成功し(前のelif
条件に合致しなかった、つまり$TMP1FILE
も$TMP2FILE
も空だった)、何の出力も生成しなかった場合に実行されます。echo $i succeeded with no output.
というメッセージは、そのテストファイル($i
)が予期せず成功し、かつ出力がなかったことを開発者に警告します。これは、前述の通り、バグが修正された可能性を示唆しており、テストをfixedbugs/
に移動することを検討すべきというヒントを与えます。
コアとなるコードの変更箇所
test/golden.out
--- a/test/golden.out
+++ b/test/golden.out
@@ -135,6 +135,21 @@ bugs/bug117.go:10: illegal types for operand: RETURN
int
BUG: should compile
+=========== bugs/bug119.go
+3 74256
+
+panic on line 85 PC=xxx
+BUG: should not fail
+
+=========== bugs/bug120.go
+Bad float64 const: 456.7 want 456.7 got 456.70000000000005
+Bad float64 const: 100000000000000008388608 want 1.0000000000000001e+23 got 2.0037642052907827e+17
+Bad float64 const: 1e23+8.388608e6 want 1.0000000000000001e+23 got 1e+23
+bug120
+
+panic on line 139 PC=xxx
+BUG: bug120
+
=========== fixedbugs/bug016.go
fixedbugs/bug016.go:7: overflow converting constant to uint
test/run
--- a/test/run
+++ b/test/run
@@ -44,12 +44,15 @@ do
cat $TMP1FILE
cat $TMP2FILE
echo >&2 fail: $i
- elif test -s $TMP1FILE
+ elif test -s $TMP1FILE || test -s $TMP2FILE
then
echo
echo "===========" $i
cat $TMP1FILE
cat $TMP2FILE
+ elif [ $dir = "bugs" ]
+ then
+ echo $i succeeded with no output.
fi
done
done | # clean up some stack noise
コアとなるコードの解説
test/golden.out
の変更
このファイルへの追加は、bugs/bug119.go
とbugs/bug120.go
という2つの新しいテストケース(または既存のテストケースの更新)の期待される出力を定義しています。これらのエントリは、Goコンパイラやランタイムにおける既知のバグに関連するパニックやエラーメッセージを捕捉するためのものです。golden.out
にこれらの期待値を記録することで、これらのバグが将来のコード変更によって意図せず修正されたり、あるいは挙動が変わったりした場合に、テストスイートがそれを検出し、開発者に通知できるようになります。これは、回帰テストの重要な側面です。
test/run
の変更
-
elif test -s $TMP1FILE || test -s $TMP2FILE
: この変更は、テストの出力処理の堅牢性を高めます。test -s FILE
は、FILE
が存在し、かつサイズが0より大きい場合に真を返します。以前は標準出力ファイル($TMP1FILE
)のみをチェックしていましたが、この修正により標準エラー出力ファイル($TMP2FILE
)もチェックするようになりました。これにより、テストが標準エラーにのみメッセージを出力した場合でも、その出力が正しく捕捉され、表示されるようになります。これは、特にエラーメッセージやデバッグ出力が標準エラーに送られることが多いGoのテストにおいて、テスト結果の完全な可視性を確保するために重要です。 -
elif [ $dir = "bugs" ] then echo $i succeeded with no output.
: この新しい条件分岐は、Goのテストスイートの保守性を向上させるためのものです。bugs/
ディレクトリは、特定のバグを再現するためのテストを格納する場所です。これらのテストは、バグが修正されるまでは失敗することが期待されます。しかし、もしbugs/
内のテストが成功し、かつ何の出力も生成しなかった場合、それはそのバグが意図せず修正された可能性が高いことを示唆します。このスクリプトは、そのような状況を検出し、開発者に「このテストは出力なしで成功しました」という警告メッセージを表示します。この警告は、開発者がそのテストをfixedbugs/
ディレクトリに移動することを検討するきっかけとなり、テストスイートを常に最新かつ整理された状態に保つのに役立ちます。
これらの変更は、Goのテストインフラストラクチャが、より正確にテスト結果を報告し、テストスイートの健全性を維持するための自動化されたメカニズムを提供することを示しています。
関連リンク
- Go言語のtestingパッケージ (Goの公式ドキュメント)
- Goのテストの書き方 (Goの公式チュートリアル)
参考にした情報源リンク
- https://github.com/golang/go/commit/869c3f4cd0e9a7cccb83a25cbf263080c27ffe12
- Go言語のテストに関する一般的な知識とシェルスクリプトの構文に関する知識。
- "golden file testing" や "snapshot testing" に関する一般的な概念。