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

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

このコミットは、Go言語の標準ライブラリである path/filepath パッケージ内のテストファイル path_test.go において、既存の壊れたテストを一時的に無効化することを目的としています。具体的には、TestEvalSymlinksTestAbs という2つのテスト関数が、その場でリライトが必要であると判断され、実行されないように変更されました。

コミット

commit 7e5dc928a4ad95eb062afa19616de8104d32a458
Author: Russ Cox <rsc@golang.org>
Date:   Sat Feb 4 01:37:30 2012 -0500

    path/filepath: disable broken tests
    
    TBR=golang-dev
    CC=golang-dev
    https://golang.org/cl/5625050
--
 src/pkg/path/filepath/path_test.go | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/pkg/path/filepath/path_test.go b/src/pkg/path/filepath/path_test.go
index a1b0c9d584..eb869486ad 100644
--- a/src/pkg/path/filepath/path_test.go
+++ b/src/pkg/path/filepath/path_test.go
@@ -586,6 +586,9 @@ func testEvalSymlinks(t *testing.T, tests []EvalSymlinksTest) {
 }
 
 func TestEvalSymlinks(t *testing.T) {
+\tt.Logf("test needs to be rewritten; disabled")
+\treturn
+\n \tdefer os.RemoveAll("test")
 \tfor _, d := range EvalSymlinksTestDirs {
 \t\tvar err error
 @@ -645,6 +648,9 @@ var abstests = []string{
 }
 
 func TestAbs(t *testing.T) {
+\tt.Logf("test needs to be rewritten; disabled")
+\treturn
+\n \toldwd, err := os.Getwd()
 \tif err != nil {\
 \t\tt.Fatal("Getwd failed: " + err.Error())\

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

https://github.com/golang/go/commit/7e5dc928a4ad95eb062afa19616de8104d32a458

元コミット内容

path/filepath: disable broken tests

TBR=golang-dev
CC=golang-dev
https://golang.org/cl/5625050

変更の背景

このコミットの背景には、path/filepath パッケージ内の特定のテスト(TestEvalSymlinksTestAbs)が、何らかの理由で正しく機能していなかったという問題があります。テストが壊れている状態では、CI/CDパイプラインの失敗や、コード変更が既存の機能に与える影響を正確に評価できないといった問題が生じます。

開発プロセスにおいて、壊れたテストを放置することは望ましくありません。しかし、すぐに修正できない場合や、修正に時間がかかる場合には、一時的にテストを無効化して、他の開発作業やテストの実行を妨げないようにすることが一般的なプラクティスです。このコミットは、まさにその一時的な無効化措置として行われました。コミットメッセージにある「test needs to be rewritten」というコメントから、これらのテストが根本的な見直しを必要としていたことが伺えます。

前提知識の解説

Go言語の path/filepath パッケージ

path/filepath パッケージは、Go言語においてファイルパスを操作するためのユーティリティ関数を提供します。これは、オペレーティングシステムに依存しないパス操作(例: パスの結合、クリーンアップ、絶対パスへの変換、シンボリックリンクの評価など)を行うために設計されています。

  • filepath.EvalSymlinks: この関数は、与えられたパス内のシンボリックリンクを評価し、最終的な物理パスを返します。例えば、/usr/bin/go/usr/local/go/bin/go へのシンボリックリンクである場合、EvalSymlinks("/usr/bin/go")/usr/local/go/bin/go を返します。
  • filepath.Abs: この関数は、与えられたパスを絶対パスに変換します。相対パスが与えられた場合、現在の作業ディレクトリを基準にして絶対パスを構築します。

Go言語のテストフレームワーク (testing パッケージ)

Go言語には、標準ライブラリとして testing パッケージが組み込まれており、これを使ってユニットテストやベンチマークテストを記述します。

  • テスト関数の命名規則: テスト関数は Test で始まり、その後に続く名前の最初の文字が大文字である必要があります(例: TestMyFunction)。引数として *testing.T 型のポインタを受け取ります。
  • *testing.T: テストの実行中に状態を管理し、エラーやログメッセージを報告するためのメソッドを提供します。
    • t.Logf(format string, args ...interface{}): テストの実行中にログメッセージを出力します。テストが成功しても失敗しても出力されます。このコミットでは、テストが無効化されたことを示すメッセージを出力するために使用されています。
    • t.Fatal(args ...interface{}) / t.Fatalf(format string, args ...interface{}): テストを失敗としてマークし、現在のテスト関数の実行を直ちに停止します。このコミットでは、TestAbs 内で os.Getwd() が失敗した場合に t.Fatal が使用されていますが、これは無効化されたコードブロックの外にあります。
  • テストのスキップ/無効化: Goのテストフレームワークには、テストを明示的にスキップするメカニズム(t.Skip()t.Skipf())がありますが、このコミットではよりシンプルな方法が取られています。テスト関数の冒頭で t.Logf でメッセージを出力し、その直後に return を記述することで、それ以降のテストロジックが実行されないようにしています。これは、テストが一時的に壊れているが、完全に削除するのではなく、将来的に修正する意図がある場合に用いられることがあります。

技術的詳細

このコミットは、src/pkg/path/filepath/path_test.go ファイルに対して行われました。変更内容は非常にシンプルで、既存の2つのテスト関数 TestEvalSymlinksTestAbs の冒頭に、それぞれ3行のコードを追加しています。

追加されたコードは以下の通りです。

	t.Logf("test needs to be rewritten; disabled")
	return

この2行のコードが追加されたことにより、各テスト関数が実行されると、まず t.Logf によって「test needs to be rewritten; disabled」(テストは書き直す必要があります; 無効化されました)というメッセージがテスト出力に表示されます。その直後にある return ステートメントによって、テスト関数の残りの部分(実際のテストロジック)は一切実行されずに、関数が終了します。

これにより、これらのテストは実質的に無効化され、テストスイートの実行時に失敗することなく、しかしその存在と無効化された理由がログに残る形になります。これは、テストが一時的に機能しない場合に、テストスイート全体の実行を妨げずに、問題の存在を開発者に知らせるための一般的な手法です。

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

diff --git a/src/pkg/path/filepath/path_test.go b/src/pkg/path/filepath/path_test.go
index a1b0c9d584..eb869486ad 100644
--- a/src/pkg/path/filepath/path_test.go
+++ b/src/pkg/path/filepath/path_test.go
@@ -586,6 +586,9 @@ func testEvalSymlinks(t *testing.T, tests []EvalSymlinksTest) {
 }
 
 func TestEvalSymlinks(t *testing.T) {
+\tt.Logf("test needs to be rewritten; disabled")
+\treturn
+\n \tdefer os.RemoveAll("test")
 \tfor _, d := range EvalSymlinksTestDirs {
 \t\tvar err error
 @@ -645,6 +648,9 @@ var abstests = []string{
 }
 
 func TestAbs(t *testing.T) {
+\tt.Logf("test needs to be rewritten; disabled")
+\treturn
+\n \toldwd, err := os.Getwd()
 \tif err != nil {\
 \t\tt.Fatal("Getwd failed: " + err.Error())\

コアとなるコードの解説

上記の diff 出力は、src/pkg/path/filepath/path_test.go ファイルに対する変更を示しています。

  1. func TestEvalSymlinks(t *testing.T) { の変更:

    • 元のコードの588行目にあたる部分に、以下の3行が追加されました。
      	t.Logf("test needs to be rewritten; disabled")
      	return
      
    • t.Logf(...) は、テスト実行時に指定された文字列をログに出力します。ここでは、このテストが書き直される必要があり、現在無効化されていることを明示しています。
    • return は、この関数(TestEvalSymlinks)の実行を直ちに終了させます。これにより、この行以降に記述されている TestEvalSymlinks の本来のテストロジックは一切実行されなくなります。
  2. func TestAbs(t *testing.T) { の変更:

    • 同様に、元のコードの647行目にあたる部分に、以下の3行が追加されました。
      	t.Logf("test needs to be rewritten; disabled")
      	return
      
    • TestEvalSymlinks と全く同じ理由と効果で、TestAbs テスト関数も無効化され、ログメッセージが出力されるようになります。

これらの変更により、go test コマンドを実行した際に、これらのテストが失敗することなく、しかし無効化されていることが明確に示されるようになります。これは、壊れたテストがCI/CDパイプラインをブロックするのを防ぎつつ、将来的な修正の必要性を開発者に伝えるための効果的な方法です。

関連リンク

参考にした情報源リンク

  • Go言語 path/filepath パッケージ公式ドキュメント: https://pkg.go.dev/path/filepath
  • Go言語 testing パッケージ公式ドキュメント: https://pkg.go.dev/testing
  • Go言語におけるテストの書き方 (公式ブログなど): (一般的なGoのテストに関する情報源)