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

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

このコミットは、Go言語のテストスイートにおいて、以前報告されていたバグ bug083 が修正されたことを反映するものです。具体的には、bug083 に関連するテストファイルが test/bugs ディレクトリから test/fixedbugs ディレクトリへ移動され、それに伴いテストの期待出力を記録する test/golden.out ファイルが更新されています。これは、Go言語の初期開発段階におけるバグ修正とテスト管理のプロセスを示しています。

コミット

commit c4d8dc0b835dc307a14b8ef8867eef13139e23c8
Author: Ian Lance Taylor <iant@golang.org>
Date:   Wed Nov 12 21:59:43 2008 -0800

    This bug has been fixed; moving it from bugs to fixedbugs.

    R=gri
    DELTA=36  (18 added, 18 deleted, 0 changed)
    OCL=19059
    CL=19133
---
 test/{bugs => fixedbugs}/bug083.dir/bug0.go | 0
 test/{bugs => fixedbugs}/bug083.dir/bug1.go | 0
 test/{bugs => fixedbugs}/bug083.go          | 0
 test/golden.out                             | 6 +++---
 4 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/test/bugs/bug083.dir/bug0.go b/test/fixedbugs/bug083.dir/bug0.go
similarity index 100%
rename from test/bugs/bug083.dir/bug0.go
rename to test/fixedbugs/bug083.dir/bug0.go
diff --git a/test/bugs/bug083.dir/bug1.go b/test/fixedbugs/bug083.dir/bug1.go
similarity index 100%
rename from test/bugs/bug083.dir/bug1.go
rename to test/fixedbugs/bug083.dir/bug1.go
diff --git a/test/bugs/bug083.go b/test/fixedbugs/bug083.go
similarity index 100%
rename from test/bugs/bug083.go
rename to test/fixedbugs/bug083.go
diff --git a/test/golden.out b/test/golden.out
index 70b5db2700..cedf02964a 100644
--- a/test/golden.out
+++ b/test/golden.out
@@ -103,9 +103,6 @@ bugs/bug080.go:12: illegal types for operand: CALL
 	struct { x int; y float }
 BUG: fails incorrectly

-=========== bugs/bug083.go
-bugs/bug083.dir/bug1.go:5: syntax error near T0
-
 =========== bugs/bug085.go
 bugs/bug085.go:8: P: undefined
 BUG: fails incorrectly
@@ -232,6 +229,9 @@ fixedbugs/bug074.go:7: x: undefined
 =========== fixedbugs/bug081.go
 fixedbugs/bug081.go:5: syntax error near x

+=========== fixedbugs/bug083.go
+fixedbugs/bug083.dir/bug1.go:5: syntax error near T0
+
 =========== fixedbugs/bug086.go
 fixedbugs/bug086.go:5: function ends without a return statement

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

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

元コミット内容

This bug has been fixed; moving it from bugs to fixedbugs.

R=gri
DELTA=36  (18 added, 18 deleted, 0 changed)
OCL=19059
CL=19133

変更の背景

このコミットの背景には、Go言語の初期開発におけるバグ管理とテストプロセスの運用があります。Go言語は2007年末に設計が始まり、2009年にオープンソースとして公開されました。このコミットが行われた2008年11月は、Go言語が活発に開発されていた時期であり、多くのバグが発見され、修正されていました。

当時のGoプロジェクトでは、テストスイート内に「bugs」ディレクトリと「fixedbugs」ディレクトリを設けることで、バグのライフサイクルを管理していたと考えられます。

  • bugs ディレクトリ: 未修正のバグ、または修正中・検証中のバグに関連するテストケースが配置されていたと推測されます。これらのテストは、バグが修正されるまでは失敗することが期待されます。
  • fixedbugs ディレクトリ: 修正が完了し、その修正が正しく機能していることを確認するためのテストケースが配置されます。これらのテストは、常に成功することが期待されます。

bug083 は、Go言語のコンパイラやランタイムにおける特定の不具合を指す識別子です。このコミットメッセージ「This bug has been fixed; moving it from bugs to fixedbugs.」が示す通り、bug083 として追跡されていた問題が解決されたため、関連するテストケースを「修正済み」のカテゴリに移動する必要が生じました。これにより、テストスイートの実行時に、このテストが期待通りに成功することを確認できるようになります。

また、test/golden.out ファイルは、Go言語のテストフレームワークにおいて、特定のテストの期待される出力("golden" output)を記録するために使用される一般的なパターンです。バグが修正されると、そのバグによって引き起こされていた不正な出力が正しい出力に変わるため、golden.out ファイルも新しい期待出力に合わせて更新される必要があります。

