[インデックス 12592] ファイルの概要
このコミットは、Goプロジェクトのテストスクリプト src/run.bat
に対する変更です。具体的には、Windows環境でテストが実際に実行され、その結果が適切に処理されるように修正されています。以前は、テストが実行されてもその結果が正しく評価されていなかった可能性があり、この変更によってテストの信頼性が向上しました。
コミット
test: actually run them on windows
R=golang-dev, r, rsc, bradfitz, minux.ma
CC=golang-dev
https://golang.org/cl/5756065
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/7c128493a41168f35201a26a6f32ee36fe9cc852
元コミット内容
commit 7c128493a41168f35201a26a6f32ee36fe9cc852
Author: Alex Brainman <alex.brainman@gmail.com>
Date: Tue Mar 13 12:51:28 2012 +1100
test: actually run them on windows
R=golang-dev, r, rsc, bradfitz, minux.ma
CC=golang-dev
https://golang.org/cl/5756065
---
src/run.bat | 8 +++++---\n 1 file changed, 5 insertions(+), 3 deletions(-)\n
変更の背景
このコミットの背景には、GoプロジェクトのテストスイートがWindows環境で期待通りに機能していなかったという問題があります。src/run.bat
は、Goプロジェクトのテストを実行するためのバッチスクリプトですが、以前の実装では、テストが失敗した場合でもスクリプトが成功として終了してしまう可能性がありました。これは、テスト実行後のエラーレベルのチェックと、それに基づくスクリプトの制御が不十分だったためです。
開発者は、Windows上でのテストの信頼性を確保し、テストの失敗が適切に報告されるようにするために、このスクリプトの修正が必要であると判断しました。これにより、CI/CDパイプラインや開発者のローカル環境でのテスト結果がより正確になり、バグの早期発見に繋がります。
前提知識の解説
このコミットを理解するためには、以下の前提知識が必要です。
- Windowsバッチスクリプト (.bat): Windowsオペレーティングシステムでコマンドを実行するためのスクリプト言語です。コマンドプロンプトで実行される一連のコマンドを記述します。
cd <directory>
: カレントディレクトリを変更するコマンドです。set <variable>=<value>
: 環境変数を設定するコマンドです。go run <file.go>
: Go言語のソースファイルをコンパイルして実行するコマンドです。if errorlevel <number> <command>
: 直前のコマンドの終了コード(エラーレベル)が指定された数値以上である場合に、指定されたコマンドを実行します。終了コードが0は通常成功を示し、0以外はエラーを示します。goto <label>
: スクリプト内の指定されたラベルに処理をジャンプさせます。%VARIABLE%
: 環境変数の値を取得します。::
またはrem
: コメント行を示します。
- Go言語のテスト: Go言語には、標準ライブラリにテストフレームワークが組み込まれています。
go test
コマンドや、go run
でテスト実行用のGoプログラムを実行することでテストが実行されます。テストが失敗すると、通常、実行されたプロセスは非ゼロの終了コードを返します。 - カレントディレクトリの概念: コマンドが実行される現在の作業ディレクトリです。相対パスはカレントディレクトリを基準に解決されます。
技術的詳細
このコミットの技術的な詳細は、src/run.bat
スクリプトにおけるテスト実行フローの改善にあります。
-
テストディレクトリへの移動:
- 変更前:
cd test
- 変更後:
cd ..\test
これは、run.bat
がsrc
ディレクトリに存在し、テストコードがtest
ディレクトリにあることを示唆しています。変更前はsrc/test
というパスを想定していましたが、実際にはsrc
の親ディレクトリにあるtest
ディレクトリに移動する必要があったため、..\test
(親ディレクトリのtest
)に修正されました。これにより、正しいテストディレクトリでgo run run.go
が実行されるようになります。
- 変更前:
-
エラーフラグの導入:
set FAIL=0
これは、テストの失敗を追跡するためのFAIL
という環境変数を導入しています。初期値は0
(成功)に設定されます。
-
テスト実行後のエラーレベルチェックの改善:
- 変更前:
go run run.go cd .. if errorlevel 1 goto fail
- 変更後:
go run run.go if errorlevel 1 set FAIL=1 cd ..\src
変更前は、
go run run.go
の直後にcd ..
が実行され、その後にif errorlevel 1 goto fail
が続きます。この場合、if errorlevel
はcd ..
コマンドの終了コードをチェックしてしまう可能性があります。cd
コマンドは通常成功するため、テストが失敗してもerrorlevel
が1
にならないという問題がありました。 変更後は、go run run.go
の直後にif errorlevel 1 set FAIL=1
が実行されます。これにより、go run run.go
の終了コードが1
以上(つまりテストが失敗)であれば、FAIL
変数を1
に設定します。このset
コマンドはerrorlevel
を変更しないため、テストの終了コードを正確に捕捉できます。その後、カレントディレクトリをsrc
に戻します。 - 変更前:
-
最終的な失敗チェック:
if %FAIL%==1 goto fail
スクリプトの最後に、導入したFAIL
変数の値が1
であるかどうかをチェックします。もしFAIL
が1
であれば、スクリプトはfail
ラベルにジャンプし、テストが失敗したことを示します。これにより、複数のテストステップがある場合でも、いずれかのステップで失敗が発生すれば、最終的にスクリプト全体が失敗として終了するようになります。
これらの変更により、run.bat
はWindows環境でGoテストをより堅牢に実行し、テストの成否を正確に報告できるようになりました。
コアとなるコードの変更箇所
--- a/src/run.bat
+++ b/src/run.bat
@@ -39,11 +39,13 @@ echo.
:: TODO: The other tests in run.bash.
echo # test
-cd test
+cd ..\test
+set FAIL=0
go run run.go
-cd ..
-if errorlevel 1 goto fail
+if errorlevel 1 set FAIL=1
+cd ..\src
echo.
+if %FAIL%==1 goto fail
echo ALL TESTS PASSED
goto end
コアとなるコードの解説
-cd test
: 削除された行。以前はsrc
ディレクトリからtest
サブディレクトリに移動しようとしていました。+cd ..\test
: 追加された行。src
ディレクトリの親ディレクトリにあるtest
ディレクトリに移動します。これにより、go run run.go
が正しいテスト実行スクリプトを見つけられるようになります。+set FAIL=0
: 追加された行。FAIL
という名前の環境変数を0
に初期化します。これは、テストが失敗したかどうかを追跡するためのフラグとして機能します。0
は「成功」を意味します。go run run.go
: この行は変更されていません。test
ディレクトリ内のrun.go
というGoプログラムを実行します。このプログラムがGoテストを実行する役割を担っています。-cd ..
: 削除された行。以前はgo run run.go
の直後に親ディレクトリに戻っていました。-if errorlevel 1 goto fail
: 削除された行。以前はcd ..
の終了コードをチェックしていたため、テストの失敗を正確に捕捉できませんでした。+if errorlevel 1 set FAIL=1
: 追加された行。go run run.go
の直後に実行されます。もしgo run run.go
が非ゼロの終了コード(エラー)を返した場合、FAIL
変数を1
に設定します。これにより、テストの失敗が正確に記録されます。+cd ..\src
: 追加された行。テスト実行後、カレントディレクトリを元のsrc
ディレクトリに戻します。echo.
: 空行を出力します。+if %FAIL%==1 goto fail
: 追加された行。FAIL
変数の値が1
(テスト失敗)であるかどうかをチェックします。もし1
であれば、スクリプトはfail
ラベルにジャンプし、テストが失敗したことを示します。これにより、スクリプト全体の終了ステータスがテスト結果を反映するようになります。
関連リンク
- Go CL 5756065: https://golang.org/cl/5756065
参考にした情報源リンク
- Windows Batch Scripting (errorlevel, set, goto, cd):
- Go Testing:
- Git Diff Format:
- Go Project Structure (implied from
src/run.bat
andtest
directory):