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

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

このコミットは、Go言語の標準ライブラリの一部である cmd/nm コマンドのテストファイル src/cmd/nm/nm_test.go を変更します。具体的には、TestNM というテスト関数が特定のオペレーティングシステム(OS)上でスキップされるように修正されています。

コミット

commit b157077e34e61125a41f143304e9453c6142b09c
Author: David Crawshaw <david.crawshaw@zentus.com>
Date:   Tue Jul 8 13:44:41 2014 -0400

    cmd/nm: skip test on android (no Go tool)
    
    LGTM=bradfitz
    R=golang-codereviews, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/107590043

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

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

元コミット内容

cmd/nm: skip test on android (no Go tool)

LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/107590043

変更の背景

このコミットが行われた2014年当時、Go言語のAndroidサポートはまだ発展途上にありました。cmd/nm はGoのバイナリからシンボル情報を抽出するためのツールであり、そのテスト (TestNM) は、実行環境にGoツールチェインが適切にセットアップされていることを前提としています。

しかし、Android環境では、go tool nm コマンドやその依存関係が完全に利用可能ではなかったか、あるいは期待通りに動作しなかったため、TestNM が失敗する問題が発生していました。テストのCI/CDパイプラインの安定性を保つため、Android環境でのこのテストの実行を一時的にスキップする決定がなされました。これは、特定のプラットフォームでテストが失敗する既知の問題に対処するための一般的なプラクティスです。

前提知識の解説

このコミットを理解するためには、以下のGo言語およびテストに関する基本的な知識が必要です。

  • go tool nm: go tool nm は、Go言語のツールチェインに含まれるコマンドラインユーティリティの一つです。これは、コンパイルされたGoのオブジェクトファイル、アーカイブ、または実行可能ファイルからシンボルテーブル(関数名、変数名などのシンボルとそのアドレス情報)を読み取り、表示するために使用されます。Unix系の nm コマンドに似た機能を提供し、バイナリの内部構造をデバッグや解析する際に役立ちます。

  • runtime.GOOS: runtime パッケージは、Goプログラムが実行されているシステム環境に関する情報を提供するGoの標準ライブラリです。runtime.GOOS は、Goプログラムがコンパイルされた、または現在実行されているオペレーティングシステムの名前を示す文字列定数です。例えば、Linuxでは "linux"、Windowsでは "windows"、macOSでは "darwin"、そしてAndroidでは "android" となります。この変数は、OS固有の動作を条件分岐させる際によく使用されます。

  • testing パッケージと t.Skip() / t.Skipf(): Go言語の標準ライブラリ testing パッケージは、ユニットテストやベンチマークテストを作成するためのフレームワークを提供します。

    • t.Skip(args ...interface{}): テスト関数内でこのメソッドが呼び出されると、現在のテストは「スキップされた」としてマークされ、それ以降のテストコードの実行は停止します。これは、特定の条件が満たされない場合にテストを実行しないようにするために使用されます。
    • t.Skipf(format string, args ...interface{}): t.Skip() と同様にテストをスキップしますが、fmt.Printf と同じ形式でフォーマットされたメッセージを出力できます。これにより、テストがスキップされた理由をより詳細に伝えることができます。
  • NaCl (Native Client): Googleが開発した、ウェブブラウザ内でC/C++コードをサンドボックス化された環境で実行するための技術です。Go言語はかつてNaClをターゲットプラットフォームとしてサポートしていました。このコミットの変更前のコードでは、既にNaCl環境でのテストスキップが実装されていました。

技術的詳細

このコミットの技術的な変更は、src/cmd/nm/nm_test.go ファイル内の TestNM 関数におけるOS判定ロジックの拡張にあります。

変更前は、TestNM 関数は if ステートメントを使用して runtime.GOOS"nacl" であるかどうかをチェックし、もしそうであればテストをスキップしていました。

func TestNM(t *testing.T) {
	if runtime.GOOS == "nacl" {
		t.Skip("skipping on nacl")
	}
	// ... その他のテストロジック
}

このコミットでは、この if ステートメントが switch ステートメントに置き換えられ、"android" もスキップ対象のOSとして追加されました。

func TestNM(t *testing.T) {
	switch runtime.GOOS {
	case "android", "nacl":
		t.Skipf("skipping on %s", runtime.GOOS)
	}
	// ... その他のテストロジック
}

この変更により、TestNM はAndroidまたはNaCl環境で実行された場合にスキップされるようになります。また、t.Skip() から t.Skipf() への変更により、スキップメッセージがより動的になり、どのOSでスキップされたかを明確に表示できるようになりました。これは、テスト結果の可読性とデバッグのしやすさを向上させます。

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

変更は src/cmd/nm/nm_test.go ファイルの TestNM 関数内で行われました。

--- a/src/cmd/nm/nm_test.go
+++ b/src/cmd/nm/nm_test.go
@@ -55,8 +55,9 @@ func checkSymbols(t *testing.T, nmoutput []byte) {
 }
 
 func TestNM(t *testing.T) {
-	if runtime.GOOS == "nacl" {
-		t.Skip("skipping on nacl")
+	switch runtime.GOOS {
+	case "android", "nacl":
+		t.Skipf("skipping on %s", runtime.GOOS)
 	}
 
 	tmpDir, err := ioutil.TempDir("", "TestNM")

コアとなるコードの解説

上記の差分が示すように、TestNM 関数の冒頭部分が変更されています。

  • 変更前: if runtime.GOOS == "nacl" という条件文で、現在のOSが "nacl" であるかをチェックしていました。もし "nacl" であれば、t.Skip("skipping on nacl") を呼び出してテストをスキップし、「nacl上でスキップ中」というメッセージを出力していました。

  • 変更後: switch runtime.GOOS という switch ステートメントが導入されました。 case "android", "nacl": という行は、runtime.GOOS の値が "android" または "nacl" のいずれかである場合に、この case ブロック内のコードが実行されることを意味します。 このブロック内では、t.Skipf("skipping on %s", runtime.GOOS) が呼び出されます。これにより、テストはスキップされ、runtime.GOOS の値(例: "android" または "nacl")が埋め込まれた「[OS名]上でスキップ中」というより具体的なメッセージが出力されます。

この変更は、単にAndroid環境でのテストスキップを追加するだけでなく、将来的に他のOSで同様のスキップが必要になった場合にも、switch ステートメントの case にOS名を追加するだけで容易に拡張できる、より柔軟な構造を提供します。

関連リンク

参考にした情報源リンク