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

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

このコミットは、Go言語のドキュメンテーションツールであるgo/docパッケージのテストデータ(ゴールデンファイル)を更新し、ビルドエラーを修正するものです。具体的には、テスト出力の期待値が記述されたファイル内で、古いコマンド名「gotest」が新しいコマンド名「go test」に修正されています。

コミット

commit 9c9b96f028bd354f3b2e0869960300fe3936a54d
Author: Rob Pike <r@golang.org>
Date:   Mon Feb 20 14:06:38 2012 +1100

    go/doc: update golden file to fix build
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/5683046

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

https://github.com/golang/go/commit/9c9b96f028bd354f3b2e0869960300fe3936a54d

元コミット内容

--- a/src/pkg/go/doc/testdata/testing.1.golden
+++ b/src/pkg/go/doc/testdata/testing.1.golden
@@ -27,7 +27,7 @@ VARIABLES
 		// The short flag requests that tests run more quickly, but its functionality
 		// is provided by test writers themselves.  The testing package is just its
 		// home.  The all.bash installation script sets it to make installation more
-\t\t// efficient, but by default the flag is off so a plain \"gotest\" will do a
+\t\t// efficient, but by default the flag is off so a plain \"go test\" will do a
 \t\t// full test of the package.
 \t\tshort	= flag.Bool(\"test.short\", false, \"run smaller test suite to save time\")
 \t

変更の背景

このコミットの背景には、Go言語のツールチェインにおけるコマンド名の変更があります。初期のGo言語開発では、テストを実行するためのコマンドが「gotest」という独立したバイナリとして存在していました。しかし、Go 1のリリースに向けて、Go言語のサブコマンド体系が整備され、goコマンドの下に様々な機能が統合されることになりました。その結果、「gotest」は「go test」というサブコマンドに置き換えられました。

この変更に伴い、Go言語のドキュメンテーションやテストデータも更新する必要が生じました。src/pkg/go/doc/testdata/testing.1.goldenファイルは、go/docパッケージが生成するドキュメントの期待される出力を定義する「ゴールデンファイル」です。このファイル内に「gotest」という古いコマンド名が記述されていたため、新しいツールチェインでビルドやテストを実行すると、期待される出力と実際の出力が一致せず、ビルドエラーやテスト失敗が発生する可能性がありました。

このコミットは、このような不整合を解消し、go/docパッケージのビルドが正常に完了するように、ゴールデンファイル内の記述を最新の「go test」に修正することを目的としています。

前提知識の解説

Go言語のgoコマンドとサブコマンド

Go言語は、その開発環境においてgoという単一のコマンドラインツールを提供しています。このgoコマンドは、ビルド、テスト、フォーマット、依存関係の管理など、Goプロジェクトの様々なタスクを実行するためのサブコマンド群を内包しています。例えば、go buildはプログラムをコンパイルし、go runはソースコードを実行し、go getはパッケージをダウンロードします。この設計思想により、Go開発者は一貫したインターフェースで開発作業を進めることができます。

go testコマンド

go testは、Go言語の標準的なテスト実行コマンドです。Go言語はテストを言語機能として深く統合しており、各パッケージのテストコード(通常は_test.goで終わるファイル)を自動的に発見し、実行します。go testは、テストの実行、ベンチマークの実行、カバレッジレポートの生成など、テストに関する広範な機能を提供します。

ゴールデンファイルテスト (Golden File Testing)

ゴールデンファイルテストは、ソフトウェアテストの手法の一つで、プログラムの出力が事前に定義された「ゴールデンファイル」(またはスナップショットファイル)の内容と一致するかどうかを検証します。このテストは、特にテキストベースの出力(例: ドキュメント生成、コード生成、レンダリング結果)や、複雑なデータ構造のシリアライズ結果など、手動での検証が困難な場合に有効です。

テストのワークフローは以下のようになります。

  1. テスト対象のプログラムを実行し、その出力を一時ファイルに保存します。
  2. この一時ファイルの内容を、バージョン管理システムにコミットされた「ゴールデンファイル」の内容と比較します。
  3. 両者が完全に一致すればテストは成功です。
  4. もし一致しない場合、テストは失敗し、差分が表示されます。これは、プログラムの変更によって出力が変わったことを意味します。意図的な変更であればゴールデンファイルを更新し、そうでなければバグとして修正します。

このコミットで変更されたsrc/pkg/go/doc/testdata/testing.1.goldenは、まさにこのゴールデンファイルテストで使用されるファイルであり、go/docパッケージが生成するドキュメントの期待される内容を保持しています。

go/docパッケージ

go/docパッケージは、Go言語の標準ライブラリの一部であり、Goのソースコードからドキュメンテーションを抽出・生成するための機能を提供します。このパッケージは、Goのソースコードを解析し、パッケージ、関数、型、変数などのドキュメントコメントを読み取り、構造化された形式で提供します。go docコマンドやGoの公式ドキュメントサイト(pkg.go.devなど)は、このgo/docパッケージの機能を利用してドキュメントを生成しています。

技術的詳細

このコミットは、Go言語のツールチェインの進化と、それに伴うドキュメンテーションの整合性維持の重要性を示しています。

Go言語の初期段階では、go buildgo installgotestといった個別のコマンドが提供されていました。しかし、Go 1のリリースに向けて、これらのコマンドをgoという単一のエントリポイントの下に統合し、サブコマンド形式(例: go build, go test)に移行する決定がなされました。これは、ユーザーエクスペリエンスの向上、コマンドの一貫性、および将来的な拡張性のために重要な変更でした。

この移行期間中、既存のドキュメントやテストデータには古いコマンド名が残存している可能性がありました。src/pkg/go/doc/testdata/testing.1.goldenファイルは、go/docパッケージが生成するドキュメントのサンプル出力を含んでおり、その中に「gotest」という記述がありました。

この記述は、go/docパッケージが生成するドキュメントの一部として、testingパッケージのshortフラグに関する説明の中で登場します。

// efficient, but by default the flag is off so a plain "gotest" will do a
// full test of the package.

この行は、「all.bashインストールスクリプトはインストールを効率化するためにshortフラグを設定するが、デフォルトではこのフラグはオフなので、通常の"gotest"はパッケージの完全なテストを実行する」という意味合いです。

gotestgo testに置き換えられた後、このゴールデンファイルが参照するコマンド名が古いままだと、go/docパッケージのテストが失敗する原因となります。具体的には、go/docパッケージがドキュメントを生成し、その出力がこのゴールデンファイルと比較された際に、期待される「go test」ではなく「gotest」が検出されるため、不一致が発生します。

このコミットは、この不一致を解消するために、ゴールデンファイル内の「gotest」を「go test」に修正しています。これにより、go/docパッケージのテストが最新のツールチェインの挙動と一致し、ビルドが正常に完了するようになります。これは、単なる文字列の変更ではなく、Go言語のツールチェインの歴史的変遷と、それに伴うドキュメンテーションの正確性維持という文脈で理解されるべき変更です。

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

変更はsrc/pkg/go/doc/testdata/testing.1.goldenファイルの一箇所のみです。

--- a/src/pkg/go/doc/testdata/testing.1.golden
+++ b/src/pkg/go/doc/testdata/testing.1.golden
@@ -27,7 +27,7 @@ VARIABLES
 		// The short flag requests that tests run more quickly, but its functionality
 		// is provided by test writers themselves.  The testing package is just its
 		// home.  The all.bash installation script sets it to make installation more
-\t\t// efficient, but by default the flag is off so a plain \"gotest\" will do a
+\t\t// efficient, but by default the flag is off so a plain \"go test\" will do a
 \t\t// full test of the package.
 \t\tshort	= flag.Bool(\"test.short\", false, \"run smaller test suite to save time\")
 \t

具体的には、29行目の"gotest""go test"に修正されています。

コアとなるコードの解説

この変更は、testingパッケージのドキュメントの一部として表示されるテキストの修正です。testingパッケージには、テストの実行時間を短縮するための-test.shortフラグ(または単に-short)が存在します。このフラグは、テストの作成者がテストの実行内容を調整するために使用します。

変更前のテキストは、shortフラグがデフォルトでオフになっているため、通常の「gotest」コマンドがパッケージの完全なテストを実行するという説明でした。

// efficient, but by default the flag is off so a plain "gotest" will do a
// full test of the package.

この「gotest」という記述が、Goツールチェインの変更により「go test」に置き換えられたため、ゴールデンファイルもそれに合わせて更新されました。

// efficient, but by default the flag is off so a plain "go test" will do a
// full test of the package.

この修正により、go/docパッケージがtestingパッケージのドキュメントを生成する際に、最新のコマンド名が反映されるようになり、ゴールデンファイルテストがパスするようになりました。これは、ドキュメンテーションの正確性を保ち、ビルドシステムが正常に機能するための小さな、しかし重要な修正です。

関連リンク

参考にした情報源リンク

  • GitHubコミットページ: https://github.com/golang/go/commit/9c9b96f028bd354f3b2e0869960300fe3936a54d
  • Go CL 5683046: https://golang.org/cl/5683046 (このコミットに対応するGoのコードレビューシステム上のチェンジリスト)
  • Go言語のツールチェインの歴史に関する情報 (例: Go 1の設計ドキュメントやメーリングリストの議論など、当時の情報源)
    • Go 1 Release Notes: https://go.dev/doc/go1
    • The Go Programming Language Specification (Go 1): https://go.dev/doc/go1spec
    • (具体的なgotestからgo testへの移行に関する詳細な議論は、当時のGo開発者メーリングリストや設計ドキュメントに散見される可能性がありますが、このコミット自体は直接的な変更ではなく、その影響を修正するものです。)