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

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

このコミットは、Go言語の標準ライブラリであるstringsパッケージのテストファイルであるsrc/pkg/strings/strings_test.goに対する変更です。このファイルは、stringsパッケージが提供する様々な文字列操作関数(例: Trim, TrimLeft, TrimRightなど)が正しく機能するかどうかを検証するための単体テストコードを含んでいます。具体的には、TestTrim関数内で、定義されていないトリム関数が指定された場合のテスト出力の修正が行われています。

コミット

このコミットは、stringsパッケージのテスト出力における軽微な修正を目的としています。具体的には、テスト中にエラーが発生した際のメッセージ出力方法を改善し、より適切なエラー報告が行われるように変更されました。

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

https://github.com/golang/go/commit/356b8ee26fa02643b166ae77870e24293260ba90

元コミット内容

strings: fix test output

R=rsc, gri
CC=golang-dev
https://golang.org/cl/5445044

変更の背景

この変更の背景には、Go言語のテストフレームワークにおけるエラー報告の慣習と、より適切な診断メッセージの提供という目的があります。元のコードでは、テスト中に「Undefined trim function %s」というエラーメッセージを出力するためにt.Error()が使用されていました。しかし、このメッセージはフォーマット文字列(%s)を含んでおり、Goのtestingパッケージでは、フォーマット文字列を含むエラーメッセージを出力する際にはt.Errorf()を使用するのが一般的かつ推奨されるプラクティスです。

t.Error()は引数をそのまま出力するのに対し、t.Errorf()fmt.Sprintfのように引数をフォーマットしてから出力します。したがって、フォーマット指定子(%sなど)を含む文字列を渡す場合、t.Errorf()を使用することで、意図した通りに変数の値が埋め込まれたエラーメッセージが生成されます。このコミットは、この慣習に従い、テスト出力の正確性と可読性を向上させるために行われました。

前提知識の解説

Go言語のtestingパッケージ

Go言語には、標準ライブラリとしてtestingパッケージが提供されており、これを用いて単体テストやベンチマークテストを記述します。テストファイルは通常、テスト対象のソースファイルと同じディレクトリに配置され、ファイル名の末尾に_test.goを付けます(例: strings.goに対するstrings_test.go)。

テスト関数はfunc TestXxx(*testing.T)というシグネチャを持ちます。ここで*testing.Tはテストの状態を管理し、テストの失敗を報告するためのメソッドを提供します。

*testing.Tの主要なエラー報告メソッド

  • t.Error(args ...interface{}): このメソッドは、テストを失敗としてマークし、引数argsをデフォルトのフォーマットでログに出力します。テストはその後も続行されます。引数はfmt.Printlnのように扱われます。つまり、複数の引数を渡すとスペースで区切られて出力されます。フォーマット文字列を直接解釈する機能はありません。

  • t.Errorf(format string, args ...interface{}): このメソッドもテストを失敗としてマークし、引数formatargsfmt.Sprintfのようにフォーマットしてログに出力します。テストはその後も続行されます。format文字列には%s, %dなどのフォーマット指定子を含めることができ、argsがそれらの指定子に埋め込まれます。

  • t.Fatal(args ...interface{}): t.Error()と同様にテストを失敗としてマークしログに出力しますが、現在のテスト関数を即座に停止します。

  • t.Fatalf(format string, args ...interface{}): t.Errorf()と同様にフォーマットしてログに出力し、現在のテスト関数を即座に停止します。

stringsパッケージ

stringsパッケージは、Go言語の標準ライブラリの一部であり、UTF-8でエンコードされた文字列を操作するための基本的な関数を提供します。例えば、文字列の検索、置換、分割、結合、トリムなどの機能が含まれます。このコミットで関連するTrim系の関数は、文字列の先頭や末尾から指定された文字セットに含まれる文字を削除するものです。

技術的詳細

このコミットの技術的詳細は、Go言語のtestingパッケージにおけるエラー報告のベストプラクティスに集約されます。

元のコードでは、以下のようにt.Error()が使用されていました。

t.Error("Undefined trim function %s", name)

ここで、開発者は%sというフォーマット指定子を使って、変数nameの値をエラーメッセージに埋め込もうとしていました。しかし、前述の通りt.Error()fmt.Printlnのように動作するため、"Undefined trim function %s"という文字列とname変数の値が、それぞれ独立した引数として扱われ、スペースで区切られて出力されます。例えばname"Foo"だった場合、出力はUndefined trim function %s Fooのようになり、意図したUndefined trim function Fooとは異なります。

これを修正するために、コミットではt.Errorf()に変更されました。

t.Errorf("Undefined trim function %s", name)

t.Errorf()は、その名の通りfmt.Errorf(または内部的にはfmt.Sprintf)と同様に動作します。これにより、最初の引数である"Undefined trim function %s"がフォーマット文字列として解釈され、後続の引数name%sのプレースホルダーに適切に埋め込まれます。結果として、name"Foo"であれば、期待通りにUndefined trim function Fooというメッセージがテストログに出力されるようになります。

