[インデックス 15706] ファイルの概要
このコミットは、Go言語の標準ライブラリである net/http
パッケージ内の ParseHTTPVersion
関数に対するテストを追加するものです。具体的には、src/pkg/net/http/request_test.go
ファイルに新しいテストケースとテスト関数が追加され、ParseHTTPVersion
がHTTPバージョン文字列を正しく解析できるか、また不正な形式の文字列を適切に処理できるかを検証しています。
コミット
commit 2f2271db7a1cb434845f6bbfbc5d4aa732f2aef5
Author: Dave Cheney <dave@cheney.net>
Date: Tue Mar 12 11:18:18 2013 +1100
net/http: add tests for ParseHTTPVersion
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/7739043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/2f2271db7a1cb434845f6bbfbc5d4aa732f2aef5
元コミット内容
--- a/src/pkg/net/http/request_test.go
+++ b/src/pkg/net/http/request_test.go
@@ -267,6 +267,38 @@ func TestNewRequestContentLength(t *testing.T) {
}\n}\n\n+var parseHTTPVersionTests = []struct {\n+\tvers string\n+\tmajor, minor int\n+\tok bool\n+}{\n+\t{\"HTTP/0.9\", 0, 9, true},\n+\t{\"HTTP/1.0\", 1, 0, true},\n+\t{\"HTTP/1.1\", 1, 1, true},\n+\t{\"HTTP/3.14\", 3, 14, true},\n+\n+\t{\"HTTP\", 0, 0, false},\n+\t{\"HTTP/one.one\", 0, 0, false},\n+\t{\"HTTP/1.1/\", 0, 0, false},\n+\t{\"HTTP/-1,0\", 0, 0, false},\n+\t{\"HTTP/0,-1\", 0, 0, false},\n+\t{\"HTTP/\", 0, 0, false},\n+\t{\"HTTP/1,1\", 0, 0, false},\n+}\n+\n+func TestParseHTTPVersion(t *testing.T) {\n+\tfor _, tt := range parseHTTPVersionTests {\n+\t\tmajor, minor, ok := ParseHTTPVersion(tt.vers)\n+\t\tif ok != tt.ok || major != tt.major || minor != tt.minor {\n+\t\t\ttype version struct {\n+\t\t\t\tmajor, minor int\n+\t\t\t\tok bool\n+\t\t\t}\n+\t\t\tt.Errorf(\"failed to parse %q, expected: %#v, got %#v\", tt.vers, version{tt.major, tt.minor, tt.ok}, version{major, minor, ok})\n+\t\t}\n+\t}\n+}\n+\n type logWrites struct {\n \tt *testing.T\n \tdst *[]string\n```
## 変更の背景
このコミットの背景には、Go言語の `net/http` パッケージがHTTPプロトコルを正確に処理するための堅牢性を高めるという目的があります。`ParseHTTPVersion` 関数は、HTTPリクエストやレスポンスの開始行に含まれるHTTPバージョン文字列(例: "HTTP/1.1")を解析し、メジャーバージョンとマイナーバージョンを抽出する役割を担っています。
このような重要な解析関数には、様々な有効な入力だけでなく、無効な入力に対しても正しく振る舞うことを保証するテストが不可欠です。テストが不足している場合、将来の変更や予期せぬ入力によって、HTTPプロトコルの解釈に誤りが生じ、互換性の問題やセキュリティ上の脆弱性につながる可能性があります。
このコミットは、`ParseHTTPVersion` 関数が以下のようなケースを適切に処理できることを確認するために、包括的なテストケースを追加しています。
* **有効なHTTPバージョン文字列**: 標準的なHTTP/0.9, HTTP/1.0, HTTP/1.1などの形式。
* **非標準だが有効な形式**: 例えば、HTTP/3.14 のような、メジャー/マイナーバージョンが任意の整数であるケース。
* **無効なHTTPバージョン文字列**:
* "HTTP" のみでバージョン番号がない。
* バージョン番号が数値ではない(例: "one.one")。
* 余分な文字が含まれる(例: "HTTP/1.1/")。
* 負のバージョン番号(例: "-1,0")。
* バージョン番号が欠落している(例: "HTTP/")。
* 区切り文字が不正(例: "1,1")。
これらのテストケースを追加することで、`ParseHTTPVersion` 関数の堅牢性が向上し、HTTP通信の信頼性が確保されます。
## 前提知識の解説
### Go言語の `net/http` パッケージ
`net/http` パッケージは、Go言語におけるHTTPクライアントおよびサーバーの実装を提供します。このパッケージを使用することで、開発者は簡単にWebサーバーを構築したり、HTTPリクエストを送信したりすることができます。HTTPプロトコルの詳細な解析、リクエストのルーティング、レスポンスの生成など、Webアプリケーション開発に必要な多くの機能が含まれています。
### HTTPバージョン
HTTP (Hypertext Transfer Protocol) は、Web上でデータを交換するためのプロトコルです。HTTPバージョンは、プロトコルの特定の改訂版を示し、通常 "HTTP/メジャーバージョン.マイナーバージョン" の形式で表現されます。例えば、"HTTP/1.0" や "HTTP/1.1" があります。これらのバージョンは、プロトコルの機能、パフォーマンス、および動作に影響を与えます。サーバーとクライアントは、互換性のあるバージョンを使用して通信します。
### Go言語におけるテスト
Go言語には、標準ライブラリとして `testing` パッケージが用意されており、ユニットテストやベンチマークテストを簡単に記述できます。テストファイルは、テスト対象のGoファイルと同じディレクトリに `_test.go` というサフィックスを付けて配置するのが一般的です。テスト関数は `Test` で始まり、`*testing.T` 型の引数を取ります。テストの失敗は `t.Error` や `t.Errorf` メソッドで報告します。
### テーブル駆動テスト (Table-Driven Tests)
Go言語のテストでよく用いられるイディオムの一つに「テーブル駆動テスト」があります。これは、複数のテストケースを構造体のスライス(配列)として定義し、そのスライスをループで回しながら各テストケースを実行する手法です。
このコミットで追加された `parseHTTPVersionTests` がまさにその例です。各テストケースは `struct` で定義され、入力 (`vers`) と期待される出力 (`major`, `minor`, `ok`) を含んでいます。これにより、テストコードの重複を減らし、新しいテストケースの追加を容易にし、テストの可読性を高めることができます。
## 技術的詳細
このコミットは、`net/http` パッケージの `ParseHTTPVersion` 関数をテストするために、`src/pkg/net/http/request_test.go` に以下の要素を追加しています。
1. **`parseHTTPVersionTests` スライス**:
これは、`ParseHTTPVersion` 関数のテストケースを定義する構造体のスライスです。各構造体は以下のフィールドを持ちます。
* `vers` (string): `ParseHTTPVersion` に渡されるHTTPバージョン文字列。
* `major` (int): 期待されるメジャーバージョン番号。
* `minor` (int): 期待されるマイナーバージョン番号。
* `ok` (bool): `ParseHTTPVersion` が成功した場合に `true`、失敗した場合に `false` となる期待値。
このスライスには、有効なHTTPバージョン文字列("HTTP/0.9", "HTTP/1.0", "HTTP/1.1", "HTTP/3.14")と、無効なHTTPバージョン文字列("HTTP", "HTTP/one.one", "HTTP/1.1/", "HTTP/-1,0", "HTTP/0,-1", "HTTP/", "HTTP/1,1")の両方が含まれています。これにより、関数の正常系と異常系の両方の動作が検証されます。
2. **`TestParseHTTPVersion` 関数**:
これは、`ParseHTTPVersion` 関数をテストするためのGoのテスト関数です。
* 関数は `parseHTTPVersionTests` スライスをループで反復処理します。
* 各テストケース (`tt`) に対して、`ParseHTTPVersion(tt.vers)` を呼び出し、実際の戻り値 (`major`, `minor`, `ok`) を取得します。
* 取得した戻り値と、テストケースで定義された期待値 (`tt.major`, `tt.minor`, `tt.ok`) を比較します。
* もし一つでも期待値と異なる場合、`t.Errorf` を使用してエラーを報告します。エラーメッセージには、どの入力 (`tt.vers`) で失敗したか、期待された結果、および実際の結果が含まれます。
* エラーメッセージを整形するために、匿名構造体 `version` が一時的に定義され、期待値と実際の値を比較しやすい形式で出力しています。
このテストの追加により、`ParseHTTPVersion` 関数がHTTPバージョン文字列の解析において、様々な有効な形式を正しく処理し、同時に不正な形式を適切に拒否できることが保証されます。これは、`net/http` パッケージがHTTPプロトコル仕様に厳密に準拠し、堅牢な動作を維持するために不可欠です。
## コアとなるコードの変更箇所
変更は `src/pkg/net/http/request_test.go` ファイルに集中しており、以下のコードブロックが追加されています。
```go
var parseHTTPVersionTests = []struct {
vers string
major, minor int
ok bool
}{
{"HTTP/0.9", 0, 9, true},
{"HTTP/1.0", 1, 0, true},
{"HTTP/1.1", 1, 1, true},
{"HTTP/3.14", 3, 14, true},
{"HTTP", 0, 0, false},
{"HTTP/one.one", 0, 0, false},
{"HTTP/1.1/", 0, 0, false},
{"HTTP/-1,0", 0, 0, false},
{"HTTP/0,-1", 0, 0, false},
{"HTTP/", 0, 0, false},
{"HTTP/1,1", 0, 0, false},
}
func TestParseHTTPVersion(t *testing.T) {
for _, tt := range parseHTTPVersionTests {
major, minor, ok := ParseHTTPVersion(tt.vers)
if ok != tt.ok || major != tt.major || minor != tt.minor {
type version struct {
major, minor int
ok bool
}
t.Errorf("failed to parse %q, expected: %#v, got %#v", tt.vers, version{tt.major, tt.minor, tt.ok}, version{major, minor, ok})
}
}
}
コアとなるコードの解説
parseHTTPVersionTests
変数
この変数は、ParseHTTPVersion
関数をテストするための入力と期待される出力のペアを定義する「テストテーブル」です。
struct { vers string; major, minor int; ok bool }
: これは匿名構造体の定義で、各テストケースが持つべきフィールド(バージョン文字列、期待されるメジャーバージョン、マイナーバージョン、そして解析が成功するかどうか)を定義しています。{"HTTP/0.9", 0, 9, true}
: これは有効なHTTPバージョン文字列のテストケースです。ParseHTTPVersion("HTTP/0.9")
が呼び出された場合、メジャーバージョンが0
、マイナーバージョンが9
、そしてok
がtrue
となることを期待しています。{"HTTP", 0, 0, false}
: これは無効なHTTPバージョン文字列のテストケースです。ParseHTTPVersion("HTTP")
が呼び出された場合、解析が失敗し、ok
がfalse
となることを期待しています。メジャーとマイナーバージョンは、失敗時には通常ゼロ値が返されるため、0, 0
となっています。
このテーブル形式により、テストケースの追加や変更が非常に容易になり、テストの網羅性を高めることができます。
TestParseHTTPVersion
関数
この関数は、Goのテストフレームワークによって自動的に実行されるテスト関数です。
for _, tt := range parseHTTPVersionTests
:parseHTTPVersionTests
スライス内の各テストケースを反復処理します。tt
は現在のテストケース(構造体)を表します。major, minor, ok := ParseHTTPVersion(tt.vers)
:ParseHTTPVersion
関数を呼び出し、現在のテストケースのバージョン文字列 (tt.vers
) を渡します。関数の戻り値(メジャーバージョン、マイナーバージョン、成功フラグ)を変数に格納します。if ok != tt.ok || major != tt.major || minor != tt.minor
: ここがテストの「アサーション」部分です。ParseHTTPVersion
から返されたok
、major
、minor
の値が、テストケースで期待されるtt.ok
、tt.major
、tt.minor
の値と一致するかどうかをチェックします。一つでも一致しない場合は、テストが失敗したと判断されます。type version struct { ... }
: これは、エラーメッセージをより分かりやすくするために、一時的に定義されたローカルな構造体です。これにより、期待値と実際の結果を{major:X, minor:Y, ok:Z}
のような形式で出力できます。t.Errorf(...)
: テストが失敗した場合に呼び出されるメソッドです。フォーマット文字列と引数を使って、失敗したテストケースの詳細(入力文字列、期待される結果、実際の結果)をエラーログに出力します。これにより、どのテストケースで、なぜ失敗したのかを特定しやすくなります。
このテスト関数は、テーブル駆動テストの典型的なパターンを示しており、簡潔かつ効果的に複数のシナリオを検証しています。
関連リンク
- Go言語の
net/http
パッケージドキュメント: https://pkg.go.dev/net/http - Go言語の
testing
パッケージドキュメント: https://pkg.go.dev/testing - Go言語のコードレビューシステム (Gerrit) での変更リスト: https://golang.org/cl/7739043
参考にした情報源リンク
- Go言語の公式ドキュメント
- Go言語のテストに関する一般的なプラクティス(テーブル駆動テストなど)に関する情報源
- HTTPプロトコル仕様 (RFCs) - 特にHTTP/1.1 (RFC 2616, 後にRFC 7230-7235に分割) のバージョン表記に関するセクション。
- RFC 7230: Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing: https://datatracker.ietf.org/doc/html/rfc7230#section-2.6 (HTTP Versionの定義)
- Go言語のソースコードリポジトリ (GitHub)
- Dave Cheney氏のブログやGoに関する記事 (Goコミュニティで著名な開発者の一人)```markdown
[インデックス 15706] ファイルの概要
このコミットは、Go言語の標準ライブラリである net/http
パッケージ内の ParseHTTPVersion
関数に対するテストを追加するものです。具体的には、src/pkg/net/http/request_test.go
ファイルに新しいテストケースとテスト関数が追加され、ParseHTTPVersion
がHTTPバージョン文字列を正しく解析できるか、また不正な形式の文字列を適切に処理できるかを検証しています。
コミット
commit 2f2271db7a1cb434845f6bbfbc5d4aa732f2aef5
Author: Dave Cheney <dave@cheney.net>
Date: Tue Mar 12 11:18:18 2013 +1100
net/http: add tests for ParseHTTPVersion
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/7739043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/2f2271db7a1cb434845f6bbfbc5d4aa732f2aef5
元コミット内容
--- a/src/pkg/net/http/request_test.go
+++ b/src/pkg/net/http/request_test.go
@@ -267,6 +267,38 @@ func TestNewRequestContentLength(t *testing.T) {
}\n}\n\n+var parseHTTPVersionTests = []struct {\n+\tvers string\n+\tmajor, minor int\n+\tok bool\n+}{\n+\t{\"HTTP/0.9\", 0, 9, true},\n+\t{\"HTTP/1.0\", 1, 0, true},\n+\t{\"HTTP/1.1\", 1, 1, true},\n+\t{\"HTTP/3.14\", 3, 14, true},\n+\n+\t{\"HTTP\", 0, 0, false},\n+\t{\"HTTP/one.one\", 0, 0, false},\n+\t{\"HTTP/1.1/\", 0, 0, false},\n+\t{\"HTTP/-1,0\", 0, 0, false},\n+\t{\"HTTP/0,-1\", 0, 0, false},\n+\t{\"HTTP/\", 0, 0, false},\n+\t{\"HTTP/1,1\", 0, 0, false},\n+}\n+\n+func TestParseHTTPVersion(t *testing.T) {\n+\tfor _, tt := range parseHTTPVersionTests {\n+\t\tmajor, minor, ok := ParseHTTPVersion(tt.vers)\n+\t\tif ok != tt.ok || major != tt.major || minor != tt.minor {\n+\t\t\ttype version struct {\n+\t\t\t\tmajor, minor int\n+\t\t\t\tok bool\n+\t\t\t}\n+\t\t\tt.Errorf(\"failed to parse %q, expected: %#v, got %#v\", tt.vers, version{tt.major, tt.minor, tt.ok}, version{major, minor, ok})\n+\t\t}\n+\t}\n+}\n+\n type logWrites struct {\n \tt *testing.T\n \tdst *[]string\n```
## 変更の背景
このコミットの背景には、Go言語の `net/http` パッケージがHTTPプロトコルを正確に処理するための堅牢性を高めるという目的があります。`ParseHTTPVersion` 関数は、HTTPリクエストやレスポンスの開始行に含まれるHTTPバージョン文字列(例: "HTTP/1.1")を解析し、メジャーバージョンとマイナーバージョンを抽出する役割を担っています。
このような重要な解析関数には、様々な有効な入力だけでなく、無効な入力に対しても正しく振る舞うことを保証するテストが不可欠です。テストが不足している場合、将来の変更や予期せぬ入力によって、HTTPプロトコルの解釈に誤りが生じ、互換性の問題やセキュリティ上の脆弱性につながる可能性があります。
このコミットは、`ParseHTTPVersion` 関数が以下のようなケースを適切に処理できることを確認するために、包括的なテストケースを追加しています。
* **有効なHTTPバージョン文字列**: 標準的なHTTP/0.9, HTTP/1.0, HTTP/1.1などの形式。
* **非標準だが有効な形式**: 例えば、HTTP/3.14 のような、メジャー/マイナーバージョンが任意の整数であるケース。
* **無効なHTTPバージョン文字列**:
* "HTTP" のみでバージョン番号がない。
* バージョン番号が数値ではない(例: "one.one")。
* 余分な文字が含まれる(例: "HTTP/1.1/")。
* 負のバージョン番号(例: "-1,0")。
* バージョン番号が欠落している(例: "HTTP/")。
* 区切り文字が不正(例: "1,1")。
これらのテストケースを追加することで、`ParseHTTPVersion` 関数の堅牢性が向上し、HTTP通信の信頼性が確保されます。
## 前提知識の解説
### Go言語の `net/http` パッケージ
`net/http` パッケージは、Go言語におけるHTTPクライアントおよびサーバーの実装を提供します。このパッケージを使用することで、開発者は簡単にWebサーバーを構築したり、HTTPリクエストを送信したりすることができます。HTTPプロトコルの詳細な解析、リクエストのルーティング、レスポンスの生成など、Webアプリケーション開発に必要な多くの機能が含まれています。
### HTTPバージョン
HTTP (Hypertext Transfer Protocol) は、Web上でデータを交換するためのプロトコルです。HTTPバージョンは、プロトコルの特定の改訂版を示し、通常 "HTTP/メジャーバージョン.マイナーバージョン" の形式で表現されます。例えば、"HTTP/1.0" や "HTTP/1.1" があります。これらのバージョンは、プロトコルの機能、パフォーマンス、および動作に影響を与えます。サーバーとクライアントは、互換性のあるバージョンを使用して通信します。
### Go言語におけるテスト
Go言語には、標準ライブラリとして `testing` パッケージが用意されており、ユニットテストやベンチマークテストを簡単に記述できます。テストファイルは、テスト対象のGoファイルと同じディレクトリに `_test.go` というサフィックスを付けて配置するのが一般的です。テスト関数は `Test` で始まり、`*testing.T` 型の引数を取ります。テストの失敗は `t.Error` や `t.Errorf` メソッドで報告します。
### テーブル駆動テスト (Table-Driven Tests)
Go言語のテストでよく用いられるイディオムの一つに「テーブル駆動テスト」があります。これは、複数のテストケースを構造体のスライス(配列)として定義し、そのスライスをループで回しながら各テストケースを実行する手法です。
このコミットで追加された `parseHTTPVersionTests` がまさにその例です。各テストケースは `struct` で定義され、入力 (`vers`) と期待される出力 (`major`, `minor`, `ok`) を含んでいます。これにより、テストコードの重複を減らし、新しいテストケースの追加を容易にし、テストの可読性を高めることができます。
## 技術的詳細
このコミットは、`net/http` パッケージの `ParseHTTPVersion` 関数をテストするために、`src/pkg/net/http/request_test.go` に以下の要素を追加しています。
1. **`parseHTTPVersionTests` スライス**:
これは、`ParseHTTPVersion` 関数のテストケースを定義する構造体のスライスです。各構造体は以下のフィールドを持ちます。
* `vers` (string): `ParseHTTPVersion` に渡されるHTTPバージョン文字列。
* `major` (int): 期待されるメジャーバージョン番号。
* `minor` (int): 期待されるマイナーバージョン番号。
* `ok` (bool): `ParseHTTPVersion` が成功した場合に `true`、失敗した場合に `false` となる期待値。
このスライスには、有効なHTTPバージョン文字列("HTTP/0.9", "HTTP/1.0", "HTTP/1.1", "HTTP/3.14")と、無効なHTTPバージョン文字列("HTTP", "HTTP/one.one", "HTTP/1.1/", "HTTP/-1,0", "HTTP/0,-1", "HTTP/", "HTTP/1,1")の両方が含まれています。これにより、関数の正常系と異常系の両方の動作が検証されます。
2. **`TestParseHTTPVersion` 関数**:
これは、`ParseHTTPVersion` 関数をテストするためのGoのテスト関数です。
* 関数は `parseHTTPVersionTests` スライスをループで反復処理します。
* 各テストケース (`tt`) に対して、`ParseHTTPVersion(tt.vers)` を呼び出し、実際の戻り値 (`major`, `minor`, `ok`) を取得します。
* 取得した戻り値と、テストケースで定義された期待値 (`tt.major`, `tt.minor`, `tt.ok`) を比較します。
* もし一つでも期待値と異なる場合、`t.Errorf` を使用してエラーを報告します。エラーメッセージには、どの入力 (`tt.vers`) で失敗したか、期待された結果、および実際の結果が含まれます。
* エラーメッセージを整形するために、匿名構造体 `version` が一時的に定義され、期待値と実際の値を比較しやすい形式で出力しています。
このテストの追加により、`ParseHTTPVersion` 関数がHTTPバージョン文字列の解析において、様々な有効な形式を正しく処理し、同時に不正な形式を適切に拒否できることが保証されます。これは、`net/http` パッケージがHTTPプロトコル仕様に厳密に準拠し、堅牢な動作を維持するために不可欠です。
## コアとなるコードの変更箇所
変更は `src/pkg/net/http/request_test.go` ファイルに集中しており、以下のコードブロックが追加されています。
```go
var parseHTTPVersionTests = []struct {
vers string
major, minor int
ok bool
}{
{"HTTP/0.9", 0, 9, true},
{"HTTP/1.0", 1, 0, true},
{"HTTP/1.1", 1, 1, true},
{"HTTP/3.14", 3, 14, true},
{"HTTP", 0, 0, false},
{"HTTP/one.one", 0, 0, false},
{"HTTP/1.1/", 0, 0, false},
{"HTTP/-1,0", 0, 0, false},
{"HTTP/0,-1", 0, 0, false},
{"HTTP/", 0, 0, false},
{"HTTP/1,1", 0, 0, false},
}
func TestParseHTTPVersion(t *testing.T) {
for _, tt := range parseHTTPVersionTests {
major, minor, ok := ParseHTTPVersion(tt.vers)
if ok != tt.ok || major != tt.major || minor != tt.minor {
type version struct {
major, minor int
ok bool
}
t.Errorf("failed to parse %q, expected: %#v, got %#v", tt.vers, version{tt.major, tt.minor, tt.ok}, version{major, minor, ok})
}
}
}
コアとなるコードの解説
parseHTTPVersionTests
変数
この変数は、ParseHTTPVersion
関数をテストするための入力と期待される出力のペアを定義する「テストテーブル」です。
struct { vers string; major, minor int; ok bool }
: これは匿名構造体の定義で、各テストケースが持つべきフィールド(バージョン文字列、期待されるメジャーバージョン、マイナーバージョン、そして解析が成功するかどうか)を定義しています。{"HTTP/0.9", 0, 9, true}
: これは有効なHTTPバージョン文字列のテストケースです。ParseHTTPVersion("HTTP/0.9")
が呼び出された場合、メジャーバージョンが0
、マイナーバージョンが9
、そしてok
がtrue
となることを期待しています。{"HTTP", 0, 0, false}
: これは無効なHTTPバージョン文字列のテストケースです。ParseHTTPVersion("HTTP")
が呼び出された場合、解析が失敗し、ok
がfalse
となることを期待しています。メジャーとマイナーバージョンは、失敗時には通常ゼロ値が返されるため、0, 0
となっています。
このテーブル形式により、テストケースの追加や変更が非常に容易になり、テストの網羅性を高めることができます。
TestParseHTTPVersion
関数
この関数は、Goのテストフレームワークによって自動的に実行されるテスト関数です。
for _, tt := range parseHTTPVersionTests
:parseHTTPVersionTests
スライス内の各テストケースを反復処理します。tt
は現在のテストケース(構造体)を表します。major, minor, ok := ParseHTTPVersion(tt.vers)
:ParseHTTPVersion
関数を呼び出し、現在のテストケースのバージョン文字列 (tt.vers
) を渡します。関数の戻り値(メジャーバージョン、マイナーバージョン、成功フラグ)を変数に格納します。if ok != tt.ok || major != tt.major || minor != tt.minor
: ここがテストの「アサーション」部分です。ParseHTTPVersion
から返されたok
、major
、minor
の値が、テストケースで期待されるtt.ok
、tt.major
、tt.minor
の値と一致するかどうかをチェックします。一つでも一致しない場合は、テストが失敗したと判断されます。type version struct { ... }
: これは、エラーメッセージをより分かりやすくするために、一時的に定義されたローカルな構造体です。これにより、期待値と実際の結果を{major:X, minor:Y, ok:Z}
のような形式で出力できます。t.Errorf(...)
: テストが失敗した場合に呼び出されるメソッドです。フォーマット文字列と引数を使って、失敗したテストケースの詳細(入力文字列、期待される結果、実際の結果)をエラーログに出力します。これにより、どのテストケースで、なぜ失敗したのかを特定しやすくなります。
このテスト関数は、テーブル駆動テストの典型的なパターンを示しており、簡潔かつ効果的に複数のシナリオを検証しています。
関連リンク
- Go言語の
net/http
パッケージドキュメント: https://pkg.go.dev/net/http - Go言語の
testing
パッケージドキュメント: https://pkg.go.dev/testing - Go言語のコードレビューシステム (Gerrit) での変更リスト: https://golang.org/cl/7739043
参考にした情報源リンク
- Go言語の公式ドキュメント
- Go言語のテストに関する一般的なプラクティス(テーブル駆動テストなど)に関する情報源
- HTTPプロトコル仕様 (RFCs) - 特にHTTP/1.1 (RFC 2616, 後にRFC 7230-7235に分割) のバージョン表記に関するセクション。
- RFC 7230: Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing: https://datatracker.ietf.org/doc/html/rfc7230#section-2.6 (HTTP Versionの定義)
- Go言語のソースコードリポジトリ (GitHub)
- Dave Cheney氏のブログやGoに関する記事 (Goコミュニティで著名な開発者の一人)