[インデックス 14741] ファイルの概要
このコミットは、Go言語プロジェクトのドキュメントの一部であるdoc/articles/wiki/test.bash
スクリプトに対する変更です。具体的には、テスト実行時における不要な出力を抑制し、テストの堅牢性を向上させることを目的としています。
コミット
このコミットは、doc/articles/wiki/test.bash
スクリプトにおいて、get.bin
コマンドの実行結果が標準出力に表示されるのを抑制し、その出力をファイルにリダイレクトして、期待される結果と比較するように変更しています。これにより、テストの実行中に発生する余分な出力が削減され、テストのクリーンさと信頼性が向上します。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/fcc5cf639ef110eb7e845f3782eb82d2c897d693
元コミット内容
doc/articles/wiki/test.bash: suppress unnecessary output
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/7000045
変更の背景
この変更の背景には、自動化されたテストスクリプトの実行における「ノイズ」の削減という一般的な課題があります。test.bash
のようなシェルスクリプトベースのテストでは、実行されるコマンドが標準出力に様々なメッセージを出力することがあります。これらのメッセージは、テストが成功したか失敗したかを判断する上で不要な場合が多く、特にCI/CD環境や大量のテストを実行する際に、ログの可読性を低下させたり、テスト結果の解析を困難にしたりする原因となります。
このコミットでは、./get.bin -post=body=some%20content http://$addr/save/Test
というコマンドが実行された際に、その出力が標準出力に直接表示されるのを防ぐことが目的でした。このコマンドは、おそらくGo言語のwikiアプリケーションのテストにおいて、特定のコンテンツを保存するHTTP POSTリクエストをシミュレートするために使用されています。この操作自体は重要ですが、そのHTTPリクエストのレスポンスボディやその他の情報がテストの成功/失敗に直接関係しない場合、それらの出力は「不要な出力」と見なされます。
したがって、この変更は、テストスクリプトの出力をよりクリーンにし、テストの実行結果をより明確に把握できるようにするための品質改善の一環として行われました。
前提知識の解説
このコミットを理解するためには、以下の前提知識が必要です。
- シェルスクリプト (
.bash
):test.bash
はBashシェルスクリプトであり、一連のコマンドを自動的に実行してテストを行うために使用されます。- シェルスクリプトでは、コマンドの出力をファイルにリダイレクトする機能(
>
演算子)や、2つのファイルの差分を比較するdiff
コマンドが頻繁に利用されます。
- 標準出力とリダイレクト:
- ほとんどのコマンドは、実行結果を「標準出力」(通常はターミナル画面)に出力します。
>
演算子を使用すると、コマンドの標準出力を指定したファイルに書き込むことができます。これにより、画面に表示されるのを防ぎ、後でそのファイルの内容を処理したり、別のファイルと比較したりすることが可能になります。- 例:
command > output.txt
はcommand
の出力をoutput.txt
に書き込みます。
diff
コマンド:diff -u file1 file2
は、file1
とfile2
の間の差分をUnified形式で表示するコマンドです。テストスクリプトでは、コマンドの実際の出力が期待される出力と一致するかどうかを検証するためによく使用されます。差分がない場合、diff
コマンドは何も出力せず、終了ステータスが0(成功)となります。差分がある場合は、その差分を出力し、終了ステータスが非0(失敗)となります。
get.bin
:- このスクリプト内で使用されている
./get.bin
は、おそらくHTTPリクエストを送信するためのカスタムビルドされたバイナリツールです。Go言語プロジェクトのテストスクリプトでよく見られるパターンとして、特定のHTTPエンドポイントに対してGETやPOSTリクエストを送信し、そのレスポンスを検証するために使用されます。 -post=body=some%20content
は、HTTP POSTリクエストのボディに指定されたコンテンツを含めることを示唆しています。http://$addr/save/Test
は、リクエストの送信先URLです。$addr
は、テスト対象のアプリケーションがリッスンしているアドレス(ホストとポート)を保持する変数であると推測されます。
- このスクリプト内で使用されている
- テストのベストプラクティス:
- 自動テストでは、テストの実行結果が明確であることが重要です。不要な出力は、テストの失敗を特定しにくくしたり、テストログのサイズを不必要に大きくしたりする可能性があります。そのため、テストスクリプトは通常、必要な情報のみを出力するように設計されます。
技術的詳細
このコミットの技術的詳細は、シェルスクリプトにおけるコマンド出力の制御と、それを用いたテスト結果の検証方法に集約されます。
変更前は、以下のコマンドが実行されていました。
./get.bin -post=body=some%20content http://$addr/save/Test
このコマンドは、http://$addr/save/Test
に対してPOSTリクエストを送信し、そのレスポンスを標準出力に直接出力していました。テストの目的が「コンテンツが正しく保存されたか」を検証することである場合、このレスポンスの内容自体は重要ですが、その出力がテストスクリプトの実行ログに直接混ざることは望ましくありません。
変更後、この行は以下の2行に分割されました。
./get.bin -post=body=some%20content http://$addr/save/Test > test_save.out
diff -u test_save.out test_view.good # should be the same as viewing
./get.bin ... > test_save.out
:>
演算子を使用することで、get.bin
コマンドの標準出力をtest_save.out
というファイルにリダイレクトしています。これにより、get.bin
の実行中に発生するHTTPレスポンスなどの出力がターミナルに表示されることなく、ファイルにキャプチャされます。これが「不要な出力の抑制」の主要なメカニズムです。
diff -u test_save.out test_view.good
:- 次に、
diff -u
コマンドを使用して、test_save.out
ファイル(get.bin
の実際の出力)とtest_view.good
ファイル(期待される出力、または「正しい」ビューのコンテンツ)を比較しています。 - コメント
# should be the same as viewing
が示唆するように、save
操作後の結果は、単にview
操作を行った場合と同じであるべき、というテストの意図が読み取れます。つまり、コンテンツを保存した後にそのコンテンツを再度取得した場合、期待通りの内容が返されることを検証しています。 diff
コマンドが差分を検出しない場合、テストはこのステップで成功と見なされます。差分があれば、diff
は非ゼロの終了コードを返し、テストは失敗します。
- 次に、
この変更により、テストスクリプトはよりクリーンな出力を生成し、かつsave
操作の正確性を自動的に検証できるようになりました。これは、テストの自動化と信頼性向上における典型的なパターンです。
コアとなるコードの変更箇所
変更はdoc/articles/wiki/test.bash
ファイル内の以下の部分です。
--- a/doc/articles/wiki/test.bash
+++ b/doc/articles/wiki/test.bash
@@ -20,7 +20,8 @@ wiki_pid=$!\
\
./get.bin --wait_for_port=5s http://$addr/edit/Test > test_edit.out
diff -u test_edit.out test_edit.good
-./get.bin -post=body=some%20content http://$addr/save/Test
+./get.bin -post=body=some%20content http://$addr/save/Test > test_save.out
+diff -u test_save.out test_view.good # should be the same as viewing
diff -u Test.txt test_Test.txt.good
./get.bin http://$addr/view/Test > test_view.out
diff -u test_view.out test_view.good
具体的には、23行目の./get.bin -post=body=some%20content http://$addr/save/Test
が削除され、24行目と25行目に新しい2行が追加されました。
コアとなるコードの解説
-
削除された行:
./get.bin -post=body=some%20content http://$addr/save/Test
この行は、
get.bin
コマンドを実行してHTTP POSTリクエストを送信し、その結果を標準出力に直接表示していました。テストの自動化の観点からは、この直接的な出力はテストログを乱雑にし、テスト結果の解析を困難にする可能性がありました。 -
追加された行:
./get.bin -post=body=some%20content http://$addr/save/Test > test_save.out diff -u test_save.out test_view.good # should be the same as viewing
./get.bin ... > test_save.out
:get.bin
コマンドの出力をtest_save.out
という一時ファイルにリダイレクトすることで、標準出力への不要な表示を抑制しています。これにより、テストスクリプトの実行ログがクリーンに保たれます。diff -u test_save.out test_view.good
:test_save.out
に保存された実際の出力と、test_view.good
という「期待される」または「正しい」出力ファイルを比較しています。このdiff
コマンドが差分を検出しない場合、save
操作が期待通りに機能し、その結果がview
操作の結果と一致することが検証されます。これは、単にコマンドを実行するだけでなく、その結果を自動的に検証する、より堅牢なテストアプローチです。コメントにあるように、保存後の状態が閲覧時の状態と同じであるべきというテストの意図が明確に示されています。
この変更は、テストスクリプトの出力管理と結果検証の品質を向上させるための、シンプルかつ効果的な改善です。
関連リンク
- Go言語の公式リポジトリ: https://github.com/golang/go
- Go言語のコードレビューシステム (Gerrit): https://go.dev/cl/7000045 (コミットメッセージに記載されているCLリンク)
参考にした情報源リンク
- Gitの差分表示 (diff) について: https://git-scm.com/docs/git-diff
- Bashのリダイレクトについて: https://www.gnu.org/software/bash/manual/bash.html#Redirections
- シェルスクリプトにおけるテストのベストプラクティスに関する一般的な情報 (特定のURLはなし、一般的な知識に基づく)
- Go言語のテストに関するドキュメント (一般的な情報源、特定のURLはなし)
- GitHubのコミットページ: https://github.com/golang/go/commit/fcc5cf639ef110eb7e845f3782eb82d2c897d693