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

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

このコミットは、Go言語のテストスイートにおける重要な更新を示しています。具体的には、既存のバグテストケースの整理と、コンパイラおよびランタイムの期待される出力結果を記録する golden.out ファイルの更新が主な内容です。これにより、以前はバグとして認識されていた挙動が修正され、その結果がテスト出力に反映されています。

コミット

commit c1198b9b8777ef2f570b13b76f426f7cf6857fe4
Author: Rob Pike <r@golang.org>
Date:   Thu Oct 30 13:26:57 2008 -0700

    update tests
    
    R=rsc
    DELTA=159  (65 added, 84 deleted, 10 changed)
    OCL=18149
    CL=18151
---
 test/{bugs => fixedbugs}/bug113.go |  0
 test/{bugs => fixedbugs}/bug114.go |  0
 test/{bugs => fixedbugs}/bug116.go |  0
 test/golden.out                    | 37 +++++++++----------------------------
 4 files changed, 9 insertions(+), 28 deletions(-)

diff --git a/test/bugs/bug113.go b/test/fixedbugs/bug113.go
similarity index 100%
rename from test/bugs/bug113.go
rename to test/fixedbugs/bug113.go
diff --git a/test/bugs/bug114.go b/test/fixedbugs/bug114.go
similarity index 100%
rename from test/bugs/bug114.go
rename to test/fixedbugs/bug114.go
diff --git a/test/bugs/bug116.go b/test/fixedbugs/bug116.go
similarity index 100%
rename from test/bugs/bug116.go
rename to test/fixedbugs/bug116.go
diff --git a/test/golden.out b/test/golden.out
index 219d2c4b5a..6592b17850 100644
--- a/test/golden.out
+++ b/test/golden.out
@@ -7,7 +7,7 @@ errchk: ./convlit.go: missing expected error message on line 18: 'conver|incompa
 errchk: ./convlit.go: missing expected error message on line 22: 'convert'
 errchk: ./convlit.go: missing expected error message on line 23: 'overflow'
 errchk: ./convlit.go: missing expected error message on line 24: 'overflow'
-BUG: errchk: ./convlit.go: unmatched error messages:
+errchk: ./convlit.go: unmatched error messages:
 ==================================================
 ./convlit.go:8: cannot convert non-integer constant to int
 ./convlit.go:11: overflow converting constant to int
@@ -21,11 +21,6 @@ BUG: errchk: ./convlit.go: unmatched error messages:
 =========== ./helloworld.go
 hello, world
 
-=========== ./interface1.go
-./interface1.go:29: illegal types for operand: AS
-	interface { Next () (*Inst) }
-	*Inst
-
 =========== ./interface2.go
 cannot convert type *main.S_interface2 to interface main.I_interface2: missing method Foo
 throw: interface conversion
@@ -145,14 +140,9 @@ BUG: should compile
 bugs/bug108.go:4: stupid shift: 1025
 BUG: errchk: command succeeded unexpectedly:  6g bugs/bug108.go
 
-=========== bugs/bug113.go
-BUG: should not succeed
-\
-=========== bugs/bug114.go
-(-1) & ((1<<32) - 1) is 1073741823 should be 4294967295
-\
-panic on line 78 PC=xxx
-BUG: bug114 failed
+=========== bugs/bug115.go
+bugs/bug115.go:8: overflow converting constant to uint
+BUG: bug115 should compile
 
 =========== fixedbugs/bug016.go
 fixedbugs/bug016.go:7: overflow converting constant to uint
@@ -265,18 +255,9 @@ M
 =========== fixedbugs/bug103.go
 fixedbugs/bug103.go:8: function requires a return type
 
-=========== bugs/bug115.go
-bugs/bug115.go:8: overflow converting constant to uint
-BUG: bug115 should compile
-\
-=========== bugs/bug116.go
--5>>1 = -2 want -3
--4>>1 = -3 want -2
--3>>1 = -1 want -2
--2>>1 = -2 want -1
--1>>1 = 0 want -1
-errors
-\
-panic on line 92 PC=xxx
-BUG: bug116
+=========== fixedbugs/bug113.go
+throw: ifaceI2T: wrong type
+SIGSEGV: segmentation violation
+Faulting address: 0x0
+pc: xxx

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

