如何运行 Modly 测试套件?pytest + node --test 双测试体系完整指南
【免费下载链接】modlyDesktop app to generate 3D models from images or prompt using local AI — runs entirely on your GPU项目地址: https://gitcode.com/GitHub_Trending/mo/modly
Modly 是一款本地 AI 驱动的 3D 模型生成桌面应用,它的测试套件采用 pytest 命名 + node --test 的双测试体系:Python 侧覆盖api/后端,Node 侧覆盖前端与 Electron 主进程,一条npm test命令即可全量运行。本文带你快速理解这套体系并跑通全部用例 🧪
双测试体系总览
Modly 的代码分为两个世界:Python 后端(负责模型扩展进程管理)和TypeScript 前端(Electron + React 界面)。测试也相应拆成两条流水线,统一由 npm scripts 编排:
| 侧 | 框架 | 测试目录 | 触发命令 |
|---|---|---|---|
| Python 后端 | 标准库unittest | api/tests/ | npm run test:py |
| Node.js / Electron | 原生node --test | 分散于src/、electron/ | npm run test:node |
| 全量 | — | — | npm test |
三个命令的定义都集中在 package.json 中:
"test": "npm run test:py && npm run test:node", "test:py": "node scripts/run-pytests.mjs", "test:node": "node --test … "💡小贴士:跑之前先执行一次
npm install,并确保系统里有可用的 Python 3 解释器(详见 README.md 的开发环境章节)。
一键安装与运行步骤
完整流程只有两步:
npm install npm testnpm test会先跑 Python 侧,再跑 Node 侧,任何一侧失败都会以非零退出码终止,方便接入 CI。若还想做更严格的质量门禁,README.md 建议追加类型检查与构建:
./node_modules/.bin/tsc --noEmit -p tsconfig.node.json npm run buildPython 侧:为什么叫 run-pytests?
这是最容易让人困惑的地方 🤔 —— 脚本名字叫 scripts/run-pytests.mjs,但项目并没有依赖 pytest,实际调用的是 Python 标准库的unittest。这个脚本做了两件聪明的事:
- 跨平台解释器探测:依次尝试
python3、python、py -3(Windows 启动器),谁可用就用谁,找不到则报错退出; - 测试发现:在
api/目录下执行python -m unittest discover -s tests,自动收集所有测试文件。
目前包含两组用例:
- api/tests/test_runner.py —— 验证扩展运行器的节点选择、manifest 元数据合并,以及扩展子进程的 newline-JSON 通信协议(
recv/send); - api/tests/test_extension_process.py —— 验证扩展进程的 venv 解释器路径解析、缺失模块提取与自动修复映射等安全逻辑。
如果想单独手动运行Python 测试:
cd api python -m unittest discover -s tests另外 tools/modly-cli/test_agent.py 是 CLI 工具的独立测试,可用python tools/modly-cli/test_agent.py单独执行。
Node 侧:node --test 如何直跑 TypeScript
Node 18 内置的node --test测试运行器是 Node 侧的核心,test:node实际上分两段执行:
第一段:TypeScript 测试文件
node --test --experimental-strip-types \ --experimental-loader ./scripts/node-ts-extensionless-loader.mjs \ src/shared/types/assetLibrary.test.ts …两个关键参数值得理解:
--experimental-strip-types:让 Node 直接运行.ts文件(需要Node 22+);--experimental-loader:加载自定义 scripts/node-ts-extensionless-loader.mjs,当import './foo'找不到模块时自动补上.ts后缀重试一次,解决了 TS 无扩展名导入的痛点。
第二段:JavaScript 测试文件(glob 通配)
node --test electron/main/*.test.mjs src/**/*.test.mjsNode 侧覆盖的代表性用例:
| 测试文件 | 关注点 |
|---|---|
| electron/main/extension-path-guard.test.ts | 扩展 ID 安全校验,拒绝路径穿越与非法字符 |
| electron/main/artifact-registry-service.test.ts | 工件注册服务 |
| src/shared/types/assetLibrary.test.ts | 资产库能力分类与条目模型 |
| src/areas/generate/assetLibraryService.test.ts | 资产库服务逻辑 |
| src/areas/workflows/nodeBehaviors.test.mjs | 工作流节点行为 |
| src/shared/utils/format.test.mjs | 格式化工具函数 |
这些用例都遵循统一风格:node:test定义用例 +node:assert/strict断言,零额外测试依赖。想单独调试某个文件时,直接:
node --test electron/main/extension-path-guard.test.ts常见问题排查
| 症状 | 原因与解法 |
|---|---|
No Python interpreter found (tried python3, python, py -3) | 系统缺少 Python 3,安装后重跑npm test |
--experimental-strip-types报错 | Node 版本过低,升级到Node 22+ |
| Python 侧 0 个用例被发现 | 确认在仓库根目录执行,发现目录为 api/tests/ |
| 想看详细输出 | 分别单独运行npm run test:py和npm run test:node分段观察 |
结语
Modly 的双测试体系体现了"少即是多"的工程哲学:Python 侧靠标准库 unittest,Node 侧靠原生 node --test,不引入任何重型测试框架。掌握npm test这一条命令后,你可以在贡献代码或排查问题前,先为整个本地 AI 3D 生成流水线做一次完整体检 ✅
相关模块路径速查:
- 测试编排入口:package.json
- Python 可移植运行器:scripts/run-pytests.mjs
- TS 无扩展名解析器:scripts/node-ts-extensionless-loader.mjs
- 开发环境与测试说明:README.md
【免费下载链接】modlyDesktop app to generate 3D models from images or prompt using local AI — runs entirely on your GPU项目地址: https://gitcode.com/GitHub_Trending/mo/modly
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考