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

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

このコミットは、Go言語のテストスイートにおける既存のテストの実行方法を改善し、より効率的かつ標準的な方法でテストが実行されるように修正するものです。具体的には、test/fixedbugs ディレクトリ内のいくつかのテストにおいて、テストファイルの先頭に直接記述されていたシェルコマンド($G, $D, $F などを用いたもの)を削除し、代わりに// rundir または // errorcheckdir というディレクティブを使用するように変更しています。これにより、これらのテストがGoの標準テストランナーであるrun.goによって自動的に検出・実行されるようになり、all.bashスクリプトによる全体テストの一部として組み込まれるようになります。また、test/run.goからこれらのテストがskipOkayリストから削除され、明示的にスキップされなくなっています。

コミット

commit d9953c9ddea6467f6cd3c59ccc34546cfc0f42c8
Author: Rémy Oudompheng <oudomphe@phare.normalesup.org>
Date:   Sun Oct 7 18:37:05 2012 +0200

    test: use rundir and errorcheckdir for a few more tests.
    
    Update #4139.
    
    R=golang-dev, minux.ma
    CC=golang-dev
    https://golang.org/cl/6620070

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

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

元コミット内容

このコミットの目的は、Go言語のテストフレームワークにおいて、特定のテスト(特にtest/fixedbugsディレクトリ内のもの)がrun.goによって適切に実行されるようにすることです。以前は、これらのテストはrun.goによって実行されず、手動で./runシェルスクリプトを使用する必要がありました。これは、テストファイルの先頭に直接シェルコマンドが記述されていたためです。このコミットでは、これらの手動実行コマンドを削除し、// rundirまたは// errorcheckdirという特殊なコメントディレクティブに置き換えることで、run.goがこれらのテストを自動的に検出し、適切な方法で実行できるようにします。これにより、テストの管理と実行が簡素化され、Goのテストスイート全体の整合性が向上します。また、関連するGo issue #4139の更新も行われています。

変更の背景

Go言語のテストスイートは、test/run.goという中央のテストランナーによって管理されています。しかし、一部のテスト、特にtest/fixedbugsディレクトリ内の古いテストでは、テストファイルの先頭に直接シェルコマンドが記述されており、これらがrun.goによって自動的に実行されないという問題がありました。これらのテストは、NOTE: This test is not run by 'run.go' and so not run by all.bash. To run this test you must use the ./run shell script.というコメントが付記されていることからもわかるように、特別な手順を踏まなければ実行されませんでした。

この状況は、テストの実行と管理を複雑にし、開発者がすべてのテストが適切に実行されていることを確認するのを困難にしていました。Goのテストフレームワークは進化しており、rundirerrorcheckdirといったディレクティブが導入されたことで、より宣言的な方法でテストの実行環境や期待される結果を指定できるようになりました。

このコミットは、これらの古いテストを新しい標準に準拠させることで、テストスイート全体の自動化と保守性を向上させることを目的としています。具体的には、Go issue #4139("cmd/go: make 'go test' run tests in subdirectories")に関連しており、go testコマンドがサブディレクトリ内のテストをより適切に処理できるようにするための広範な取り組みの一環として行われました。これにより、テストの実行がよりシームレスになり、開発ワークフローが改善されます。

前提知識の解説