https://github.com/golang/go/commit/c1198b9b8777ef2f570b13b76f426f7cf6857fe4

元コミット内容

update tests

変更の背景

このコミットは、Go言語の初期開発段階におけるバグ修正とテストインフラの成熟を反映しています。test/bugs ディレクトリから test/fixedbugs ディレクトリへのテストファイルの移動は、これらのバグが修正されたことを示唆しています。コンパイラやランタイムの挙動が修正された結果、以前はエラーや予期せぬ動作を引き起こしていたテストケースが、期待される正しい出力を生成するようになったため、その変更を test/golden.out ファイルに反映させる必要がありました。

特に、golden.out はGoコンパイラやランタイムの出力の「ゴールデンリファレンス」として機能しており、このファイルが更新されるということは、Goのツールチェインの挙動に重要な変更があったことを意味します。これは、開発者がバグを特定し、修正し、その修正が期待通りに機能することを確認する、継続的なプロセスの一部です。

前提知識の解説

Go言語の初期開発

Go言語は、Googleによって2007年に設計が開始され、2009年にオープンソースとして公開されました。このコミットの日付(2008年10月30日)は、Goがまだ活発な開発段階にあり、言語仕様、コンパイラ、ランタイムが急速に進化していた時期であることを示しています。この時期のコミットは、言語の基盤を固めるための重要な変更を含んでいることが多いです。

テスト駆動開発と回帰テスト

ソフトウェア開発において、テストは品質保証の要です。特に、バグ修正後にそのバグが再発しないことを保証するために「回帰テスト(Regression Test)」が重要になります。Go言語のテストスイートは、このような回帰テストの役割を担っています。

ゴールデンファイルテスト (Golden File Testing)

ゴールデンファイルテストは、プログラムの出力が特定の「ゴールデンファイル」(期待される出力を含むファイル)の内容と一致するかどうかを検証するテスト手法です。コンパイラ、パーサー、コードジェネレーターなど、複雑なテキスト出力を生成するツールで特に有効です。

このコミットにおける test/golden.out は、Goコンパイラやランタイムが様々なテストケースを実行した際の標準出力やエラー出力の期待値を記録したゴールデンファイルであると考えられます。テスト実行時に生成される実際の出力と golden.out の内容を比較することで、コンパイラやランタイムの挙動に意図しない変更がないかを確認します。

test/bugstest/fixedbugs ディレクトリ

Go言語のテストディレクトリ構造において、test/bugs は通常、まだ修正されていない、または現在調査中のバグに関連するテストケースを格納するために使用されます。一方、test/fixedbugs は、既に修正されたバグの回帰テストケースを格納するために使用されます。テストファイルが bugs から fixedbugs へ移動されることは、そのバグが解決されたことを明確に示します。

技術的詳細

このコミットの技術的詳細は、主にGoコンパイラとランタイムの安定性向上、およびテストインフラの整備に焦点を当てています。

  1. バグの修正とテストの移動: bug113.go, bug114.go, bug116.go の3つのテストファイルが test/bugs から test/fixedbugs へ移動されました。これは、これらのテストが以前はGoのコンパイラまたはランタイムのバグを露呈させていたが、このコミット以前またはこのコミットによってそのバグが修正されたことを意味します。これにより、これらのテストはもはや「未解決のバグ」ではなく、「修正済みのバグに対する回帰テスト」として機能するようになりました。

  2. test/golden.out の更新: golden.out ファイルの変更は、Goコンパイラおよびランタイムの出力が、バグ修正の結果として変化したことを直接的に示しています。

    • ./convlit.go に関する BUG: errchk: の削除: 以前は convlit.go のエラーチェックに「バグ」のマークが付いていましたが、これが削除されたことで、そのエラーチェックの挙動が期待通りになったことを示唆しています。
    • ./interface1.go の出力ブロックの削除: interface1.go のテスト出力が golden.out から完全に削除されました。これは、テスト自体が削除されたか、リファクタリングされたか、あるいはその出力がもはや golden.out で追跡する必要がないと判断されたことを意味します。
    • bugs/bug113.go, bugs/bug114.go, bugs/bug116.go の出力ブロックの削除: これらのテストが fixedbugs ディレクトリに移動されたことに伴い、golden.out から以前の「バグ」としての出力が削除されました。これは、これらのテストがもはや以前のようなエラーや予期せぬ出力を生成しないことを反映しています。
    • bugs/bug115.go の出力ブロックの追加と削除、そして fixedbugs/bug113.go の出力ブロックの追加: bug115.go の出力が golden.out 内で移動し、その内容が更新された可能性があります。また、fixedbugs/bug113.go の新しい出力として、throw: ifaceI2T: wrong typeSIGSEGV といったランタイムエラーが記録されています。これは、bug113.go が修正された結果、以前とは異なる、しかし現在は「期待される」エラー(例えば、コンパイラが以前は検出できなかった型エラーを正しく検出するようになった、あるいは特定の条件下でランタイムが意図的にパニックするようになった)を生成するようになったことを示唆しています。Goの初期段階では、コンパイラやランタイムがエラーを正しく報告するようになることも重要な進歩でした。

