タイムテーブルに戻る
synctest時代のhttptest: Go 1.27で変わるHTTPサーバテストの裏側
Go 1.25 で正式導入された `testing/synctest` は、並行処理コードのテストを決定的に扱うための仕組みです。`synctest` の bubble 内では goroutine の待機状態を観測でき、時間の経過も fake clock によって制御できます。 一方で Go 1.26 までの`net/http/httptest.Server` は通常のサーバと同じく OS のネットワークスタックを使うため、`synctest` と組み合わせにくい場面がありました。そのため、HTTP サーバや API クライアントのテストでタイムアウトやバックオフを扱いたくても、`synctest` による時間制御の恩恵を受けにくい問題がありました。 Go 1.27 では `net/http/httptest` の `synctest` 対応により、HTTP サーバや API クライアントのテストを `synctest` の bubble 内で扱いやすくなります。この変更を支えるのが、標準ライブラリ内部に追加された `internal/nettest` による in-memory fake networking 実装です。 https://github.com/golang/go/issues/76608 本発表では、まず `synctest` がどのように時刻とgoroutineの待機状態を扱うのか軽くおさらいします。そのうえで、従来の `httptest.Server` がなぜ `synctest` と組み合わせにくかったのかを確認し、Go 1.27 で追加される `httptest` の `synctest` 対応によって、Web サーバや API クライアントのテストをどのように書けるようになるのかを紹介します。 後半では `internal/nettest` の実装を読み解き、`internal/nettest`のインメモリネットワークがどのように `httptest` と `synctest` をつないでいるのかを解説します。 ### タイムライン この発表ではGo 1.27から変わる`synctest`を使ったHTTPサーバテストについて以下の順に話す予定です。 - synctestが何をしているのかおさらい - Go 1.26 以前の `httptest` がなぜ `synctest` と組み合わせにくかったのか - Go 1.27 の `httptest` の `synctest` 対応で書けるようになるテスト例 - `internal/nettest` deep dive: fake listener / fake connection の設計 - まとめ ### 本セッションで得られること このセッションでは、以下を持ち帰れます。 - `httptest` と `synctest` を使って、より速く安定した HTTP/API テストを書くための考え方 - OS の I/O wait を介さない in-memory なネットワークモデルの仕組み - `internal/nettest` が `httptest` と `synctest` をどのようにつないでいるのか
budougumi0617 budougumi0617

LayerX Inc, Software Engineer, Engineering Manager

Goが好きですʕ◔ϖ◔ʔ 株式会社LayerX で法人向けクレジットカード/ETCカードを開発するチームのEMをしています。 一般社団法人Gophers Japan 代表理事のひとり。