このコミットを理解するためには、以下のGo言語のテストに関する前提知識が必要です。

  1. Go言語のテストフレームワーク:

    • Go言語には、標準ライブラリとしてtestingパッケージが提供されており、ユニットテスト、ベンチマークテスト、サンプルテストなどを記述できます。
    • テストファイルは通常、テスト対象のファイルと同じディレクトリに_test.goというサフィックスを付けて配置されます。
    • テスト関数はTestXxxという命名規則に従い、*testing.T型の引数を取ります。
    • テストはgo testコマンドによって実行されます。
  2. Goのテストスイートとtest/run.go:

    • Go言語のソースコードリポジトリには、言語自体や標準ライブラリのテストを行うための大規模なテストスイートが含まれています。
    • test/run.goは、このテストスイート全体を管理・実行するためのカスタムテストランナーです。これは、通常のgo testコマンドではカバーしきれない、より複雑なテストシナリオ(例: 複数のファイルにまたがるテスト、コンパイルエラーを期待するテストなど)を処理するために使用されます。
    • all.bashスクリプトは、Goのビルドとテストの全体を実行するスクリプトであり、その中でtest/run.goが呼び出されます。
  3. rundirディレクティブ:

    • // rundirは、Goのテストフレームワーク(特にtest/run.go)が認識する特殊なコメントディレクティブです。
    • このディレクティブがテストファイルの先頭に記述されている場合、test/run.goは、そのテストが特定のディレクトリ構造(通常はテストファイルと同じ名前の.dirディレクトリ)内で実行されることを期待します。
    • rundirテストは、複数のソースファイルから構成されるプログラムのコンパイルと実行、または特定のファイルシステムレイアウトを必要とするテストに適しています。test/run.goは、このディレクティブを検出すると、指定されたディレクトリ内のファイルをコンパイルし、実行する処理を自動的に行います。
  4. errorcheckdirディレクティブ:

    • // errorcheckdirもまた、test/run.goが認識する特殊なコメントディレクティブです。
    • このディレクティブは、テストがコンパイルエラーや実行時エラーを意図的に発生させることを期待する場合に使用されます。
    • errorcheckdirテストは、コンパイラが特定の不正なコードを正しく検出するかどうか、またはランタイムが特定の不正な操作に対してエラーを発生させるかどうかを検証するのに役立ちます。test/run.goは、このディレクティブを検出すると、コンパイルや実行の結果としてエラーが発生することを期待し、エラーが発生しない場合はテストを失敗と判断します。
  5. $G, $D, $F, $L, $Aなどのシェル変数:

    • コミット前のテストファイルに記述されていた$G, $D/$F.dir/bug0.go, $L, $Aなどは、Goのテストスクリプト内で使用されるシェル変数やパスのプレースホルダーです。
    • $G: Goコンパイラ(go tool compile)を指すことが多いです。
    • $D: テストファイルのディレクトリを指すことが多いです。
    • $F: テストファイルの名前(拡張子なし)を指すことが多いです。
    • $L: Goリンカ(go tool link)を指すことが多いです。
    • $A: 実行可能ファイルの名前(通常はa.outまたはそれに類するもの)を指すことが多いです。
    • これらの変数を直接使用するテストは、シェルスクリプトとして実行されることを前提としており、test/run.goのようなGoプログラムによる自動解析・実行には適していませんでした。

これらの概念を理解することで、コミットがGoのテストインフラストラクチャをどのように改善し、テストの自動化と保守性を高めているかが明確になります。

技術的詳細

