訂明本例驗收任務
假設有序驗收遇第一題失敗就停止,後面須用 null 表示未做。已做結果須為連續前段;首敗或未做 null 後不能再有布林結果。分開列計劃覆蓋及已做個案成功比例;未做不能當成功或失敗。
- 核有序停止記錄
- 分開數已做與未做
- 通過數沿用已觀察分母
停止點後仍有結果,須修執行定義或記錄。
使用已填個案
| 個案 | 已提供輸入 | 預期結構化結果 | 判斷及原因 |
|---|---|---|---|
| 第二題失敗便停止 | {"results":[true,false,null,null,null]} | {"planned":5,"observed":2,"passed":1,"notRun":3} | 已做通過 1/2,計劃覆蓋 2/5;三題未做。 |
| 全部計劃題通過 | {"results":[true,true,true]} | {"planned":3,"observed":3,"passed":3,"notRun":0} | 沒有失敗觸發停止,三次觀察都保留。 |
| 未做中間題後又有觀察 | {"results":[true,null,false]} | {"error":"stop-ledger"} | 未做後段開始後又有觀察,違反連續有序記錄。 |
| 停止後又有結果 | {"results":[false,true,null]} | {"error":"stop-ledger"} | 記錄違反遇首敗停止的規則。 |
逐步處理 result-after-stop 個案,須得到甚麼結果?原因是甚麼?
查看參考答案
{"error":"stop-ledger"}。記錄違反遇首敗停止的規則。
執行完整本機驗算
import assert from 'node:assert/strict';
function evaluate(x){
let stopped=false;for(const v of x.results){if(stopped&&v!==null)return {error:'stop-ledger'};if(v===false||v===null)stopped=true;if(v!==null&&typeof v!=='boolean')return {error:'label'};}
const observed=x.results.filter(v=>v!==null),passed=observed.filter(Boolean).length;return {planned:x.results.length,observed:observed.length,passed,notRun:x.results.length-observed.length};
}
const cases = [
{
"id": "stop-on-second",
"input": {
"results": [
true,
false,
null,
null,
null
]
},
"expected": {
"planned": 5,
"observed": 2,
"passed": 1,
"notRun": 3
}
},
{
"id": "all-completed",
"input": {
"results": [
true,
true,
true
]
},
"expected": {
"planned": 3,
"observed": 3,
"passed": 3,
"notRun": 0
}
},
{
"id": "observation-after-not-run",
"input": {
"results": [
true,
null,
false
]
},
"expected": {
"error": "stop-ledger"
}
},
{
"id": "result-after-stop",
"input": {
"results": [
false,
true,
null
]
},
"expected": {
"error": "stop-ledger"
}
}
];
for (const c of cases) assert.deepEqual(evaluate(c.input), c.expected, c.id);
console.log(JSON.stringify({checked:cases.length,caseIds:cases.map(c=>c.id)}));
計劃編號連同 null 狀態保存。此有限清單不提供略過題的答案或整體人口準確率。