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

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

このコミットは、Go言語のテストスイートにおけるバグ関連ファイルの整理とクリーンアップを目的としています。具体的には、重複または修正済みのバグテストケースを削除または適切なディレクトリに移動し、それに伴うテスト出力の更新を行っています。

コミット

  • コミットハッシュ: f9cc900ae833b5a02e78223214fa52a8dba50145
  • 作者: Rob Pike r@golang.org
  • 日付: 2009年2月3日 (火) 16:59:26 -0800
  • 概要: バグのクリーンアップ、重複するバグテストケースの削除を含む

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

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

元コミット内容

bugs cleanup, including deleting one near-identical duplicate bug
    
R=rsc
DELTA=52  (15 added, 37 deleted, 0 changed)
OCL=24274
CL=24274

変更の背景

このコミットの主な背景は、Go言語の初期開発段階におけるテストスイートの整理と効率化です。test/bugs ディレクトリには、コンパイラやランタイムのバグを再現するためのテストケースが格納されていました。しかし、時間が経つにつれて、一部のバグは修正され、あるいは他のテストケースと重複するようになりました。

このコミットは、以下の目的で実施されました。

  1. 重複バグテストの削除: bug105.go のように、他のテストとほぼ同じ内容を持つ、またはもはや関連性のないバグテストケースを削除することで、テストスイートの冗長性を排除し、管理を容易にする。
  2. 修正済みバグテストの移動: bug041.go のように、既に修正されたバグのテストケースを test/bugs から test/fixedbugs ディレクトリへ移動することで、現在の未修正バグと修正済みバグを明確に区別し、テストの意図を明確にする。
  3. テスト出力の同期: テストケースの追加、削除、移動に伴い、test/golden.out ファイル(テストの期待される出力が記録されているファイル)を更新し、テストスイートの整合性を保つ。

これにより、テストスイートの健全性を維持し、開発者が現在のバグに集中できる環境を整えることが意図されています。

前提知識の解説

このコミットを理解するためには、以下のGo言語プロジェクトにおける一般的な慣習と概念を理解しておく必要があります。

  • Go言語のテストディレクトリ構造:
    • test/: Go言語の標準ライブラリやコンパイラ、ランタイムに関するテストケースが格納されるトップレベルのディレクトリです。
    • test/bugs/: 過去に発見された、または現在も存在するコンパイラやランタイムのバグを再現するためのテストケースが置かれるディレクトリです。これらのテストは、バグが修正されるまで失敗し続けることが期待されます。
    • test/fixedbugs/: 既に修正されたバグのテストケースが置かれるディレクトリです。これらのテストは、バグが修正されたことを確認するために存在し、常に成功することが期待されます。バグが修正された後、test/bugs から test/fixedbugs へテストケースが移動されるのが一般的なワークフローです。
  • test/golden.out:
    • これは、Go言語のテストスイートにおける「ゴールデンファイル」の一種です。特に、コンパイラのエラーメッセージや特定のテストの標準出力など、期待されるテキスト出力を記録するために使用されます。
    • テストが実行されると、実際の出力がこの golden.out ファイルの内容と比較されます。両者が一致しない場合、テストは失敗と見なされます。
    • このファイルは、テストの期待される挙動が変更された場合(例えば、バグが修正されてエラーメッセージが変わった場合や、テストケースが削除された場合)に手動で更新する必要があります。
  • OCL (Original Change List) および CL (Change List):
    • これらは、Go言語がGoogle内部で開発されていた時期に使用されていた、内部的な変更管理システム(Perforceなど)における変更リスト番号を指します。
    • OCL は元の変更リスト番号を、CL は現在の変更リスト番号を示します。この場合、両者が同じであることから、このコミットが単一の変更リストとして適用されたことを示唆しています。
    • これらの番号は、Goがオープンソース化されGitに移行した後も、初期のコミットメッセージに名残として残っていることがあります。
  • R=rsc:
    • これは、コードレビューの承認者を示します。rsc はRuss Cox氏を指し、Go言語の主要な開発者の一人です。これは、この変更がレビューされ、承認されたことを意味します。

技術的詳細

このコミットは、主にGo言語のテストスイートのファイルシステムレベルでの操作と、それに伴うテスト出力の調整を含んでいます。

  1. test/bugs/bug105.go の削除:

    • このファイルは、P という未定義のパッケージを参照しようとした際のコンパイルエラーをテストするものでした。
    • コミットメッセージに「near-identical duplicate bug」とあることから、このバグが他の既存のテストケースと重複していたか、あるいはそのバグ自体がもはや再現しない、または修正済みと判断されたため、削除されました。
    • 削除に伴い、test/golden.out から bug105.go に関連する期待されるエラー出力も削除されています。
  2. test/bugs/bug041.go から test/fixedbugs/bug041.go へのリネーム(移動):

    • bug041.go は、export of incomplete type t というエラーをテストするものでした。
    • このファイルが test/fixedbugs ディレクトリに移動されたということは、このバグが修正され、テストが成功するようになったことを意味します。
    • golden.out では、bugs/bug041.go の古いエラー出力が削除され、fixedbugs/bug041.go の新しい(おそらく成功を示す)出力が追加されています。これは、テストのパスが変更されたことと、期待される出力が更新されたことを反映しています。
  3. test/golden.out の変更:

    • このファイルは、テストスイート全体の期待される出力を集約したものです。
    • bug105.go の削除に伴い、そのテストケースに関連する12行の出力が削除されました。具体的には、bug105.go のコンパイルエラーメッセージ(P: undefinedillegal types for operand: RETURN)と、BUG: should compile というコメントが削除されています。
    • bug041.go の移動に伴い、bugs/bug041.go の古い出力(export of incomplete type t)が削除され、fixedbugs/bug041.go の新しい出力(同じエラーメッセージだが、パスが変更されている)が追加されています。これは、テストケースの場所が変更されたことを golden.out に反映させるためのものです。