この変更は、単なる機能的なバグ修正というよりも、コードの品質、可読性、そしてGo言語の慣用的なプログラミングスタイルへの準拠を目的としたものです。テストの出力が正確であることは、開発者がテストの失敗原因を迅速に特定し、デバッグを行う上で非常に重要です。

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

変更はsrc/pkg/strings/strings_test.goファイルの一箇所のみです。

--- a/src/pkg/strings/strings_test.go
+++ b/src/pkg/strings/strings_test.go
@@ -527,7 +527,7 @@ func TestTrim(t *testing.T) {
 		case "TrimRight":
 			f = TrimRight
 		default:
-			t.Error("Undefined trim function %s", name)
+			t.Errorf("Undefined trim function %s", name)
 		}
 		actual := f(tc.in, tc.cutset)
 		if actual != tc.out {

コアとなるコードの解説

変更された行は、TestTrim関数内のswitchステートメントのdefaultケースにあります。このswitchステートメントは、テストケースで指定されたトリム関数の名前(name変数)に基づいて、対応するトリム関数(f)を選択します。

もしname"Trim", "TrimLeft", "TrimRight"のいずれでもない場合、つまり未定義のトリム関数が指定された場合には、defaultケースが実行されます。このdefaultケースの目的は、そのような不正な入力があったことをテストログに報告することです。

変更前はt.Error("Undefined trim function %s", name)となっており、これはt.Errorがフォーマット文字列を解釈しないため、%sがそのまま出力され、nameの値がその後に続くという不適切な結果を招いていました。

変更後はt.Errorf("Undefined trim function %s", name)となり、t.Errorfがフォーマット文字列を適切に解釈するため、%sの箇所にname変数の値が正確に埋め込まれ、期待通りのエラーメッセージが生成されるようになりました。これにより、テストの失敗理由がより明確になり、デバッグが容易になります。

関連リンク

  • Gerrit Change-ID (CL): https://golang.org/cl/5445044 このリンクは、Goプロジェクトがコードレビューに使用しているGerritシステム上の変更セット(Change-ID)を示しています。Goのコミットは通常、GitHubにプッシュされる前にGerritでレビューされます。

参考にした情報源リンク

  • Go言語 testing パッケージのドキュメント: https://pkg.go.dev/testing 特に*testing.T型のメソッドに関するセクションが関連します。

  • Go言語 fmt パッケージのドキュメント: https://pkg.go.dev/fmt fmt.Sprintffmt.Printlnの動作について理解する上で参考になります。

  • Go言語 strings パッケージのドキュメント: https://pkg.go.dev/strings テスト対象のパッケージに関する情報源です。# [インデックス 10525] ファイルの概要

このコミットは、Go言語の標準ライブラリであるstringsパッケージのテストファイルであるsrc/pkg/strings/strings_test.goに対する変更です。このファイルは、stringsパッケージが提供する様々な文字列操作関数(例: Trim, TrimLeft, TrimRightなど)が正しく機能するかどうかを検証するための単体テストコードを含んでいます。具体的には、TestTrim関数内で、定義されていないトリム関数が指定された場合のテスト出力の修正が行われています。

コミット

このコミットは、stringsパッケージのテスト出力における軽微な修正を目的としています。具体的には、テスト中にエラーが発生した際のメッセージ出力方法を改善し、より適切なエラー報告が行われるように変更されました。

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

https://github.com/golang/go/commit/356b8ee26fa02643b166ae77870e24293260ba90

元コミット内容

strings: fix test output

R=rsc, gri
CC=golang-dev
https://golang.org/cl/5445044

変更の背景

この変更の背景には、Go言語のテストフレームワークにおけるエラー報告の慣習と、より適切な診断メッセージの提供という目的があります。元のコードでは、テスト中に「Undefined trim function %s」というエラーメッセージを出力するためにt.Error()が使用されていました。しかし、このメッセージはフォーマット文字列(%s)を含んでおり、Goのtestingパッケージでは、フォーマット文字列を含むエラーメッセージを出力する際にはt.Errorf()を使用するのが一般的かつ推奨されるプラクティスです。

t.Error()は引数をそのまま出力するのに対し、t.Errorf()fmt.Sprintfのように引数をフォーマットしてから出力します。したがって、フォーマット指定子(%sなど)を含む文字列を渡す場合、t.Errorf()を使用することで、意図した通りに変数の値が埋め込まれたエラーメッセージが生成されます。このコミットは、この慣習に従い、テスト出力の正確性と可読性を向上させるために行われました。

前提知識の解説

Go言語のtestingパッケージ

Go言語には、標準ライブラリとしてtestingパッケージが提供されており、これを用いて単体テストやベンチマークテストを記述します。テストファイルは通常、テスト対象のソースファイルと同じディレクトリに配置され、ファイル名の末尾に_test.goを付けます(例: strings.goに対するstrings_test.go)。

テスト関数はfunc TestXxx(*testing.T)というシグネチャを持ちます。ここで*testing.Tはテストの状態を管理し、テストの失敗を報告するためのメソッドを提供します。

*testing.Tの主要なエラー報告メソッド

  • t.Error(args ...interface{}): このメソッドは、テストを失敗としてマークし、引数argsをデフォルトのフォーマットでログに出力します。テストはその後も続行されます。引数はfmt.Printlnのように扱われます。つまり、複数の引数を渡すとスペースで区切られて出力されます。フォーマット文字列を直接解釈する機能はありません。

  • t.Errorf(format string, args ...interface{}): このメソッドもテストを失敗としてマークし、引数formatargsfmt.Sprintfのようにフォーマットしてログに出力します。テストはその後も続行されます。format文字列には%s, %dなどのフォーマット指定子を含めることができ、argsがそれらの指定子に埋め込まれます。

  • t.Fatal(args ...interface{}): t.Error()と同様にテストを失敗としてマークしログに出力しますが、現在のテスト関数を即座に停止します。

  • t.Fatalf(format string, args ...interface{}): t.Errorf()と同様にフォーマットしてログに出力し、現在のテスト関数を即座に停止します。

stringsパッケージ

stringsパッケージは、Go言語の標準ライブラリの一部であり、UTF-8でエンコードされた文字列を操作するための基本的な関数を提供します。例えば、文字列の検索、置換、分割、結合、トリムなどの機能が含まれます。このコミットで関連するTrim系の関数は、文字列の先頭や末尾から指定された文字セットに含まれる文字を削除するものです。

技術的詳細

このコミットの技術的詳細は、Go言語のtestingパッケージにおけるエラー報告のベストプラクティスに集約されます。

元のコードでは、以下のようにt.Error()が使用されていました。

t.Error("Undefined trim function %s", name)

ここで、開発者は%sというフォーマット指定子を使って、変数nameの値をエラーメッセージに埋め込もうとしていました。しかし、前述の通りt.Error()fmt.Printlnのように動作するため、"Undefined trim function %s"という文字列とname変数の値が、それぞれ独立した引数として扱われ、スペースで区切られて出力されます。例えばname"Foo"だった場合、出力はUndefined trim function %s Fooのようになり、意図したUndefined trim function Fooとは異なります。

これを修正するために、コミットではt.Errorf()に変更されました。

t.Errorf("Undefined trim function %s", name)

t.Errorf()は、その名の通りfmt.Errorf(または内部的にはfmt.Sprintf)と同様に動作します。これにより、最初の引数である"Undefined trim function %s"がフォーマット文字列として解釈され、後続の引数name%sのプレースホルダーに適切に埋め込まれます。結果として、name"Foo"であれば、期待通りにUndefined trim function Fooというメッセージがテストログに出力されるようになります。

この変更は、単なる機能的なバグ修正というよりも、コードの品質、可読性、そしてGo言語の慣用的なプログラミングスタイルへの準拠を目的としたものです。テストの出力が正確であることは、開発者がテストの失敗原因を迅速に特定し、デバッグを行う上で非常に重要です。

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

変更はsrc/pkg/strings/strings_test.goファイルの一箇所のみです。

--- a/src/pkg/strings/strings_test.go
+++ b/src/pkg/strings/strings_test.go
@@ -527,7 +527,7 @@ func TestTrim(t *testing.T) {
 		case "TrimRight":
 			f = TrimRight
 		default:
-			t.Error("Undefined trim function %s", name)
+			t.Errorf("Undefined trim function %s", name)
 		}
 		actual := f(tc.in, tc.cutset)
 		if actual != tc.out {

コアとなるコードの解説

変更された行は、TestTrim関数内のswitchステートメントのdefaultケースにあります。このswitchステートメントは、テストケースで指定されたトリム関数の名前(name変数)に基づいて、対応するトリム関数(f)を選択します。

もしname"Trim", "TrimLeft", "TrimRight"のいずれでもない場合、つまり未定義のトリム関数が指定された場合には、defaultケースが実行されます。このdefaultケースの目的は、そのような不正な入力があったことをテストログに報告することです。

変更前はt.Error("Undefined trim function %s", name)となっており、これはt.Errorがフォーマット文字列を解釈しないため、%sがそのまま出力され、nameの値がその後に続くという不適切な結果を招いていました。

変更後はt.Errorf("Undefined trim function %s", name)となり、t.Errorfがフォーマット文字列を適切に解釈するため、%sの箇所にname変数の値が正確に埋め込まれ、期待通りのエラーメッセージが生成されるようになりました。これにより、テストの失敗理由がより明確になり、デバッグが容易になります。

関連リンク

  • Gerrit Change-ID (CL): https://golang.org/cl/5445044 このリンクは、Goプロジェクトがコードレビューに使用しているGerritシステム上の変更セット(Change-ID)を示しています。Goのコミットは通常、GitHubにプッシュされる前にGerritでレビューされます。

参考にした情報源リンク

  • Go言語 testing パッケージのドキュメント: https://pkg.go.dev/testing 特に*testing.T型のメソッドに関するセクションが関連します。

  • Go言語 fmt パッケージのドキュメント: https://pkg.go.dev/fmt fmt.Sprintffmt.Printlnの動作について理解する上で参考になります。

  • Go言語 strings パッケージのドキュメント: https://pkg.go.dev/strings テスト対象のパッケージに関する情報源です。