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

[インデックス 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リクエストのレスポンスボディやその他の情報がテストの成功/失敗に直接関係しない場合、それらの出力は「不要な出力」と見なされます。

したがって、この変更は、テストスクリプトの出力をよりクリーンにし、テストの実行結果をより明確に把握できるようにするための品質改善の一環として行われました。

前提知識の解説

このコミットを理解するためには、以下の前提知識が必要です。

  1. シェルスクリプト (.bash):
    • test.bashはBashシェルスクリプトであり、一連のコマンドを自動的に実行してテストを行うために使用されます。
    • シェルスクリプトでは、コマンドの出力をファイルにリダイレクトする機能(>演算子)や、2つのファイルの差分を比較するdiffコマンドが頻繁に利用されます。
  2. 標準出力とリダイレクト:
    • ほとんどのコマンドは、実行結果を「標準出力」(通常はターミナル画面)に出力します。
    • >演算子を使用すると、コマンドの標準出力を指定したファイルに書き込むことができます。これにより、画面に表示されるのを防ぎ、後でそのファイルの内容を処理したり、別のファイルと比較したりすることが可能になります。
    • 例: command > output.txtcommand の出力を output.txt に書き込みます。
  3. diffコマンド:
    • diff -u file1 file2は、file1file2の間の差分をUnified形式で表示するコマンドです。テストスクリプトでは、コマンドの実際の出力が期待される出力と一致するかどうかを検証するためによく使用されます。差分がない場合、diffコマンドは何も出力せず、終了ステータスが0(成功)となります。差分がある場合は、その差分を出力し、終了ステータスが非0(失敗)となります。
  4. get.bin:
    • このスクリプト内で使用されている./get.binは、おそらくHTTPリクエストを送信するためのカスタムビルドされたバイナリツールです。Go言語プロジェクトのテストスクリプトでよく見られるパターンとして、特定のHTTPエンドポイントに対してGETやPOSTリクエストを送信し、そのレスポンスを検証するために使用されます。
    • -post=body=some%20contentは、HTTP POSTリクエストのボディに指定されたコンテンツを含めることを示唆しています。
    • http://$addr/save/Testは、リクエストの送信先URLです。$addrは、テスト対象のアプリケーションがリッスンしているアドレス(ホストとポート)を保持する変数であると推測されます。
  5. テストのベストプラクティス:
    • 自動テストでは、テストの実行結果が明確であることが重要です。不要な出力は、テストの失敗を特定しにくくしたり、テストログのサイズを不必要に大きくしたりする可能性があります。そのため、テストスクリプトは通常、必要な情報のみを出力するように設計されます。

技術的詳細

このコミットの技術的詳細は、シェルスクリプトにおけるコマンド出力の制御と、それを用いたテスト結果の検証方法に集約されます。

変更前は、以下のコマンドが実行されていました。

./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
  1. ./get.bin ... > test_save.out:
    • >演算子を使用することで、get.binコマンドの標準出力をtest_save.outというファイルにリダイレクトしています。これにより、get.binの実行中に発生するHTTPレスポンスなどの出力がターミナルに表示されることなく、ファイルにキャプチャされます。これが「不要な出力の抑制」の主要なメカニズムです。
  2. 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
    
    1. ./get.bin ... > test_save.out: get.binコマンドの出力をtest_save.outという一時ファイルにリダイレクトすることで、標準出力への不要な表示を抑制しています。これにより、テストスクリプトの実行ログがクリーンに保たれます。
    2. diff -u test_save.out test_view.good: test_save.outに保存された実際の出力と、test_view.goodという「期待される」または「正しい」出力ファイルを比較しています。このdiffコマンドが差分を検出しない場合、save操作が期待通りに機能し、その結果がview操作の結果と一致することが検証されます。これは、単にコマンドを実行するだけでなく、その結果を自動的に検証する、より堅牢なテストアプローチです。コメントにあるように、保存後の状態が閲覧時の状態と同じであるべきというテストの意図が明確に示されています。

この変更は、テストスクリプトの出力管理と結果検証の品質を向上させるための、シンプルかつ効果的な改善です。

関連リンク

参考にした情報源リンク