引き継いだAPIを直す
目標
テストもドキュメントも信頼できない状態で引き継いだAPIから、症状だけを手がかりに4つの欠陥を見つけて直せるようになります。
なぜ重要なのか
このラボの欠陥は、すべて200を返しながら誤った値を返す種類です。例外を投げるバグはモニタリングが捕まえてくれますが、もっともらしい数字を返すバグは、数か月後に経理が合わなくなって初めて見つかります。そのため、仕様を入出力表に書き写し、境界値を入れてみる手順が必要です。
最後のステップのステータスコードの区別も、飾りではありません。400は「あなたの送り方が間違っている」という意味、500は「こちらで処理中に壊れた」という意味であり、クライアントライブラリの多くは5xxだけをリトライの対象と見なします。不正なパラメーターに500を返すと、永遠に失敗するリクエストが無限にリトライされ、サーバーの負荷が上がるだけです。ステータスコードは、人ではなく機械が読む約束事です。
/opt/app/server.pyのdocstringに、元の仕様が書かれています。コードがその仕様と食い違う箇所が、そのままバグの一覧です。
ステップ
/opt/app/server.pyを/root/app/server.pyにコピーしてください。以後はこのコピーだけを修正します。- コピーを実行して、
127.0.0.1:8000/healthが応答するようにしてください。 /sum?a=2&b=3が5を返すように直してください。/sum?a=10&b=32が42、/sum?a=-4&b=9が5を返すことを確認してください。/avg?nums=2,4,9が5、/avg?nums=10が10を返すように直してください。切り捨ての平均です。/upper?s=fdeがFDEを返すように直してください。/orders/totalが200とともに130400を返すように直してください。有効な行の条件はdocstringにあります。/sum?a=2と/sum?a=x&b=1が、それぞれ400を返すようにしてください。/nopeの404は原本のコードがすでに返しているので、確認するだけで構いません。直すのは/sumの引数処理だけです。何がすでにできているかを先に測ってみることが、このステップのコツです。
参考
- 修正後はサーバーを必ず再起動しないと反映されません。
kill %1のあとに再度実行するか、pkill -f server.pyを使います。 curl -s -o /dev/null -w '%{http_code}\n' URLで、ステータスコードだけを確認できます。- よくあるミス1:
/opt/app/server.pyの原本を直接修正してしまうことです。採点はポート8000の動作だけを見ますが、顧客のファイルに手を付けない習慣のほうが、現場でははるかに重要です。 - よくあるミス2: ステップ7で、壊れた行をファイルから消してしまうことです。データはそのままにして、コードで除外する必要があります。
作業用コピーを作る
/opt/app/server.pyを/root/app/server.pyにコピーしてください。以後はこのコピーだけを修正します。
原本を直接修正しないのが現場の基本です。/opt/app/server.pyを/root/app/の下にコピーしてください。
サーバーを起動する
コピーを実行して、127.0.0.1:8000/healthが応答するようにしてください。
python3で実行すると、127.0.0.1:8000で待ち受けます。修正するたびに再起動しないと反映されません。
足し算の結果を直す
/sum?a=2&b=3が5を返すように直してください。
2と3を入れたときに出る値を見れば、どの演算子が使われているかがすぐにわかります。ファイルの中でその1文字を探してください。
負数の入力も確認する
/sum?a=10&b=32が42、/sum?a=-4&b=9が5を返すことを確認してください。
境界値を確認するステップです。符号が混ざったときにも正しいかを見れば、本当に足し算になっているかがわかります。
平均の計算を直す
/avg?nums=2,4,9が5、/avg?nums=10が10を返すように直してください。切り捨ての平均です。
要素が3つのときと1つのときを、それぞれ入れてみてください。割る数が要素数とどれだけずれているかが表に出ます。
大文字変換を直す
/upper?s=fdeがFDEを返すように直してください。
エンドポイント名と、実際に呼び出している文字列メソッドが一致しているかを見てください。
注文合計が落ちないようにする
/orders/totalが200とともに130400を返すように直してください。有効な行の条件はdocstringにあります。
docstringに有効な行の条件が3つ書かれているのに、コードにはその分岐がありません。ドキュメントどおりに除外すれば済みます。
不正なリクエストに正しいコードを返す
/sum?a=2と/sum?a=x&b=1が、それぞれ400を返すようにしてください。/nopeの404は原本のコードがすでに返しているので、確認するだけで構いません。直すのは/sumの引数処理だけです。何がすでにできているかを先に測ってみることが、このステップのコツです。
パラメーターがないときや数値でないとき、今はサーバーが落ちます。クライアントの誤りは4xxです。