Node版と差し替える
中身を入れ替えても気づかれない
前のレッスンで、仕様どおりの API ができました。同じ仕様の実装が2つある状態です。
プレーンテキスト
fleama API (Node.js) いま動いているもの
fleama-go (Go) いま作ったもの差し替えとは、使う側を一切変えずに、裏側だけを入れ替えることです。
プレーンテキスト
React アプリ → fetch("/items") → [Node版]
React アプリ → fetch("/items") → [Go版] ← 変えたのはここだけフロント側のコードは1行も触りません。触る必要があるなら、それは互換ではなかったということです。
一致を機械で確かめる
「同じはず」で切り替えると事故ります。同じリクエストを両方に投げて、応答を突き合わせます。
プレーンテキスト
GET /items 両方の応答が一致するか
GET /items/1 一致するか
GET /items/99 404 と本文が一致するか
POST /items 検証NG 400 と理由が一致するか見るのは3つです。
プレーンテキスト
ステータスコード
応答の本文(1文字単位)
ヘッダ(Content-Type など)成功する場合だけ確かめて安心しないでください。差が出やすいのは、むしろ失敗のときです。エラーの文言、404 の形、検証の順番。ここが揃っていないと、使う側の分岐が壊れます。
よくある食い違い
実際に作り直すと、次のあたりでずれます。
プレーンテキスト
0件のとき null と []
数値の表現 1200 と "1200"
キーの順番 言語やライブラリによって変わることがある
日時の形式 Node と Go で既定が違う
末尾の改行 Encode を使うと付くどれも第8章で触れたものです。細部が全部合って初めて互換になります。
切り替えの進め方
実務では、一度に全部を切り替えません。
プレーンテキスト
1. 両方を動かし、同じリクエストを両方に流して比べる
2. 一部のリクエストだけ Go 版に向ける
3. 問題が無ければ割合を増やす
4. 全部を切り替え、Node 版を止める途中で戻せるようにしておくのが要点です。戻せない切り替えはやらない、というのが、この種の作業の原則になります。
この演習でやること
2つの実装の応答を比べる関数を書きます。差し替えの前に必ずやる作業を、そのまま小さくしたものです。
要件
callGoを呼んで Go 版の応答を得る- Node 版の応答と1文字単位で比べる
- 一致したら
一致を返す - 違ったら
不一致 期待=<Node版> 実際=<Go版>を返す
入出力例
compareImpl("GET", "/items?keyword=中古スマホ", "", "200 {"total":1,"items":[{"id":2,"name":"中古スマホ","price":24800}]}") → "一致"
compareImpl("GET", "/items/99", "", "404 {"error":"not found"}") → "一致"
compareImpl("GET", "/items?keyword=謎の箱", "", "200 {"total":0,"items":null}") → "不一致 期待=200 {"total":0,"items":null} 実際=200 {"total":0,"items":[]}"
compareImpl("GET", "/items/abc", "", "400 {"error":"bad request"}") → "不一致 期待=400 {"error":"bad request"} 実際=400 {"error":"invalid id"}"ヒント
編集 ゆめさく編集部