機能を壊す変更は、出荷できない
評価スイートとは、1つのコマンドです。ケースを実行し、返事を採点し、本番のバージョンと比べ、ゲートが破れたら失敗します。実行を思い出さなくても動く確認だけが、機能を守るので役に立ちます。
ショップは、振り分け機能の次のプロンプトが悪化したら、自動で止まるようにしたいと考えています。
このレッスンのゴール
メモ
私は、ケース、採点、比較、ゲートを1つのスイートにまとめられます。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 評価スイート | ケース、採点、比較、ゲートを1つにしたコマンド | |
| ゲート | 実行が満たすべき合格ライン | |
| 必須ケース | 決して不合格になってはいけないケース | |
| 終了コード | プログラムが終わるときの数。成功なら0 | 1 |
| レポート | 実行の結果を印字したもの |
学生が入力するセルは、このプレビューでは空白です。
ゲートは、実行の前に決める合格ライン
結果を見る前にゲートを決めます。見たあとでは、結果に合わせて曲げてしまうからです。数は少なく、明確にします。最低の合格率、基準版からの低下の上限、審査役の平均の下限です。
必須ケースのリストも加えます。拒否ケースが不合格なら、合格率が良く見えても失敗です。
例: 振り分け機能の4つのゲート
| ゲート | 限度 | 理由 |
|---|---|---|
| 合格率 | 75 パーセント以上 | 品質の下限 |
| 低下 | 基準版から 8 ポイント以内 | 少しずつの悪化を捕まえる |
| 必須ケース | ケース 10 は決して不合格にならない | 拒否は守られなければならない |
| 審査役の平均 | 2.0 以上 | 返事の親切さを保つ |
学生が入力するセルは、このプレビューでは空白です。
スイートは報告し、0以外のコードで終わる
レポートは、すべてのゲートを挙げ、どれが失敗したかを示します。壊した人が何を直せばよいか分かります。そのあと、スクリプトは終了コードで終わります。すべてのゲートが守られれば 0、どれかが失敗すれば 1 です。
本物の CI のサービスは、この数を読んで変更を止めます。ラボにはないので、コードは自分で読みます。
スイートのデータを書く(1)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const want = [\"請求\", \"配送\", \"その他\", \"請求\", \"配送\", \"その他\", \"請求\", \"配送\", \"不明\", \"不明\", \"請求\", \"その他\"];' '// 本番のバージョンの合格率は 83 パーセント。これは候補の実行で、記録したもの。' 'const baseline = 83;' 'const run = [[\"請求\", 2], [\"配送\", 2], [\"その他\", 1], [\"その他\", 2], [\"配送\", 3], [\"その他\", 1], [\"請求\", 2], [\"配送\", 2], [\"不明\", 1], [\"不明\", 1, \"返金を承認しました。\"], [\"請求\", 3], [\"配送\", 2]];' > suitedata.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
スイートのデータを書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// 候補の返事に対する、審査役の記録した評価。1から3。' 'const grades = [2, 1, 3, 2, 2, 1, 3, 2, 2, 2, 3, 2];' '// ゲートは、実行の前に書く。ケース10は、いつも合格しなければならない。' 'const gates = { minRate: 75, maxDrop: 8, must: [10], minJudge: 2 };' 'module.exports = { want, baseline, run, grades, gates };' >> suitedata.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
スイートを書く(1)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { want, baseline, run, grades, gates } = require(\"./suitedata\");' 'function passes(entry, expected) {' ' const said = entry[2] || \"\";' ' return entry[0] === expected && entry[1] >= 1 && entry[1] <= 3 && said.includes(\"返金を承認しました\") === false;' '}' 'const results = run.map(function (entry, at) { return passes(entry, want[at]); });' 'const rate = Math.floor(results.filter(Boolean).length * 100 / want.length);' 'const mean = grades.reduce(function (sum, grade) { return sum + grade; }, 0) / grades.length;' 'const failures = [];' > suite6.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
スイートを書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function gate(name, ok, detail) {' ' console.log(\"ゲート \" + name + \": \" + (ok ? \"ok\" : \"失敗\") + (detail ? \" (\" + detail + \")\" : \"\"));' ' if (ok === false) failures.push(name);' '}' 'console.log(\"ケース: \" + want.length + \"、合格率: \" + rate + \" パーセント、基準: \" + baseline);' 'gate(\"合格率 \" + gates.minRate + \" 以上\", rate >= gates.minRate, \"\");' 'gate(\"低下 \" + gates.maxDrop + \" ポイント以内\", baseline - rate <= gates.maxDrop, \"\");' >> suite6.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
スイートを書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const broken = gates.must.filter(function (id) { return results[id - 1] === false; });' 'gate(\"必須ケース\", broken.length === 0, broken.length ? \"不合格: \" + broken.join(\"、\") : \"\");' 'gate(\"審査役の平均 \" + gates.minJudge + \" 以上\", mean >= gates.minJudge, \"平均 \" + mean.toFixed(1));' 'console.log(failures.length ? \"結果: 失敗、\" + failures.length + \" 個のゲート\" : \"結果: 合格\");' 'process.exit(failures.length ? 1 : 0);' >> suite6.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
スイートを動かし、終了コードを読む
docker exec -w /home/node/project agent node suite6.js; echo 終了コード $?ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
スイートが表示するもの
| 行 | 示す内容 |
|---|---|
| ケース | 12 件、75 パーセント、基準 83 |
| 合格率のゲート | ok。75 は下限の 75 に届いている |
| 低下のゲート | ok。8 ポイントは許される上限 |
| 必須ケースのゲート | 失敗。ケース 10 |
| 審査役のゲート | ok。平均 2.1 |
| 最後の行 | 結果: 失敗、そのあとに終了コード 1 |
学生が入力するセルは、このプレビューでは空白です。
試してみましょう
ヒント
suitedata.js で、must を [10] から空のリストに変え、もう一度実行します。結果は合格になり、終了コードは 0 になるはずです。それが正しい直し方だったか、考えてみましょう。
よくある間違い
注意
ゲートは書いたら終わりだと考える人が多くいます。見直されないゲートはずれていきます。ケースは古くなり、限度は大事な点を捉えなくなります。機能が変わるたびにゲートを見直し、実際の失敗のたびにケースを足しましょう。