このコミットの技術的詳細は、Go言語のテストフレームワークにおけるテスト実行の自動化と標準化に焦点を当てています。

  1. テストディレクティブへの移行:

    • 以前は、test/fixedbugsディレクトリ内のいくつかのテスト(bug083.go, bug133.go, bug160.go, bug322.go, bug324.go, bug367.go, bug414.go)は、ファイルの先頭にシェルコマンドの形式でテストの実行方法が記述されていました。例えば、// $G $D/$F.dir/bug0.go && errchk $G $D/$F.dir/bug1.go のような形式です。
    • これらのシェルコマンドは、test/run.goのようなGoプログラムではなく、外部のシェルスクリプト(例: ./run)によって解析・実行されることを前提としていました。
    • このコミットでは、これらのシェルコマンドを削除し、代わりに// rundirまたは// errorcheckdirというGoのテストランナーが認識するディレクティブに置き換えています。
      • bug083.go, bug133.go// errorcheckdir に変更されました。これは、これらのテストがコンパイルエラーをチェックすることを意図しているためです。
      • bug160.go, bug322.go, bug324.go, bug367.go, bug414.go// rundir に変更されました。これは、これらのテストが特定のディレクトリ構造内でプログラムをコンパイル・実行することを意図しているためです。
    • この変更により、test/run.goはこれらのディレクティブを解析し、適切なテスト実行ロジックを内部で処理できるようになります。これにより、テストの実行がGoのテストフレームワークに統合され、外部スクリプトへの依存がなくなります。
  2. test/run.goskipOkayリストからの削除:

    • test/run.goには、skipOkayというマップが存在し、特定の理由でall.bashによるテスト実行時にスキップしても問題ないテストのパスがリストされていました。
    • コミット前は、bug083.go, bug133.go, bug160.go, bug322.go, bug324.go, bug367.go, bug414.goといったファイルがこのskipOkayリストに含まれていました。これは、これらのテストが前述のシェルコマンド形式で記述されており、run.goが直接実行できなかったためです。
    • このコミットでは、これらのテストがrundirまたはerrorcheckdirディレクティブを使用するように変更されたため、test/run.goがそれらを自動的に処理できるようになりました。したがって、これらのエントリはskipOkayリストから削除されました。
    • これにより、これらのテストはall.bashを実行する際に自動的に含まれるようになり、テストスイートの網羅性と信頼性が向上します。
  3. ファイルのリネームと構造変更:

    • test/fixedbugs/bug324.dir/main.gotest/fixedbugs/bug324.dir/prog.go にリネームされました。
    • test/fixedbugs/bug367.dir/main.gotest/fixedbugs/bug367.dir/prog.go にリネームされました。
    • test/fixedbugs/bug414.dir/main.go は削除され、代わりに test/fixedbugs/bug414.dir/prog.go が新規作成されました。
    • これらのリネームは、rundirディレクティブを使用するテストの慣例に合わせたものです。通常、rundirテストでは、実行されるメインのGoプログラムはprog.goという名前で、テストディレクトリのルートに配置されます。これにより、テストの構造がより一貫性を持つようになります。

これらの変更は、Goのテストインフラストラクチャをより堅牢で自動化されたものにし、開発者がテストの実行と結果の解釈をより簡単に行えるようにするための重要なステップです。

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

