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

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

このコミットは、Go言語のテストスイートにおける変更を記録しています。具体的には、test/args.gotest/nul1.gotest/run.go の3つのファイルが修正されており、テストの実行方法と、デフォルトで実行されるテストの範囲が調整されています。主な目的は、これまで特定の理由でスキップされていたテストを、より広範なテスト実行プロセスに含めることです。

コミット

commit 6694f14b6787b5e24699beb6bc7bebf01273e152
Author: Ian Lance Taylor <iant@golang.org>
Date:   Thu Nov 8 09:04:27 2012 -0800

    test: run some more tests by default
    
    R=golang-dev, remyoudompheng, iant, rsc
    CC=golang-dev
    https://golang.org/cl/6833043

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

https://github.com/golang/go/commit/6694f14b6787b5e24699beb6bc7bebf01273e152

元コミット内容

このコミットの元のメッセージは「test: run some more tests by default」であり、これは「デフォルトでいくつかのテストをさらに実行する」という意味です。これは、Go言語のテストインフラストラクチャにおいて、より多くのテストケースが自動的に実行されるように変更されたことを示唆しています。

変更の背景

Go言語のプロジェクトでは、コードの品質と安定性を保証するために広範なテストスイートが維持されています。しかし、特定のテストは、その性質上(例えば、特定の環境依存性、特殊な実行要件、または一時的な問題)デフォルトのテスト実行プロセスから除外されることがあります。このコミットの背景には、これらのテストが安定し、デフォルトのテストスイートに含める準備ができたという判断があったと考えられます。

具体的には、test/args.gotest/nul1.go は、以前は run.go によって実行されず、all.bash (Goプロジェクトの主要なテストスクリプト) によっても実行されないと明記されていました。これらのテストをデフォルトで実行するように変更することで、テストカバレッジを向上させ、潜在的な回帰バグを早期に発見できる可能性が高まります。

前提知識の解説

  • Go言語のテストフレームワーク: Go言語には、標準ライブラリとして testing パッケージが提供されており、ユニットテスト、ベンチマークテスト、例のテストなどを記述できます。テストファイルは通常、テスト対象のファイルと同じディレクトリに _test.go というサフィックスを付けて配置されます。
  • all.bash: Goプロジェクトのルートディレクトリにあるシェルスクリプトで、Goのビルド、テスト、リンティングなど、プロジェクト全体の健全性をチェックするための主要なスクリプトです。これは、CI/CDパイプラインや開発者がローカルで広範なテストを実行する際に使用されます。
  • test/run.go: Goプロジェクトのテストディレクトリ (test/) に存在する内部的なテスト実行ヘルパースクリプトです。これは、Goのテストフレームワークとは別に、特定のテストファイルの実行を制御したり、テスト結果を解析したりする役割を担っていた可能性があります。特に、skipOkay マップは、特定のテストファイルをデフォルトの実行から除外するためのメカニズムとして機能していました。
  • $G$L: Goのビルドスクリプトやテストスクリプトで使われるシェル変数で、それぞれGoコンパイラ (go build) とGoリンカ (go link) を指すことが多いです。
  • errorcheckoutput: Goのテストにおける特殊なコメントディレクティブの一つで、コンパイルエラーや実行時エラーの出力をチェックするために使用されます。

技術的詳細

このコミットは、主に以下の3つのファイルに対する変更を含んでいます。

  1. test/args.go:

    • 変更前:
      // $G $F.go && $L $F.$A && ./$A.out arg1 arg2
      //
      // 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.
      
    • 変更後:
      // run arg1 arg2
      
    • この変更は、テストの実行方法に関するコメントを簡略化し、run.goall.bash によってスキップされるという注記を削除しています。これは、このテストがデフォルトのテストスイートに含まれるようになったことを示しています。
  2. test/nul1.go:

    • 変更前:
      // [ "$GORUN" == "" ] || exit 0  # Android runner gets confused by the NUL output 
      // $G $D/$F.go && $L $F.$A && ./$A.out >tmp.go &&
      // errchk $G -e tmp.go
      // rm -f tmp.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.
      
    • 変更後:
      // errorcheckoutput
      
    • test/args.go と同様に、このテストが run.goall.bash によってスキップされるという注記が削除されています。また、テストの実行方法に関する詳細なシェルコマンドの記述が errorcheckoutput という簡潔なディレクティブに置き換えられています。これは、テストハーネスがこれらのディレクティブを解釈し、適切な方法でテストを実行するようになったことを示唆しています。
  3. test/run.go:

    • 変更前:
      var skipOkay = map[string]bool{
      	"args.go":                 true,
      	"index.go":                true,
      	"linkx.go":                true,
      	"nul1.go":                 true,
      	"rotate.go":               true,
      	"sigchld.go":              true,
      	"sinit.go":                true,
      
    • 変更後:
      var skipOkay = map[string]bool{
      	"linkx.go":                true,
      	"rotate.go":               true,
      	"sigchld.go":              true,
      	"sinit.go":                true,
      
    • このファイルでは、skipOkay マップから "args.go""nul1.go" のエントリが削除されています。skipOkay マップは、run.go が特定のテストファイルをスキップするかどうかを決定するために使用されていたと考えられます。これらのエントリが削除されたことにより、args.gonul1.go はデフォルトで実行されるテストのリストに含まれるようになりました。

これらの変更は、Goのテストインフラストラクチャが進化し、より多くのテストが自動化されたテストスイートの一部として実行されるようになったことを示しています。これにより、開発者はより迅速にフィードバックを得られ、コードベースの健全性を維持しやすくなります。

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

このコミットのコアとなる変更は、test/run.go ファイル内の skipOkay マップからのエントリ削除です。

--- a/test/run.go
+++ b/test/run.go
@@ -676,10 +676,7 @@ func (t *test) wantedErrors(file, short string) (errs []wantedError) {
 }
 
 var skipOkay = map[string]bool{
-	"args.go":                 true,
-	"index.go":                true,
 	"linkx.go":                true,
-	"nul1.go":                 true,
 	"rotate.go":               true,
 	"sigchld.go":              true,
 	"sinit.go":                true,

コアとなるコードの解説

skipOkay マップは、test/run.go がテストを実行する際に、特定のファイルをスキップするかどうかを判断するために使用される設定です。マップのキーはテストファイルのファイル名(例: "args.go")であり、値は true です。これは、そのファイルがスキップ対象であることを示します。

このコミットでは、"args.go""nul1.go" のエントリが skipOkay マップから削除されました。この変更により、test/run.go はこれらのファイルをスキップしなくなり、結果として all.bash などの上位のテストスクリプトによって、これらのテストがデフォルトで実行されるようになります。

これは、これらのテストが以前は特定の理由(例えば、不安定性、特殊な実行要件、または開発中の機能)で除外されていたが、現在は安定しており、通常のテストスイートに含める準備ができたことを意味します。テストカバレッジの向上と、より堅牢な回帰テストの実現に貢献します。

関連リンク

参考にした情報源リンク

  • Go言語のコミット履歴 (GitHub): https://github.com/golang/go/commits/master
  • Go言語のコードレビューシステム (Gerrit): https://go-review.googlesource.com/ (コミットメッセージに記載されている https://golang.org/cl/6833043 は、Gerritの変更リストへのリンクです。)
  • Go言語のテストに関する一般的な知識と慣習。
  • Gitの差分表示の解釈。
  • Go言語のソースコードの構造とテストディレクトリの役割。
  • all.bash スクリプトの一般的な機能。