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

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

このコミットは、Go言語のテストスイートにおけるtest/fixedbugs/bug424.goファイルの実行方法の修正と、それに伴うtest/golden.outからの関連出力の削除を目的としています。具体的には、テストスクリプトがこの特定のバグテストをどのように実行するかを明示的に指定することで、テストの信頼性を向上させています。

コミット

commit d12f1ff7ad6ce477819d2e3ba596390ca9aa568a
Author: Ian Lance Taylor <iant@golang.org>
Date:   Thu Mar 22 12:48:41 2012 -0700

    test: fix run.bash by spelling out the commands to use for bug424.go
    
    R=golang-dev, gri, iant
    CC=golang-dev
    https://golang.org/cl/5882046

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

https://github.com/golang/go/commit/d12f1ff7ad6ce477819d2e3ba596390ca9aa568a

元コミット内容

test: fix run.bash by spelling out the commands to use for bug424.go
    
R=golang-dev, gri, iant
CC=golang-dev
https://golang.org/cl/5882046

変更の背景

Go言語のテストフレームワークでは、テストファイルの先頭に特別なコメントディレクティブを記述することで、そのテストの実行方法を制御できます。以前は、test/fixedbugs/bug424.goファイルは単に// runというディレクティブを使用していました。これは、テストスクリプトがそのファイルを通常のGoプログラムとしてコンパイル・実行することを意味します。

しかし、bug424.goは、同じディレクトリ内のlib.goという別のファイルに依存していました。従来の// runディレクティブでは、テストスクリプトがこの依存関係を適切に処理できず、テストの実行が失敗する可能性がありました。このコミットは、この問題を解決するために、run.bashスクリプトがbug424.goを正しくコンパイル・実行できるように、より明示的なコマンドシーケンスを指定するように変更されました。

また、test/golden.outファイルは、特定のテストの期待される出力を記録するファイルです。bug424.goのテスト実行方法が変更されたため、以前のテスト実行で記録された不正確な出力が不要になり、削除されました。

前提知識の解説

  • Go言語のテストフレームワーク: Go言語には、go testコマンドを通じて利用できる組み込みのテストフレームワークがあります。テストファイルは通常、_test.goというサフィックスを持ちますが、特定のバグを再現するためのテスト(fixedbugsディレクトリ内のファイルなど)は、通常のGoプログラムとして記述され、特別なディレクティブによって実行されます。
  • // runディレクティブ: Goのテストファイルにおいて、ファイルの先頭に// runと記述することで、そのファイルが通常のGoプログラムとしてコンパイルされ、実行されることをテストスクリプトに指示します。これは、特定のバグの再現や、言語機能の動作確認など、go testの標準的なテスト関数(TestXxx)では表現しにくいシナリオで利用されます。
  • $G, $D, $F, $L, $A: これらはGoのテストスクリプト内で使用されるシェル変数です。
    • $G: Goコンパイラ(go tool compile)へのパス。
    • $D: 現在のテストファイルのディレクトリへのパス。
    • $F: 現在のテストファイルのベース名(例: bug424.go)。
    • $L: Goリンカ(go tool link)へのパス。
    • $A: 実行可能ファイルの出力名(通常はa.outまたはテストファイル名に基づく)。
  • test/golden.out: Goのテストスイートにおいて、一部のテストは標準出力に特定の文字列を出力することを期待します。これらの期待される出力はtest/golden.outファイルに記録されており、テスト実行時の実際の出力と比較されます。これにより、テストの出力が意図せず変更されていないかを確認できます。

技術的詳細

このコミットの主要な変更点は、test/fixedbugs/bug424.goの先頭行のディレクティブを// runから、より詳細なシェルコマンドシーケンスに変更したことです。

変更前:

// run

変更後:

// $G $D/$F.dir/lib.go && $G $D/$F.go && $L $F.$A && ./$A.out

