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

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

このコミットは、Go言語のリポジトリにおけるテスト関連の変更です。具体的には、一部の壊れているテストを一時的に無効化することで、残りのテストが実行できるようにするための修正が含まれています。これにより、開発者は問題のあるテストに阻害されることなく、他の部分のテストを進めることが可能になります。

コミット

runtime,misc/cgo/test: disable broken tests so we can test the rest

R=golang-dev, minux.ma
CC=golang-dev
https://golang.org/cl/7486048

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

https://github.com/golang/go/commit/2f23f90dab3b4b96e468f98d1c1af500c8e11660

元コミット内容

commit 2f23f90dab3b4b96e468f98d1c1af500c8e11660
Author: Alex Brainman <alex.brainman@gmail.com>
Date:   Wed Mar 6 15:19:01 2013 -0500

    runtime,misc/cgo/test: disable broken tests so we can test the rest
    
    R=golang-dev, minux.ma
    CC=golang-dev
    https://golang.org/cl/7486048
---
 misc/cgo/test/cthread.go                | 4 ++++\n src/pkg/runtime/syscall_windows_test.go | 3 +++\n src/run.bat                             | 2 --
 3 files changed, 7 insertions(+), 2 deletions(-)

変更の背景

このコミットの主な背景は、Go言語のテストスイート内に存在する、特定の環境下で正しく動作しない(壊れている)テストが存在したことです。これらの壊れたテストが存在すると、CI/CDパイプラインや開発者のローカル環境でのテスト実行が失敗し、他の健全なテストの結果を確認することが困難になります。

特に、misc/cgo/test/cthread.gosrc/pkg/runtime/syscall_windows_test.go に関連するテストは、それぞれ issue/4955issue/4971 として報告されている問題に起因して失敗していました。これらの問題が解決されるまでの間、テストスイート全体の実行を妨げないようにするため、一時的にこれらのテストをスキップする措置が取られました。

また、src/run.bat の変更は、Windows環境でのCGOテストの実行フローを調整し、以前の「CGOが壊れている」というコメントとそれに関連するスキップロジックを削除することで、テスト実行の柔軟性を高める意図があったと考えられます。

前提知識の解説

  • Go言語のテストフレームワーク: Go言語には標準でtestingパッケージが提供されており、これを用いてテストを記述します。テスト関数はTestXxx(*testing.T)というシグネチャを持ちます。
  • *testing.T.Skip(): testingパッケージが提供するメソッドで、テストの実行をスキップするために使用されます。特定の条件(例: 特定のOSやアーキテクチャ、未解決のバグなど)が満たされた場合にテストをスキップする際に便利です。テストがスキップされた場合、そのテストは失敗とはみなされず、テスト結果には「スキップ」として記録されます。
  • runtime.GOARCH: Goプログラムが実行されているシステムのCPUアーキテクチャ(例: "amd64", "arm"など)を示す文字列定数です。
  • runtime.GOOS: Goプログラムが実行されているシステムのオペレーティングシステム(例: "linux", "windows", "darwin"など)を示す文字列定数です。
  • CGO: Go言語からC言語のコードを呼び出すためのメカニズムです。CGOを使用すると、既存のCライブラリをGoプログラムから利用したり、OS固有のAPIを直接呼び出したりすることができます。CGOはプラットフォーム固有の複雑さを伴うことが多く、特にクロスコンパイルや異なるOS環境での動作において問題が発生しやすい傾向があります。
  • runtime.LockedOSThread(): 現在のGoルーチンがOSスレッドにロックされているかどうかをチェックする関数です。Goルーチンは通常、複数のOSスレッド間でスケジューリングされますが、特定の低レベルな操作(例: CGOコールバック、OSシグナルハンドリングなど)では、Goルーチンを特定のOSスレッドに固定する必要がある場合があります。
  • TODOコメント: コードベースで将来的に対応が必要な事項や、一時的な回避策であることを示すために使用されるコメントです。このコミットでは、スキップされたテストが一時的なものであることを示し、関連するissueへのリンクを提供しています。

技術的詳細

