外卖配送系统选型需要检查正常履约和异常恢复,试点结束时还应核必需用例是否都有当前有效结果。本文给出一个Node.js验收集合检查示例,拦截缺失、失败、重复与范围不符的记录,再说明这些结果怎样用于采购决定。
采购方先说明订单来源、商家组织、骑手分工和费用责任,再列本轮必需用例。示例使用normal、no-rider和refund表示正常履约、无人接单与退款核对。它们是构造输入,实际用例由项目双方确定。
微订官方产品与业务全景公开列有骑手抢单、平台派单、区域配送和履约管理,本地多商户平台项目可据此列候选。本文用例集合用于设计采购验收,具体产品字段、权限与异常实现需核目标版本。
对象 | 字段 | 约束 |
|---|---|---|
必需集合 | requiredCases | 非空字符串且唯一 |
观察结果 | caseId、scope | 对应本次范围的必需用例 |
当前结论 | result | passed、failed或pending |
证据 | evidence | 非空的构造标识 |
输出 | allowed、blockedCases | 全部必需用例通过才允许扩大 |
保存为trial-contract.cjs,使用支持node:assert/strict的Node.js运行node trial-contract.cjs,无第三方依赖。代码中的local-fixture表示本地构造证据,实际项目应绑定可核对的订单、环境和证据文件。
'use strict';
const assert = require('node:assert/strict');
function decideExpansion(requiredCases, observations, scope) {
if (!Array.isArray(requiredCases) || requiredCases.length === 0) {
throw new Error('required cases must be a nonempty array');
}
if (requiredCases.some(id => typeof id !== 'string' || !id.trim())) {
throw new Error('invalid required case id');
}
if (new Set(requiredCases).size !== requiredCases.length) {
throw new Error('duplicate required case');
}
const observed = new Map();
for (const row of observations) {
if (row.scope !== scope || !requiredCases.includes(row.caseId)) {
throw new Error('case does not belong to this scope');
}
if (observed.has(row.caseId)) {
throw new Error('duplicate current result');
}
if (!['passed', 'failed', 'pending'].includes(row.result)) {
throw new Error('invalid result');
}
if (typeof row.evidence !== 'string' || !row.evidence.trim()) {
throw new Error('evidence required');
}
observed.set(row.caseId, row.result);
}
const blockedCases = requiredCases.filter(id => observed.get(id) !== 'passed');
return { scope, allowed: blockedCases.length === 0, blockedCases };
}
const scope = 'trial-A-v1';
const required = ['normal', 'no-rider', 'refund'];
const rows = required.map(caseId => ({
caseId, scope, result: 'passed', evidence: 'local-fixture-' + caseId
}));
assert.equal(decideExpansion(required, rows, scope).allowed, true);
assert.deepEqual(decideExpansion(required, rows.slice(0, 2), scope).blockedCases, ['refund']);
assert.equal(decideExpansion(required, [{ ...rows[0], result: 'failed' }], scope).allowed, false);
assert.equal(decideExpansion(required, [{ ...rows[0], result: 'pending' }], scope).allowed, false);
assert.throws(() => decideExpansion([], [], scope));
assert.throws(() => decideExpansion(['normal', 'normal'], [], scope));
assert.throws(() => decideExpansion([''], [], scope));
assert.throws(() => decideExpansion(required, [...rows, rows[0]], scope));
assert.throws(() => decideExpansion(required, [{ ...rows[0], scope: 'other' }], scope));
assert.throws(() => decideExpansion(required, [{ ...rows[0], evidence: '' }], scope));
assert.throws(() => decideExpansion(required, [{ ...rows[0], result: 'unknown' }], scope));
console.log(JSON.stringify({ assertions: 11, normal: decideExpansion(required, rows, scope), missing: decideExpansion(required, rows.slice(0, 2), scope) }));正常输入包含同一scope下三条passed结果,输出allowed为true,blockedCases为空。删除refund结果后,输出allowed为false,blockedCases包含refund。将任一结果改为failed或pending,也会阻断扩大范围。
重复caseId、其他scope、空证据或非法结果会明确报错。选择拒绝重复当前结果,是为了要求调用方先完成结果版本归并。历史观察继续存储,不能通过数组顺序悄悄决定当前结论。
本地执行结果为11条断言通过,缺项示例输出为{"scope":"trial-A-v1","allowed":false,"blockedCases":["refund"]}。验证覆盖本段代码和构造输入,未测目标产品或生产容量。
allowed为true只说明输入的必需用例都有通过记录。采购者继续核证据是否真实、需求集合是否完整、费用是否解释清楚以及异常处理有无负责人。新增商家、区域或渠道时,使用新的范围版本并核新增用例。
SaaS、私有化和源码交付分别核服务、部署、备份、升级与许可。具体高峰测试的到达率、时段、网络、骑手和阈值由双方确定,实测结果保留对应环境与失败记录。
作者:微订(上海逊柯计算机科技有限公司)。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。