この新しいディレクティブは、以下のステップを明示的に実行するようにテストスクリプトに指示します。

  1. $G $D/$F.dir/lib.go: lib.goファイルをGoコンパイラ($G)でコンパイルします。$D/$F.dirは、bug424.goと同じディレクトリ内のbug424.dirというサブディレクトリを指している可能性があります(元のファイル名がbug424.goであるため、慣例的にbug424.dirというディレクトリが作成され、その中に依存ファイルが配置されることがあります)。これにより、lib.goが先にコンパイルされ、そのオブジェクトファイルが利用可能になります。
  2. &&: 前のコマンドが成功した場合にのみ次のコマンドを実行します。
  3. $G $D/$F.go: bug424.goファイルをGoコンパイラ($G)でコンパイルします。この際、先にコンパイルされたlib.goのオブジェクトファイルがリンクされます。
  4. &&: 前のコマンドが成功した場合にのみ次のコマンドを実行します。
  5. $L $F.$A: コンパイルされたオブジェクトファイルをGoリンカ($L)でリンクし、実行可能ファイルを作成します。$F.$Aは、例えばbug424.a.outのような実行可能ファイル名を生成します。
  6. &&: 前のコマンドが成功した場合にのみ次のコマンドを実行します。
  7. ./$A.out: 生成された実行可能ファイルを実行します。

この変更により、bug424.goが依存するlib.goが確実にコンパイル・リンクされるようになり、テストの実行が安定します。

また、bug424.go内のインポートパスも変更されています。

変更前:

import "./bug424.dir"

変更後:

import "./lib"

これは、bug424.dirというディレクトリ名が、テストスクリプトによって自動的に生成される一時的なディレクトリ構造に依存していた可能性があり、それをより汎用的なlibというパッケージ名(またはディレクトリ名)に変更することで、コードの可読性と移植性を向上させていると考えられます。

最後に、test/golden.outからbug424.goに関連する以下の行が削除されました。

=========== bugs/424.go
BUG: myT3: lib.T.m called

これは、bug424.goのテスト実行方法が変更された結果、以前のテスト実行で生成されたこの出力がもはや期待されるものではなくなったためです。テストの修正に伴い、期待される出力も更新されるのが一般的です。

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

test/fixedbugs/bug424.go

--- a/test/fixedbugs/bug424.go
+++ b/test/fixedbugs/bug424.go
@@ -1,4 +1,4 @@
-// run
+// $G $D/$F.dir/lib.go && $G $D/$F.go && $L $F.$A && ./$A.out
 
 // Copyright 2012 The Go Authors.  All rights reserved.
 // Use of this source code is governed by a BSD-style
@@ -11,7 +11,7 @@
 
 package main
 
-import "./bug424.dir"
+import "./lib"
 import "reflect"
 import "fmt"

test/golden.out

--- a/test/golden.out
+++ b/test/golden.out
@@ -17,8 +17,5 @@
 
 == bugs/
 
-=========== bugs/424.go
-BUG: myT3: lib.T.m called
-
 =========== bugs/bug395.go
 bug395 is broken

コアとなるコードの解説

test/fixedbugs/bug424.goの変更は、テストの実行方法をGoのテストスクリプトに対してより詳細に指示するためのものです。

  • // runからシェルコマンドへの変更:
    • 元の// runは、テストスクリプトに「このファイルを通常のGoプログラムとして実行せよ」という一般的な指示を与えていました。
    • 新しい// $G $D/$F.dir/lib.go && $G $D/$F.go && $L $F.$A && ./$A.outは、lib.goのコンパイル、bug424.goのコンパイル、それらのリンク、そして最終的な実行可能ファイルの実行という、一連の具体的なステップを明示しています。これにより、bug424.golib.goに依存しているという特殊なケースでも、テストが確実に成功するようになります。
  • インポートパスの変更:
    • import "./bug424.dir"からimport "./lib"への変更は、Goのパッケージインポートの慣例に合わせたものです。通常、Goではディレクトリ名がパッケージ名として扱われます。bug424.dirという名前は、テストの内部的な構造に強く依存しているように見えますが、libという名前はより汎用的で、パッケージの目的を明確に示しています。これは、テストの構造が変更されたか、より一般的なインポートパスを使用するように標準化されたことを示唆しています。

test/golden.outの変更は、bug424.goのテスト実行方法の変更に伴うものです。テストの実行方法が変われば、そのテストが生成する出力も変わる可能性があります。この場合、以前のBUG: myT3: lib.T.m calledという出力がもはや期待されるものではなくなったため、golden.outから削除されました。これは、テストが正しく修正され、以前のバグに関連する出力がなくなったことを示している可能性があります。

関連リンク

  • Go言語の公式ドキュメント(テストに関するセクション): Go言語のテストに関する詳細な情報は、公式ドキュメントで確認できます。
  • Goのソースコードリポジトリ: GitHub上のGoリポジトリで、他のテストファイルやテストスクリプトの動作を確認することで、より深い理解が得られます。

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のソースコード(GitHub)