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

[インデックス 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スクリプトにおけるテスト実行フローの改善にあります。

  1. テストディレクトリへの移動:

    • 変更前: cd test
    • 変更後: cd ..\test これは、run.batsrcディレクトリに存在し、テストコードがtestディレクトリにあることを示唆しています。変更前はsrc/testというパスを想定していましたが、実際にはsrcの親ディレクトリにあるtestディレクトリに移動する必要があったため、..\test(親ディレクトリのtest)に修正されました。これにより、正しいテストディレクトリでgo run run.goが実行されるようになります。
  2. エラーフラグの導入:

    • set FAIL=0 これは、テストの失敗を追跡するためのFAILという環境変数を導入しています。初期値は0(成功)に設定されます。
  3. テスト実行後のエラーレベルチェックの改善:

    • 変更前:
      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 errorlevelcd ..コマンドの終了コードをチェックしてしまう可能性があります。cdコマンドは通常成功するため、テストが失敗してもerrorlevel1にならないという問題がありました。 変更後は、go run run.goの直後にif errorlevel 1 set FAIL=1が実行されます。これにより、go run run.goの終了コードが1以上(つまりテストが失敗)であれば、FAIL変数を1に設定します。このsetコマンドはerrorlevelを変更しないため、テストの終了コードを正確に捕捉できます。その後、カレントディレクトリをsrcに戻します。

  4. 最終的な失敗チェック:

    • if %FAIL%==1 goto fail スクリプトの最後に、導入したFAIL変数の値が1であるかどうかをチェックします。もしFAIL1であれば、スクリプトは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ラベルにジャンプし、テストが失敗したことを示します。これにより、スクリプト全体の終了ステータスがテスト結果を反映するようになります。

関連リンク

参考にした情報源リンク