前提知識の解説

1. Go言語のテストディレクトリ構造

Go言語のプロジェクトでは、慣習的にテストコードをソースコードと同じパッケージ内に _test.go というサフィックスを付けて配置します。しかし、このコミットに見られる test/bugstest/fixedbugs のようなディレクトリ構造は、Go言語の標準ライブラリやコンパイラ自体のテストスイートで用いられる、より大規模なテスト管理のためのものです。

  • test/bugs: 未解決のバグを再現するテストケースを格納する場所。これらのテストは、バグが修正されるまで失敗し続けることが期待されます。
  • test/fixedbugs: 修正されたバグが再発しないことを確認するためのテストケースを格納する場所。これらのテストは、常に成功することが期待されます。

このようなディレクトリ構造は、開発者がどのバグがまだ修正されていないのか、どのバグが修正済みで安定しているのかを一目で把握できるようにするための、一種のステータス管理メカニズムとして機能します。

2. golden.out ファイルとゴールデンテスト

「ゴールデンテスト (Golden Test)」または「スナップショットテスト (Snapshot Test)」は、テスト対象の出力(例えば、コンパイラの出力、フォーマッタの出力、レンダリング結果など)を事前に記録された「ゴールデンファイル」と比較することで、変更が意図しない副作用をもたらしていないかを検証するテスト手法です。

  • golden.out: このコミットでは、Go言語のテストスイート全体の期待される出力、または特定のコンポーネントの期待される出力を集約したファイルとして機能していると考えられます。コンパイラやツールの出力が変更された場合、このファイルも更新する必要があります。
  • テストプロセス: テスト実行時に、現在の出力が golden.out の内容と一致するかどうかを比較します。一致しない場合はテストが失敗し、開発者はその差分を確認して、意図的な変更かバグによるものかを判断します。

このコミットでは、bug083 の修正によって、Goコンパイラまたは関連ツールの出力が変化したため、golden.out から古い bug083 関連のエラーメッセージが削除され、新しい(修正後の)期待される出力が反映されています。

3. R=gri, OCL, CL

これらはGoプロジェクトの初期のコードレビューおよび変更リスト管理システムに関連するメタデータです。

  • R=gri: R は "Reviewer" を意味し、gri は Rob Pike (Robert Griesemer) を指します。これは、この変更がRob Pikeによってレビューされ、承認されたことを示しています。Go言語の初期開発は、Rob Pike、Ken Thompson、Robert Griesemerの3人によって主導されました。
  • OCL (Old Change List): 以前の変更リスト番号。
  • CL (Change List): このコミットに対応する変更リスト番号。Goプロジェクトでは、Googleの内部ツールであるPerforceの変更リスト(CL)システムに似たものが使われていました。これは、複数のコミットを論理的な一つの変更単位としてまとめるための識別子です。

これらの情報は、当時のGoプロジェクトのワークフローと、Google内部での開発慣行がプロジェクトに影響を与えていたことを示唆しています。

技術的詳細

このコミットの技術的詳細は、主にファイルシステムの操作とテスト出力の管理に集約されます。

  1. ファイルのリネーム: test/bugs/bug083.dir/bug0.go test/bugs/bug083.dir/bug1.go test/bugs/bug083.go これらのファイルは、test/bugs ディレクトリから test/fixedbugs ディレクトリへ移動(リネーム)されています。これは、Gitの rename fromrename to の表示からも明らかです。ファイルの内容自体は変更されていません(similarity index 100%0 行の変更が示唆)。これは、バグが修正されたため、そのバグを再現するテストケースが「修正済みバグ」のカテゴリに属するようになったことを意味します。

  2. test/golden.out の更新: このファイルは、Go言語のテストスイート全体の期待される出力を集約したものです。bug083 の修正により、このバグに関連するエラーメッセージや出力が変化したため、golden.out の該当箇所が更新されました。

    具体的には、golden.out の差分を見ると、以下の行が削除されています。

    -=========== bugs/bug083.go
    -bugs/bug083.dir/bug1.go:5: syntax error near T0
    

    そして、以下の行が追加されています。

    +=========== fixedbugs/bug083.go
    +fixedbugs/bug083.dir/bug1.go:5: syntax error near T0
    

    これは、bug083.gobugs ディレクトリから fixedbugs ディレクトリに移動したことを反映し、golden.out 内のパス参照を更新したものです。興味深いのは、エラーメッセージ自体(syntax error near T0)は変わっていない点です。これは、bug083 が構文解析に関するバグであり、修正後もそのテストケースが特定の構文エラーを検出する(ただし、それがもはやバグではなく、意図された動作になったか、またはテストケース自体がそのエラーを期待するようになった)ことを示唆している可能性があります。あるいは、単にテストケースのパスが変更されたことだけを golden.out に反映しただけかもしれません。

