新しいプロンプトは悪くなったか
回帰テストの実行とは、機能の2つのバージョンを同じケースで比べ、何が悪くなったかを示すことです。あるメッセージを直した変更が別のメッセージを壊すことはよくあり、誰も気づかないので、役に立ちます。
ショップの振り分け機能に新しいバージョンができました。合格率は前と同じに見えます。それは、何も変わっていないという意味ではありません。
このレッスンのゴール
メモ
私は、2つのバージョンを同じケースで比べ、一方が悪くなったかを判断できます。
キーワード
| ことば | いみ |
|---|---|
| 回帰 | 前は合格で、今は不合格のケース |
| 合格率 | 合格したケースの割合 |
| 基準版 | 比べる相手のバージョン |
| ばらつき | 同じバージョンの実行どうしの差 |
| 不安定なケース | 実行によって合格したり不合格になったりするケース |
学生が入力するセルは、このプレビューでは空白です。
同じケースで、バージョンごとに比べる
2つのバージョンを同じゴールデンセットで実行し、ケースごとの結果を残します。合格率は1つの数字を与えます。変わったケースの一覧は、その理由を与えます。
回帰とは、基準版では合格で、今は不合格のケースです。合格率より先に、この一覧を読みます。
例: 合格率は同じで、ケースが違う
| バージョン | 12件中の合格数 | 合格率 | 不合格のケース |
|---|---|---|---|
| 古い版、実行1 | 10 | 83 パーセント | 8、12 |
| 古い版、実行2 | 9 | 75 パーセント | 5、11、12 |
| 新しい版 | 9 | 75 パーセント | 4、10、12 |
学生が入力するセルは、このプレビューでは空白です。
返事は変わるので、1回の実行では分からない
モデルは、同じメッセージにも毎回違う答えを返すことがあります。そこで、古いバージョンを2回実行します。2つの合格率の差がばらつきです。
不安定なケースは、ある実行で合格し、次の実行で不合格になります。それを新しいバージョンのせいにしてはいけません。
まず合格率で、次にケースで決める
新しい合格率が古い合格率より、ばらつきを超えて低ければ、悪化です。ばらつきの中なら、合格率は何も語りません。
次にケースを見ます。古い実行のすべてで合格し、新しい実行で不合格になったケースは、確かな回帰です。直すべきなのは、これです。
記録した3回の実行を書く(1)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const want = [\"請求\", \"配送\", \"その他\", \"請求\", \"配送\", \"その他\", \"請求\", \"配送\", \"不明\", \"不明\", \"請求\", \"その他\"];' '// 記録した実行。ケースごとにラベルと緊急度、必要なら文章も。' 'const runA1 = [[\"請求\", 2], [\"配送\", 2], [\"その他\", 1], [\"請求\", 2], [\"配送\", 3], [\"その他\", 1], [\"請求\", 2], [\"請求\", 2], [\"不明\", 1], [\"不明\", 1], [\"請求\", 3], [\"配送\", 2]];' > runs.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
記録した3回の実行を書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const runA2 = [[\"請求\", 2], [\"配送\", 2], [\"その他\", 1], [\"請求\", 2], [\"その他\", 1], [\"その他\", 1], [\"請求\", 2], [\"配送\", 2], [\"不明\", 1], [\"不明\", 1], [\"その他\", 2], [\"配送\", 2]];' >> runs.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
記録した3回の実行を書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const runB = [[\"請求\", 2], [\"配送\", 2], [\"その他\", 1], [\"その他\", 2], [\"配送\", 3], [\"その他\", 1], [\"請求\", 2], [\"配送\", 2], [\"不明\", 1], [\"不明\", 1, \"返金を承認しました。\"], [\"請求\", 3], [\"配送\", 2]];' 'module.exports = { want, runA1, runA2, runB };' >> runs.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
比較を書く(1)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { want, runA1, runA2, runB } = require(\"./runs\");' '// レッスン2のルールを短くしたもの: ラベルが合う、緊急度が1から3、禁止フレーズがない。' 'function passes(entry, expected) {' ' const said = entry[2] || \"\";' ' return entry[0] === expected && entry[1] >= 1 && entry[1] <= 3 && said.includes(\"返金を承認しました\") === false;' '}' 'function results(run) {' ' return run.map(function (entry, at) { return passes(entry, want[at]); });' '}' > compare3.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
比較を書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function rate(list) {' ' return Math.floor(list.filter(Boolean).length * 100 / list.length);' '}' 'const a1 = results(runA1);' 'const a2 = results(runA2);' 'const b = results(runB);' 'console.log(\"合格率 A1: \" + rate(a1) + \" パーセント\");' 'console.log(\"合格率 A2: \" + rate(a2) + \" パーセント\");' 'console.log(\"合格率 B: \" + rate(b) + \" パーセント\");' 'const noise = Math.abs(rate(a1) - rate(a2));' 'console.log(\"A1 と A2 のばらつき: \" + noise + \" ポイント\");' >> compare3.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
比較を書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const low = Math.min(rate(a1), rate(a2));' 'const high = Math.max(rate(a1), rate(a2));' 'let verdict = \"はっきりした変化なし\";' 'if (rate(b) < low - noise) verdict = \"悪化\";' 'if (rate(b) > high + noise) verdict = \"改善\";' 'console.log(\"合格率だけで見た判定: \" + verdict);' 'const worse = [];' 'const unstable = [];' 'const always = [];' 'for (let at = 0; at < want.length; at = at + 1) {' ' const same = a1[at] === a2[at];' ' if (same === false) unstable.push(at + 1);' ' else if (a1[at] && b[at] === false) worse.push(at + 1);' ' else if (a1[at] === false && b[at] === false) always.push(at + 1);' '}' 'console.log(\"回帰 (A1 と A2 で合格、B で不合格): \" + worse.join(\"、\"));' 'console.log(\"不安定 (A1 と A2 で結果が違う): \" + unstable.join(\"、\"));' 'console.log(\"どの実行でも不合格: \" + always.join(\"、\"));' >> compare3.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
バージョンを比べる
docker exec -w /home/node/project agent node compare3.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
比較が表示するもの
| 行 | 示す内容 |
|---|---|
| 合格率 | A1 は 83、A2 は 75、B は 75 パーセント |
| ばらつき | 8 ポイント |
| 合格率だけの判定 | はっきりした変化なし |
| 回帰 | ケース 4 と 10 |
| 不安定 | ケース 5、8、11 |
| どの実行でも不合格 | ケース 12 |
学生が入力するセルは、このプレビューでは空白です。
試してみましょう
ヒント
runs.js で、runB のケース1の緊急度を2から9に変え、もう一度比べます。ケース1が回帰に加わるはずです。
よくある間違い
注意
各バージョンを1回ずつ実行して、その差を信じる人が多くいます。返事が変わるときは、1回の実行がどちらにも誤解を生みえます。基準版は少なくとも2回実行し、ばらつきを測り、変化はそれと比べて判断します。