このコミットは、Go言語のテストの堅牢性を向上させるための実用的なアプローチを示しています。テストスイートの一部が不安定である場合、その不安定な部分が全体のテスト結果を不正確にし、開発プロセスを遅延させる可能性があります。このコミットでは、以下の技術的詳細が考慮されています。

  1. 条件付きテストスキップ: t.Skip() を使用して、特定の環境(Windows上のcthreadテスト)や、既知のバグ(TestCallbackPanic)が存在する場合にテストをスキップしています。これは、テストが失敗する根本原因を修正するまでの間、テストスイート全体が「グリーン」な状態を維持し、他の変更による回帰を検出できるようにするための一般的なプラクティスです。
    • misc/cgo/test/cthread.go では、runtime.GOOS == "windows" の場合にテストをスキップしています。これは、Windows環境におけるCGOのcthread関連の機能に問題があったことを示唆しています(issue 4955)。
    • src/pkg/runtime/syscall_windows_test.go では、TestCallbackPanic テスト全体をスキップしています。これは、コールバック中のパニック処理に関する問題(issue 4971)が未解決であったためです。
  2. テスト実行スクリプトの調整: src/run.bat はWindows環境でのテスト実行スクリプトです。このファイルから、以前の「issue 4955 - cgo is broken」というコメントと、それに関連する goto nocgo の行が削除されています。これは、CGOテストの実行を無条件にスキップするのではなく、個々のテストファイル内でより粒度の高いスキップロジック(t.Skip())に移行したことを意味します。これにより、CGOテスト全体を無効にするのではなく、問題のある特定のテストのみを無効にすることが可能になり、テストの網羅性を維持しやすくなります。
  3. 問題追跡のためのTODOコメントとIssueリンク: スキップされたテストには、TODOコメントと関連するGo issueトラッカーへのリンク(http://golang.org/issue/4955http://golang.org/issue/4971)が追加されています。これにより、これらのテストが一時的に無効化されている理由が明確になり、将来的にこれらの問題が解決された際に、テストを再有効化するための手がかりとなります。

このアプローチは、テスト駆動開発や継続的インテグレーションの文脈において非常に重要です。壊れたテストを放置すると、テストスイートの信頼性が損なわれ、開発者がテスト結果を信用できなくなる可能性があります。一時的なスキップは、根本的な問題を解決するための時間を稼ぎつつ、開発プロセスを円滑に進めるための現実的な解決策となります。

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

misc/cgo/test/cthread.go

--- a/misc/cgo/test/cthread.go
+++ b/misc/cgo/test/cthread.go
@@ -34,6 +34,10 @@ func testCthread(t *testing.T) {
 	if runtime.GOARCH == "arm" {
 		t.Skip("testCthread disabled on arm")
 	}
+	// TODO(brainman): http://golang.org/issue/4955
+	if runtime.GOOS == "windows" {
+		t.Skip("testCthread disabled on windows: http://golang.org/issue/4955")
+	}
 
 	C.doAdd(10, 6)

src/pkg/runtime/syscall_windows_test.go

--- a/src/pkg/runtime/syscall_windows_test.go
+++ b/src/pkg/runtime/syscall_windows_test.go
@@ -172,6 +172,9 @@ func TestCallbackGC(t *testing.T) {
 }
 
 func TestCallbackPanic(t *testing.T) {
+	// TODO(brainman): http://golang.org/issue/4971
+	t.Skip("TestCallbackPanic disabled: http://golang.org/issue/4971")
+
 	// Make sure panic during callback unwinds properly.
 	if runtime.LockedOSThread() {
 		t.Fatal("locked OS thread on entry to TestCallbackPanic")

src/run.bat

--- a/src/run.bat
+++ b/src/run.bat
@@ -72,8 +72,6 @@ if errorlevel 1 goto fail
 echo.
 
 :: cgo tests
-:: issue 4955 - cgo is broken
-goto nocgo
 if x%CGO_ENABLED% == x0 goto nocgo
 echo # ..\misc\cgo\life
 go run %GOROOT%\test\run.go - ..\misc\cgo\life

コアとなるコードの解説

misc/cgo/test/cthread.go の変更

このファイルでは、testCthread 関数内に以下の行が追加されました。

	// TODO(brainman): http://golang.org/issue/4955
	if runtime.GOOS == "windows" {
		t.Skip("testCthread disabled on windows: http://golang.org/issue/4955")
	}
  • if runtime.GOOS == "windows": この条件文は、現在のオペレーティングシステムがWindowsであるかどうかをチェックします。
  • t.Skip("testCthread disabled on windows: http://golang.org/issue/4955"): もしOSがWindowsであれば、testCthread テストはスキップされます。スキップの理由として、Windows上での問題(issue 4955)が明記されています。これにより、Windows環境でのテスト実行時にこのテストが失敗するのを防ぎ、テストスイート全体の健全性を保ちます。

src/pkg/runtime/syscall_windows_test.go の変更

TestCallbackPanic 関数内に以下の行が追加されました。

	// TODO(brainman): http://golang.org/issue/4971
	t.Skip("TestCallbackPanic disabled: http://golang.org/issue/4971")
  • t.Skip("TestCallbackPanic disabled: http://golang.org/issue/4971"): この行は、TestCallbackPanic テストを無条件にスキップします。スキップの理由として、関連する問題(issue 4971)が示されています。このテストは、コールバック中にパニックが発生した場合の挙動を検証するものですが、当時の実装では問題があったため、一時的に無効化されました。

src/run.bat の変更

このバッチファイルでは、以下の2行が削除されました。

-:: issue 4955 - cgo is broken
-goto nocgo
  • :: issue 4955 - cgo is broken: これはコメント行で、CGOに問題があることを示していました。
  • goto nocgo: この行は、CGOテストのセクションをスキップし、nocgoというラベルにジャンプする命令でした。

これらの行が削除されたことにより、src/run.bat はCGOテストを無条件にスキップしなくなりました。代わりに、個々のテストファイル(例: cthread.go)内で t.Skip() を使用して、より細かくテストのスキップを制御するようになりました。これは、テスト実行の柔軟性を高め、CGOテスト全体を無効にするのではなく、問題のある特定のテストのみを無効にすることを可能にします。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント(testingパッケージ、runtimeパッケージ)
  • Go言語のIssueトラッカー(上記関連リンクのIssue 4955, 4971)
  • Go言語のソースコード(コミット内容の理解のため)
  • CGOに関する一般的な情報源(Go言語とC言語の連携について)
  • バッチファイル(.bat)の構文に関する情報源(src/run.batの理解のため)
  • Gitのdiff形式に関する情報源(変更内容の解析のため)
  • 継続的インテグレーション(CI)とテスト戦略に関する一般的な知識
  • t.Skip の利用方法に関するGo言語のテストに関する記事やドキュメント
  • runtime.GOOS および runtime.GOARCH の利用に関するGo言語のドキュメントI have generated the commit explanation as requested, following all your instructions and outputting it to standard output.