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

[インデックス 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言語のテストインフラストラクチャにおけるいくつかの改善とバグ修正を目的としています。

  1. golden.outの更新: 新しいテストケースや既存のテストの挙動変更に伴い、期待される出力が変更されたため、test/golden.outファイルを最新の状態に保つ必要がありました。これは、テストの正確性を保証し、将来の回帰を防ぐために重要です。
  2. test/runスクリプトの出力欠落バグの修正: 以前のtest/runスクリプトには、テストの出力が正しく捕捉されないバグが存在していました。これにより、テストが実際には失敗しているにもかかわらず、その詳細な出力が確認できないという問題が発生していました。このコミットは、この出力欠落の問題を解決し、テスト結果の可視性を向上させます。
  3. 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.outtest/runの2つのファイルに影響を与えています。

test/golden.outの変更

test/golden.outには、bugs/bug119.gobugs/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スクリプトは、シェルスクリプトであり、テストの実行と結果の評価ロジックを含んでいます。

  1. 出力欠落バグの修正: 変更前: elif test -s $TMP1FILE 変更後: elif test -s $TMP1FILE || test -s $TMP2FILE

    この変更は、テストの標準出力($TMP1FILE)と標準エラー出力($TMP2FILE)のいずれかに内容がある場合に、その出力を表示するように修正しています。以前は標準出力のみをチェックしていたため、標準エラーにのみ出力があった場合に、その出力が無視され、テストが「出力がない」と誤って判断される可能性がありました。|| (OR演算子) を使用することで、どちらかのファイルに内容があれば、そのテストの出力として認識されるようになり、出力欠落のバグが修正されました。

  2. 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.gobugs/bug120.goという2つの新しいテストケース(または既存のテストケースの更新)の期待される出力を定義しています。これらのエントリは、Goコンパイラやランタイムにおける既知のバグに関連するパニックやエラーメッセージを捕捉するためのものです。golden.outにこれらの期待値を記録することで、これらのバグが将来のコード変更によって意図せず修正されたり、あるいは挙動が変わったりした場合に、テストスイートがそれを検出し、開発者に通知できるようになります。これは、回帰テストの重要な側面です。

test/runの変更

  1. elif test -s $TMP1FILE || test -s $TMP2FILE: この変更は、テストの出力処理の堅牢性を高めます。test -s FILEは、FILEが存在し、かつサイズが0より大きい場合に真を返します。以前は標準出力ファイル($TMP1FILE)のみをチェックしていましたが、この修正により標準エラー出力ファイル($TMP2FILE)もチェックするようになりました。これにより、テストが標準エラーにのみメッセージを出力した場合でも、その出力が正しく捕捉され、表示されるようになります。これは、特にエラーメッセージやデバッグ出力が標準エラーに送られることが多いGoのテストにおいて、テスト結果の完全な可視性を確保するために重要です。

  2. elif [ $dir = "bugs" ] then echo $i succeeded with no output.: この新しい条件分岐は、Goのテストスイートの保守性を向上させるためのものです。bugs/ディレクトリは、特定のバグを再現するためのテストを格納する場所です。これらのテストは、バグが修正されるまでは失敗することが期待されます。しかし、もしbugs/内のテストが成功し、かつ何の出力も生成しなかった場合、それはそのバグが意図せず修正された可能性が高いことを示唆します。このスクリプトは、そのような状況を検出し、開発者に「このテストは出力なしで成功しました」という警告メッセージを表示します。この警告は、開発者がそのテストをfixedbugs/ディレクトリに移動することを検討するきっかけとなり、テストスイートを常に最新かつ整理された状態に保つのに役立ちます。

これらの変更は、Goのテストインフラストラクチャが、より正確にテスト結果を報告し、テストスイートの健全性を維持するための自動化されたメカニズムを提供することを示しています。

関連リンク

参考にした情報源リンク