ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TensorFlow.js e2e 集成测试指南:SMOKE / REGRESSION / GOLDEN 标签体系与本地运行实战

TensorFlow.js e2e 集成测试指南:SMOKE / REGRESSION / GOLDEN 标签体系与本地运行实战 TensorFlow.js e2e 集成测试指南SMOKE / REGRESSION / GOLDEN 标签体系与本地运行实战【免费下载链接】tfjsA WebGL accelerated JavaScript library for training and deploying ML models.项目地址: https://gitcode.com/gh_mirrors/tf/tfjs本指南围绕 TensorFlow.js 仓库中 e2e/README.md 所定义的集成与端到端e2e测试体系展开系统讲解该测试包的定位、#SMOKE/#REGRESSION/#GOLDEN三级标签的设计语义、本地运行与过滤方法以及如何为新增测试打标签、如何扩展标签集合。读完本文你将能够独立在本地跑起这套覆盖 CPU / WebGL / WASM / WebGPU 多后端的测试矩阵并为新写的集成测试选择正确的标签与运行时机。e2e 测试包在 TensorFlow.js 中的定位TensorFlow.js 是一个用于在浏览器与 Node.js 中训练和部署机器学习模型的 JavaScript 库其仓库采用 monorepo 结构核心包包括tfjs-core、tfjs-layers、tfjs-converter、tfjs-data、tfjs-node以及tfjs-backend-cpu/tfjs-backend-webgl/tfjs-backend-wasm/tfjs-backend-webgpu等多个后端实现。在这些单元测试之上仓库维护了一个独立的e2e 包位于 e2e/专门承载跨包、跨后端的集成测试与端到端测试。从 e2e/package.json 可以看到该包的依赖策略它通过link:方式直接引用仓库内的tfjs、tfjs-core、tfjs-backend-*、tfjs-converter、tfjs-data、tfjs-layers、tfjs-node等包其余依赖统一从link-package链接因此测试的是当前工作区源码的最新构建产物而非 npm 上的发布版本。这与该包的核心定位一致在每次 PR 与 nightly 构建中跨真实后端验证模型加载、推理、梯度、内存管理、自定义 bundle 等关键用户场景CUJ是否仍然正确。提示执行yarn test之前通常需要先构建被链接的依赖yarn build-deps会依次执行build-link-package、build-union与build-node对应 e2e/package.json 中的脚本定义。标签体系三种标签的设计语义e2e 测试按运行成本与验证目标被划分为三类标签测试描述Jasmineit的字符串必须包含其中至少一个标签。三种标签的语义定义在 e2e/README.md 中并作为常量实现在 e2e/integration_tests/constants.ts标签常量运行时机设计准则#SMOKESMOKE每个 PR 与 nightly 构建轻量级运行快只覆盖关键 CUJ#REGRESSIONREGRESSIONnightly 构建跨后端、跨历史构建、跨其他平台对比结果本地运行需额外步骤#GOLDENGOLDENnightly 构建作为回归的一部分用预构建的 golden 输出校验预训练模型的输出本地运行需额外步骤三者共同组成标签白名单// e2e/integration_tests/constants.ts export const SMOKE #SMOKE; export const REGRESSION #REGRESSION; export const GOLDEN #GOLDEN; /** Testing tags. */ export const TAGS [SMOKE, REGRESSION, GOLDEN];同一文件中还定义了测试后端白名单BACKENDS [cpu, webgl, webgpu]以及各类测试模型清单如LAYERS_MODELS、CONVERT_PREDICT_MODELS体现了标签过滤与后端/模型矩阵之间的配套关系。标签过滤的底层实现标签过滤并非由 karma 或 jasmine 原生提供而是由 e2e 测试自身的启动文件 e2e/integration_tests/setup_test.ts 实现读取 karma 启动参数中--tags的值parseTags()用逗号切分并trim()每个标签凡是不在TAGS白名单中的标签会直接抛出异常并打印支持列表if (!TAGS.includes(tag)) { throw new Error(Tag ${tag} is not supported. Supported tags: ${TAGS}); }setupTestFilters()通过覆盖 Jasmine 的specFilter实现过滤先保留--grep原有的过滤结果再判断测试全名spec.getFullName()是否包含任一指定标签name.includes(tag)命中才放行。因此标签本质上是约定式命名前缀测试描述只要以#SMOKE等标签字符串开头或包含即可被对应的过滤规则命中。本地运行测试按标签过滤在 e2e 目录下设置TAGS环境变量后执行yarn testexport TAGS#SMOKE,#REGRESSION,#GOLDEN yarn test多个标签用逗号分隔属于任一指定标签的测试都会被选中。入口脚本 e2e/scripts/test.sh 定义了如下行为默认值若未设置TAGS自动回退为#SMOKE脚本会打印提示Env variable TAGS is not found, set TAGS#SMOKEnightly 模式若环境变量NIGHTLYtrue会在现有标签基础上自动追加#GOLDEN,#REGRESSION最后统一以yarn karma start --tags $TAGS启动 karma 测试。按 grep 过滤不需要标签语义时可以直接用 Jasmine 的--grep按名称模糊匹配yarn test --grep cpu该参数最终经 e2e/karma.conf.js 的config.grep透传为 karma 参数--grep再交由 jasmine 的specFilter生效。注意setup_test.ts中的实现会同时叠加grep 与标签过滤二者取交集。回归与 golden 测试的额外准备步骤#REGRESSION与#GOLDEN标签下的测试并不只是“跑一下”这么简单。以#REGRESSION为例e2e/scripts/test.sh 在检测到TAGS包含#REGRESSION时会额外执行# 生成规范的 layers 模型与输入数据依赖 Python 环境 ./scripts/create-python-models.sh # 构建并测试 webpack 打包链路 cd webpack_test yarn yarn build cd .. # 生成 custom bundle 测试文件 ./scripts/run-custom-builds.sh其中run-custom-builds.sh会依次构建blazeface、dense_model、universal_sentence_encoder三个自定义模块的 bundle对应 e2e/scripts/run-custom-builds.shwebpack_test目录验证 webpack 打包下各后端能否正常加载。因此本地跑回归测试前请确认 Python 建模脚本与 yarn 依赖已就绪。而#GOLDEN测试在本地/CI 中依赖预先生成的 golden 数据文件CI 通过 e2e/scripts/fetch-graph-model-golden-data-ci.sh 依据integration_tests/graph_model_golden_data/filenames.json清单下载 golden JSON本地则需要通过yarn build-graph-model-golden-data调用scripts/build-graph-model-golden-data.ts先生成这些数据。测试环境与多后端注册e2e 测试并不只在单一后端运行。e2e/integration_tests/setup_test.ts 通过registerTestEnv注册了四个测试环境webgl显式设置WEBGL_VERSION: 2、WEBGL_CPU_FORWARD: false、WEBGL_SIZE_UPLOAD_UNIFORM: 0并使用isDataSync: truewasm注册 WASM 后端cpu注册纯 CPU 后端webgpu仅当运行在 macOS 且存在 Chromenavigator.platform含MAC且window.chrome非空时才注册并关闭WEBGPU_CPU_FORWARD。注释指出 Windows 上 WebGPU 测试尚未支持对应上游 issue #7616。测试环境可通过 karma 参数--testEnv指定也可用--flags注入额外标志见 e2e/karma.conf.js 中config.testEnv/config.flags的透传逻辑。默认使用ChromeHeadless运行配置中还内置了 BrowserStack 的跨浏览器 launcherbs_chrome_mac、bs_firefox_mac、bs_safari_mac、bs_ios_12、bs_android_10、win_10_chrome通过yarn run-browserstack即karma start --browserstack即可在真实设备/浏览器矩阵上执行。添加新测试标签是必选项当向 e2e 包新增测试时必须在测试描述中加入至少一个标签。以 e2e/integration_tests/backends_test.ts 为例import {SMOKE} from ./constants; describeWithFlags( ${SMOKE} backend switching, {predicate: testEnv testEnv.backendName ! cpu testEnv.backendName ! wasm}, (env) { /* ... */ });该文件通过describeWithFlags声明测试环境并把#SMOKE作为描述前缀。标签选择建议只验证关键用户流程、运行耗时短 →#SMOKE它会在每次 PR 与 nightly 中运行必须够快需要跨后端/跨构建/跨平台对比数值结果 →#REGRESSION需要对比预训练模型输出与预构建 golden 数据 →#GOLDEN。GOLDEN 测试的典型实现e2e/integration_tests/graph_model_golden_tests.ts 是#GOLDEN标签的参考实现展示了 golden 测试的完整模式测试描述使用${GOLDEN} graph_model_golden前缀环境为ALL_ENVS每个 golden 文件对应两组基础断言model.predict(...)与model.execute(...)默认输出额外对中间节点做 5 批抽查INTERMEDIATE_NODE_TESTS_NUM 5每隔 5 个节点选取一个连同最终输出一起用model.execute(input, targetNodeNames)校验覆盖图模型中间张量值比较方式逐张量断言dtype、shape并用tfc.test_util.expectArraysClose对数值做近似比对对应expectTensorsToEqualGoldens的实现。这类测试对数据时效性敏感因此测试文件头部的注释将 Jasmine 超时临时调大到1000000ms以避免异步拉取模型/数据导致的偶发超时。golden 数据本身通过KARMA_SERVER即./base/integration_tests以静态文件方式在 karma 中伺服。添加新标签扩展 TAGS 白名单如需引入新的标签原文档要求“扩展integration_tests/util中的 TAGS 列表”。需要说明的是在当前仓库快照中该位置实际落地于 e2e/integration_tests/constants.ts——新增标签需同时修改三处新增标签常量例如export const NIGHTLY #NIGHTLY;将其追加到TAGS数组parseTags的白名单校验依赖它见 e2e/integration_tests/setup_test.ts按需在 e2e/scripts/test.sh 中追加该标签对应的一键式过滤/额外准备逻辑如 REGRESSION 触发的 Python 建模、webpack 构建与 custom bundle 构建步骤。由于标签校验是硬性的不支持的标签直接抛错扩展时务必同步更新TAGS否则带新标签的测试将无法启动。CI 中的运行方式CI 环境下走 e2e/scripts/test-ci.sh与本地脚本的主要差异在于先执行./scripts/run-custom-builds.sh与./scripts/create-python-models.sh准备全部测试资源直接固定TAGS#SMOKE,#REGRESSION,#GOLDEN全量跑一遍yarn karma start --single-run --tags ${TAGS}随后在webpack_test目录执行yarn --mutex network yarn build验证 webpack 打包链路。由此可以看到该套件在 PR 与 nightly 两个节奏上的完整分工PR 阶段只跑快速、关键的#SMOKEnightly 阶段叠加#REGRESSION与#GOLDEN做跨后端与 golden 输出的深度验证。本地开发者若想完整复现 nightly 验证设置NIGHTLYtrue再执行yarn test即可。小结TensorFlow.js 的 e2e 测试包以#SMOKE/#REGRESSION/#GOLDEN三级标签构建了一套成本与深度分层的测试矩阵标签白名单由 e2e/integration_tests/constants.ts 统一定义e2e/integration_tests/setup_test.ts 在 karma/jasmine 之上实现了严格的标签校验与过滤e2e/scripts/test.sh 与 e2e/scripts/test-ci.sh 则分别承载本地与 CI 的运行编排。掌握TAGS/--grep/NIGHTLY这几个入口你就能按需挑选测试粒度——无论是快速验证关键流程还是完整复现跨后端回归与 golden 校验。【免费下载链接】tfjsA WebGL accelerated JavaScript library for training and deploying ML models.项目地址: https://gitcode.com/gh_mirrors/tf/tfjs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表