これらの変更は、Go言語のテストスイートの保守性を高め、開発者がより正確なバグ情報にアクセスできるようにするための、日常的なメンテナンス作業の一環です。

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

このコミットで変更されたファイルは以下の3つです。

  1. test/bugs/bug105.go:

    • このファイルは完全に削除されました。
    • DELTA=52 (15 added, 37 deleted, 0 changed) のうち、このファイルの削除が 20 deletions を占めています。
  2. test/{bugs => fixedbugs}/bug041.go:

    • このファイルは test/bugs から test/fixedbugs へリネーム(移動)されました。
    • ファイルの内容自体は変更されていません (similarity index 100%)。
  3. test/golden.out:

    • このファイルは修正されました。
    • bug105.go に関連する出力が削除されました。
    • bug041.go のパス変更に伴う出力の調整が行われました。

具体的な変更行数:

  • test/bugs/bug105.go: 20行削除
  • test/{bugs => fixedbugs}/bug041.go: 0行変更 (リネームのみ)
  • test/golden.out: 3行追加, 9行削除

合計: 3行追加, 29行削除 (diffの統計と一致)

コアとなるコードの解説

test/bugs/bug105.go (削除されたファイル)

// Copyright 2009 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// $G $D/$F.go || echo BUG: should compile

package P

var x int

func f() int {
	return P.x  // P should be visible
}

/*
uetli:~/Source/go1/test/bugs gri$ 6g bug105.go
bug105.go:8: P: undefined
bug105.go:9: illegal types for operand: RETURN
	(<int32>INT32)
*/

このGoファイルは、P というパッケージが未定義であるにもかかわらず、P.x を参照しようとした場合にコンパイラがエラーを出すことを期待するテストでした。コメントにある $G $D/$F.go || echo BUG: should compile は、このファイルがコンパイルに失敗し、特定のバグメッセージを出すことを期待していることを示唆しています。しかし、このテストケースは削除されました。これは、このバグが修正されたか、あるいは他のテストケースと重複していたため、もはや必要ないと判断されたことを意味します。

test/{bugs => fixedbugs}/bug041.go (リネームされたファイル)

このファイルの内容はコミットログには含まれていませんが、リネームのみが行われたため、内容は変更されていません。元のファイルは test/bugs/bug041.go にあり、export of incomplete type t というエラーをテストしていました。このファイルが test/fixedbugs に移動されたことは、この「不完全な型のエクスポート」に関するバグが修正され、テストが成功するようになったことを示しています。

test/golden.out (変更されたファイル)

--- a/test/golden.out
+++ b/test/golden.out
@@ -117,9 +117,6 @@ abcxyz-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz
 =========== chan/nonblock.go
 PASS
 
-=========== bugs/bug041.go
-bugs/bug041.go:5: export of incomplete type t
-\n
 =========== bugs/bug064.go
 bugs/bug064.go:15: illegal types for operand: CALL
  int
@@ -135,12 +132,6 @@ bugs/bug087.go:8: illegal combination of literals LEN 9
 bugs/bug087.go:8: illegal combination of literals LEN 9
 BUG: fails incorrectly
 
-=========== bugs/bug105.go
-bugs/bug105.go:8: P: undefined
-bugs/bug105.go:8: illegal types for operand: RETURN
-\tint
-BUG: should compile
-\n
 =========== bugs/bug108.go
 bugs/bug108.go:4: stupid shift: 1025
 BUG: errchk: command succeeded unexpectedly:  6g bugs/bug108.go
@@ -209,6 +200,9 @@ fixedbugs/bug037.go:6: illegal types for operand: AS
 fixedbugs/bug039.go:6: variable x redeclared in this block
  previous declaration at fixedbugs/bug039.go:5
 
+=========== fixedbugs/bug041.go
+fixedbugs/bug041.go:5: export of incomplete type t
+\n
 =========== fixedbugs/bug049.go
 fixedbugs/bug049.go:6: illegal conversion of nil to string
 

この差分は、golden.out ファイルがどのように更新されたかを示しています。

  • - =========== bugs/bug041.go から始まるブロックの削除:
    • これは、test/bugs/bug041.gotest/fixedbugs/bug041.go に移動されたため、古いパスでのテスト出力エントリが不要になったことを示します。
  • - =========== bugs/bug105.go から始まるブロックの削除:
    • これは、test/bugs/bug105.go ファイルが完全に削除されたため、そのテストケースに関連する期待されるエラー出力も golden.out から削除されたことを示します。
  • + =========== fixedbugs/bug041.go から始まるブロックの追加:
    • これは、bug041.gotest/fixedbugs に移動された後、新しいパスでのテスト出力エントリが golden.out に追加されたことを示します。エラーメッセージ自体は同じですが、テストの場所が変更されたことを反映しています。

これらの変更は、テストスイートの整合性を保ち、テストの実行結果が常に最新のファイル構造と期待される挙動を反映するようにするために不可欠です。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント (テストに関する一般的な情報)
  • Go言語のソースコードリポジトリ (テストディレクトリ構造の理解)
  • Gitのドキュメンテーション (diff形式の理解)
  • Rob Pike氏のGo言語に関する講演や記事 (Go言語の初期開発に関する背景知識)