このコミットにおけるコアとなるコードの変更箇所は以下のファイルに集中しています。

  1. test/fixedbugs/*.go ファイル群:

    • test/fixedbugs/bug083.go
    • test/fixedbugs/bug133.go
    • test/fixedbugs/bug160.go
    • test/fixedbugs/bug322.go
    • test/fixedbugs/bug324.go
    • test/fixedbugs/bug367.go
    • test/fixedbugs/bug414.go これらのファイルでは、ファイルの先頭に記述されていたシェルコマンド形式のテスト実行指示(例: // $G $D/$F.dir/bug0.go && errchk $G $D/$F.dir/bug1.go)が削除され、代わりに// errorcheckdirまたは// rundirというディレクティブに置き換えられています。また、NOTE: This test is not run by 'run.go' ...というコメントも削除されています。
  2. test/fixedbugs/bug324.dir/main.go -> test/fixedbugs/bug324.dir/prog.go:

    • ファイル名がmain.goからprog.goに変更されました。内容は変更されていません。
  3. test/fixedbugs/bug367.dir/main.go -> test/fixedbugs/bug367.dir/prog.go:

    • ファイル名がmain.goからprog.goに変更されました。内容は変更されていません。
  4. test/fixedbugs/bug414.dir/main.go の削除と test/fixedbugs/bug414.dir/prog.go の新規作成:

    • main.goが削除され、同じ内容でprog.goが新規作成されました。これは実質的なリネームです。
    • test/fixedbugs/bug414.dir/p1.go のインデントが修正されています。
  5. test/run.go:

    • skipOkayというマップから、上記のfixedbugsテストファイルのエントリが削除されました。これにより、これらのテストがrun.goによって自動的に実行されるようになります。

これらの変更は、Goのテストスイートの自動化と標準化を推進するためのものです。

コアとなるコードの解説

test/fixedbugs/*.go ファイル群の変更

例として、test/fixedbugs/bug083.goの変更を見てみましょう。

変更前:

// $G $D/$F.dir/bug0.go && errchk $G $D/$F.dir/bug1.go

// NOTE: This test is not run by 'run.go' and so not run by all.bash.
// To run this test you must use the ./run shell script.

// 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.

ignored

変更後:

// errorcheckdir

// 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.

package ignored
  • シェルコマンドの削除: 変更前の一行目にある// $G $D/$F.dir/bug0.go && errchk $G $D/$F.dir/bug1.goのような行は、Goのテストランナーrun.goではなく、外部のシェルスクリプトによって解釈されることを意図していました。これは、Goコンパイラ($G)を使って特定のディレクトリ内のファイルをコンパイルし、エラーチェック(errchk)を行うという指示です。
  • // errorcheckdirディレクティブの追加: 変更後の一行目にある// errorcheckdirは、run.goが認識する特殊なディレクティブです。これは、このテストが特定のディレクトリ(通常はテストファイルと同じ名前の.dirディレクトリ)内で実行され、その実行結果としてコンパイルエラーや実行時エラーが発生することを期待していることを示します。run.goは、このディレクティブを検出すると、自動的に適切なコンパイルとエラーチェックのロジックを適用します。
  • NOTEコメントの削除: NOTE: This test is not run by 'run.go' ...というコメントは、このテストが手動で実行する必要があることを示していましたが、errorcheckdirディレクティブの導入により自動実行が可能になったため削除されました。
  • package ignoredの追加: 以前はignoredという単語だけでしたが、Goのソースファイルは必ずpackage宣言を持つ必要があるため、package ignoredが追加されました。これは、このファイル自体が直接実行されるプログラムではなく、テストランナーによって特別な方法で処理されることを示唆しています。

同様の変更が、bug133.goにも適用されています。

bug160.go, bug322.go, bug324.go, bug367.go, bug414.goでは、// rundirディレクティブが追加されています。これは、これらのテストが特定のディレクトリ内でプログラムをコンパイル・実行することを意図していることを示します。

test/fixedbugs/bugXXX.dir/main.go から prog.go へのリネーム

bug324.dir/main.gobug367.dir/main.gobug414.dir/main.goがそれぞれprog.goにリネームされました。 これは、rundirディレクティブを使用するテストの慣例に合わせたものです。rundirテストでは、テストディレクトリ内のメインのエントリポイントとなるGoファイルは通常prog.goという名前が付けられます。これにより、テストの構造がより標準化され、run.goがテストを処理する際に一貫した期待を持つことができます。

test/run.go の変更

変更前(抜粋):

var skipOkay = map[string]bool{
	// ...
	"fixedbugs/bug083.go":     true,
	"fixedbugs/bug133.go":     true,
	"fixedbugs/bug160.go":     true,
	"fixedbugs/bug191.go":     true,
	// ...
	"fixedbugs/bug322.go":     true,
	"fixedbugs/bug324.go":     true,
	"fixedbugs/bug345.go":     true,
	"fixedbugs/bug367.go":     true,
	// ...
	"fixedbugs/bug414.go":     true,
	// ...
}

変更後(抜粋):

var skipOkay = map[string]bool{
	// ...
	"fixedbugs/bug191.go":     true,
	"fixedbugs/bug248.go":     true, // combines errorcheckdir and rundir in the same dir.
	"fixedbugs/bug302.go":     true, // tests both .$O and .a imports.
	"fixedbugs/bug313.go":     true, // errorcheckdir with failures in the middle.
	"fixedbugs/bug345.go":     true, // needs the appropriate flags in gc invocation.
	"fixedbugs/bug369.go":     true,
	// ...
}
  • skipOkayマップは、test/run.goがテストスイート全体を実行する際に、特定のテストファイルをスキップしても問題ないことを示すために使用されます。
  • このコミットでは、bug083.go, bug133.go, bug160.go, bug322.go, bug324.go, bug367.go, bug414.goがこのリストから削除されました。
  • これは、これらのテストが// rundirまたは// errorcheckdirディレクティブを使用するように変更されたため、run.goがそれらを自動的に処理できるようになり、もはやスキップする必要がなくなったことを意味します。
  • これにより、これらのテストはGoの標準テスト実行プロセスに完全に統合され、all.bashスクリプトを実行する際に自動的に実行されるようになります。

これらの変更は、Goのテストインフラストラクチャをより効率的で保守しやすいものにし、テストの自動化レベルを高めることに貢献しています。

関連リンク

参考にした情報源リンク