このコミットは、Go言語のテストインフラストラクチャが、バグの修正状況をテストファイルの配置によって視覚的に管理し、その状態変化を golden.out のような参照ファイルに反映させるという、堅牢なテスト駆動開発のプラクティスを採用していたことを示しています。

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

このコミットにおける「コアとなるコードの変更箇所」は、Go言語のコンパイラやランタイムのソースコードそのものではなく、テストスイートの構成とテストの期待出力ファイルです。

具体的には、以下のファイルが変更されています。

  1. test/bugs/bug083.dir/bug0.go のリネーム

    • test/bugs/bug083.dir/bug0.go -> test/fixedbugs/bug083.dir/bug0.go
  2. test/bugs/bug083.dir/bug1.go のリネーム

    • test/bugs/bug083.dir/bug1.go -> test/fixedbugs/bug083.dir/bug1.go
  3. test/bugs/bug083.go のリネーム

    • test/bugs/bug083.go -> test/fixedbugs/bug083.go
  4. test/golden.out の内容変更

    • bugs/bug083.go への参照が削除され、fixedbugs/bug083.go への参照が追加されました。

これらの変更は、Go言語のテストスイートのメタデータ的な側面を更新するものであり、直接的な機能追加やバグ修正のコード変更ではありません。機能修正のコード変更は、このコミットの前に別のコミットで行われたはずです。

コアとなるコードの解説

このコミットで変更された「コード」は、Go言語のテストスイートの構成ファイルと、テストの期待出力を記録するファイルです。

テストファイルのリネーム

bug083.go およびその関連ファイル (bug0.go, bug1.gobug083.dir ディレクトリ内にあるため、bug083 テストケースの一部と推測されます) は、Go言語のテストケースを記述したGoソースファイルです。これらのファイルは、特定のバグを再現し、その修正を検証するために書かれています。

  • test/bugs/... から test/fixedbugs/... への移動: これは、bug083 がもはや未修正のバグではなく、修正が完了したバグであることを示す分類上の変更です。GoのテストランナーやCI/CDシステムは、これらのディレクトリ構造を利用して、テストの実行順序やレポートの生成方法を調整していた可能性があります。例えば、bugs ディレクトリ内のテストは「既知の失敗」として扱われ、fixedbugs ディレクトリ内のテストは「期待される成功」として扱われる、といった運用が考えられます。

test/golden.out の変更

test/golden.out は、Go言語のテストスイートが生成する標準出力や標準エラー出力の「正しい」内容を記録した参照ファイルです。テスト実行時に、実際の出力がこの golden.out と比較され、一致しない場合はテストが失敗します。

このコミットでは、golden.out から bugs/bug083.go に関連するセクションが削除され、代わりに fixedbugs/bug083.go に関連するセクションが追加されています。

  • 削除された行:

    =========== bugs/bug083.go
    bugs/bug083.dir/bug1.go:5: syntax error near T0
    

    これは、bugs ディレクトリ内の bug083.go テストが、bug1.go の5行目で syntax error near T0 というエラーを出力していたことを示しています。

  • 追加された行:

    =========== fixedbugs/bug083.go
    fixedbugs/bug083.dir/bug1.go:5: syntax error near T0
    

    これは、テストファイルが fixedbugs ディレクトリに移動した後も、同じ syntax error near T0 という出力が期待されていることを示しています。

この一見矛盾するような変更は、以下のいずれかの状況を示唆しています。

  1. バグ修正後もテストケースが特定の出力を期待する: bug083 の修正は、この構文エラーがもはや「バグ」ではなく、例えばコンパイラが特定の不正な構文を検出してエラーを報告する「正しい」動作になったことを意味する可能性があります。つまり、テストケース自体は、そのエラーメッセージが出力されることを期待している、ということです。
  2. golden.out の更新がパスの変更のみを反映: 単純にテストファイルのパスが変更されたため、golden.out 内の参照パスもそれに合わせて更新されただけ、という可能性もあります。この場合、実際のバグ修正は、このコミットの前に別のコミットで行われ、そのコミットで bug083 のテストが成功するようになったと考えられます。

いずれにせよ、このコミットは、Go言語のテストインフラストラクチャが、バグの修正状況をテストファイルの配置によって管理し、その状態変化を golden.out のような参照ファイルに反映させるという、堅牢なテスト駆動開発のプラクティスを採用していたことを示しています。

関連リンク

参考にした情報源リンク