これらの変更は、Go言語のコンパイラとランタイムがより堅牢になり、バグが修正され、その挙動がより予測可能になったことを示しています。また、テストスイートがこれらの変更を正確に反映するように更新され、将来の回帰を防ぐための基盤が強化されました。

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

このコミットでは、Go言語のソースコード自体ではなく、テスト関連のファイルが変更されています。

  1. ファイルのリネーム:

    • test/bugs/bug113.go -> test/fixedbugs/bug113.go
    • test/bugs/bug114.go -> test/fixedbugs/bug114.go
    • test/bugs/bug116.go -> test/fixedbugs/bug116.go
  2. test/golden.out の内容変更:

    • ./convlit.go のエラーメッセージから BUG: プレフィックスが削除されました。
    • ./interface1.go のテスト出力ブロックが削除されました。
    • bugs/bug113.go, bugs/bug114.go, bugs/bug116.go のテスト出力ブロックが削除されました。
    • bugs/bug115.go のテスト出力ブロックが移動し、内容が更新されました。
    • fixedbugs/bug113.go の新しいテスト出力ブロックが追加され、特定のランタイムエラー(throw: ifaceI2T: wrong type, SIGSEGV)が期待される出力として記録されました。

コアとなるコードの解説

このコミットにおける「コアとなるコード」は、Go言語のコンパイラやランタイムのテスト結果を記録する test/golden.out ファイルと、そのテストケースを格納するディレクトリ構造です。

test/golden.out の変更は、Goコンパイラとランタイムの挙動が、特定の入力(テストケース)に対して変化したことを示しています。これは、バグ修正や言語仕様の調整の結果として発生します。例えば、以前はコンパイルエラーにならなかったコードが、バグ修正によって正しくエラーとして検出されるようになった場合、golden.out にそのエラーメッセージが追加されます。逆に、以前はエラーになっていたコードが修正によってコンパイル可能になった場合、そのエラーメッセージは golden.out から削除されます。

test/bugs から test/fixedbugs へのテストファイルの移動は、単なるファイルパスの変更以上の意味を持ちます。これは、Go開発チームがバグを追跡し、修正し、その修正が永続的であることを保証するための、体系的なアプローチの一部です。fixedbugs ディレクトリ内のテストは、将来の変更がこれらの修正されたバグを再導入しないことを確認するための回帰テストとして機能します。

特に fixedbugs/bug113.go の新しい出力として SIGSEGV が記録されている点は注目に値します。これは、Goの初期段階において、コンパイラやランタイムが特定の不正なコードに対して、より明確なエラー(この場合はセグメンテーション違反)を報告するようになったことを示している可能性があります。これは、以前は未定義の挙動やクラッシュを引き起こしていたものが、より予測可能でデバッグしやすいエラーに変わったという、システムの堅牢性向上の一環と解釈できます。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメントや初期の設計に関する情報(一般的な知識として参照)
  • ソフトウェアテストにおけるゴールデンファイルテストの概念(一般的な知識として参照)
  • Go言語のテストディレクトリ構造に関する慣習(一般的な知識として参照)