该技能面向 react-native-executorch 的 TypeScript API 测试编写,适用于在 src/ 下新增或修改任务流水线、hook、原生算子封装或注册表条目并需要为其补充测试覆盖的场景。
【用途】 每次修改 src/ 下的代码,都应在 packages/react-native-executorch/tests/ 的 Jest 测试套件中补充测试。这些测试可在笔记本或 CI 运行器上执行,不需要模拟器、设备或 .pte 文件,几秒内即可完成。类型检查也顺带覆盖:yarn typecheck 已包含 tests/。
【运行方式】
- yarn workspace react-native-executorch test
- yarn workspace react-native-executorch test tests/tasks(单个目录)
- yarn workspace react-native-executorch test -u(更新快照)
【模拟原生运行时】 不单独桩化每个 JSI 调用,而是由 tests/support/fakeJsi.ts 用 JavaScript 实现整个 rnexecutorch_jsi 契约:张量持有真实数据,math/cv/speech 算子计算真实值,任务流水线可端到端运行,断言衡量的是其自身逻辑。测试先描述想要的模型,再驱动真实流水线。
主要辅助函数包括:fakeJsi.registerModel / registerTokenizer / registerLLMRunner 分别让加载模型、分词器、LLM 运行器成功并指定程序;fakePhonemizer.serve 脚本化原生字素到音素转换;fakeFs.write 写入流水线会读取的文件;exported 将 spec 重解释为导出 spec;writesOutputs / copiesInputToOutput 提供现成的 execute 实现;tracked 在测试结束时自动释放;imageBuffer 生成确定性输入图像;cachePathFor 计算下载路径以便 hook 测试预先注册模型;fakeNet.serve 脚本化服务器(状态、响应体、Range 支持、保持下载打开的闸门)。
【新任务流水线应覆盖的内容】
- Schema 接受:流水线声明的每个变体(batched、unbatched 等)各一个测试,断言工厂能解析。
- Schema 拒绝:不匹配任何变体的模型,断言错误信息指出不匹配之处(如 Rank mismatch、inconsistent bindings 等)。
- 配置不匹配:例如 labels 数组与模型输出维度不一致。
- 后处理:排序、阈值、抑制、颜色映射、坐标缩放等自行实现的部分,选择能让预期输出一目了然的测试值。
- 选项:modelOpts 的每个默认值及每次调用的覆盖。
- 释放:dispose() 后 fakeJsi.liveTensors() 为 0、liveModels() 为空,重复调用不累积临时张量;构造失败时同样如此,应通过 createResourceScope() 分配并在工厂体内用 try/catch,使 schema 不匹配时释放模型而非滞留,并将工厂加入 tests/tasks/constructionFailure.test.ts。
- 同步/异步一致性:runTaskWorklet(x) 等于 await runTask(x)。 只有权重不在范围内,运行在其上的流水线仍在范围内;解码循环、滑动窗口、分块器、参数检查、流式生成器和释放路径均可在脚本化 execute 上运行。
【新 hook】 在 tests/hooks/ 增加用例:下载完成前未就绪、完成后暴露方法、错误通过共享错误字段呈现、卸载时释放所有原生句柄。
【泄漏检查】 原生内存不受垃圾回收,安装文件在每个测试后断言没有通过 fake 分配而未释放的资源。构造用 tracked() 包裹,测试结束释放并避免失败断言级联成第二个误导性错误。故意泄漏的测试需调用 allowNativeLeaks() 并注释原因。
【源码级约定】 tests/api/workletDirective.test.ts 用 TypeScript 编译器解析 src/,强制类型无法表达的约定:调用 rnexecutorchJsi 的导出函数以 'worklet' 开头;async 函数不得标记为 worklet;只有 src/native/bridge.ts 命名 rnexecutorch_jsi 全局;core/ 不得从 extensions/ 导入,hooks/ 不得从 native/ 导入。新增原生封装缺少指令会使该套件失败,应补指令而非加例外。
【验证清单】 修改 src/ 下代码时确认:yarn workspace react-native-executorch test 通过;新任务流水线有覆盖接受、拒绝、后处理、选项和释放的套件;新 hook 在 tests/hooks/ 有生命周期用例;新注册表条目通过 tests/api/modelRegistry.test.ts 且未放宽规则(https URL、固定修订、modelname_backend_precision.pte、命名后端的文件夹、DEFAULT 为该组提供的配置之一);新错误码在 VALID_ERROR_CODES 中,tests/core/error.test.ts 会从源码读取每个错误码并检查其已列出;新导出反映在 api/apiSurface 快照中且变更是有意的(移除或重命名为破坏性变更);tests/support/ 中新增 fake 行为在影响断言处保持忠实并注释简化;新的 create<Task> 通过 createResourceScope() 分配并列入 constructionFailure.test.ts;没有测试通过调用 allowNativeLeaks() 来通过,当前套件无需它,仅在泄漏确为测试目的时使用并说明原因。
【限制】 该技能不覆盖模型权重本身的测试,测试依赖仓库内提供的 fake 运行时与辅助工具,具体命令与文件路径以资料所述为准;资料未提供更多平台或收费信息。