1
0
Files
DiAL/docs/development/testing-quality.md

4.6 KiB
Raw Blame History

测试与质量

质量命令

命令 说明
bun run lint ESLint 检查含类型感知规则、导入排序、导入验证、Prettier 格式
bun run format Prettier 自动格式化
bun run schema:check 检查 probe-config.schema.json 是否与 TypeBox fragments 同步
bun run typecheck TypeScript 类型检查
bun test 运行所有测试
bun run check schema:check + typecheck + lint + test
bun run verify check + build

ESLint

配置文件:eslint.config.js

配置来源 用途
@eslint/js recommended JavaScript 基础规则
typescript-eslint recommended-type-checked TypeScript 类型感知规则
typescript-eslint stylistic-type-checked TypeScript 风格规则
eslint-plugin-perfectionist 导入语句和命名导出排序
eslint-plugin-import 导入路径验证、循环依赖检测、重复导入合并
eslint-plugin-prettier 将 Prettier 格式集成为 ESLint 规则

后端运行时代码禁止直接使用 console.*,请通过注入的 Logger 实例输出日志。

Prettier

配置文件:.prettierrc.json。显式声明格式化参数,包括 printWidth: 120semi: truesingleQuote: falsetrailingComma: "all"endOfLine: "lf"

TypeScript 严格标志

标志 说明
strict true 全局严格模式
noUnusedLocals true 未使用局部变量视为错误
noUnusedParameters false 保留关闭
noPropertyAccessFromIndexSignature true 索引签名必须用括号访问
noUncheckedIndexedAccess true 数组和 Map 访问必须运行时检查
noImplicitOverride true 覆盖父类方法必须显式 override
verbatimModuleSyntax true 强制 import type 纯类型导入

Git hooks

Hook 行为
pre-commit lint-staged 对变更文件运行 eslint/prettier
commit-msg commitlint 校验提交信息格式

提交信息格式为 类型: 简短描述,类型限定为 featfixrefactordocsstyletestchore

测试分层

层级 覆盖范围 位置
单元测试 后端函数、纯函数、常量 tests/server/**/*.test.tstests/web/{constants,utils,hooks}/**/*.test.ts
组件测试 React 组件渲染和交互 tests/web/components/**/*.test.tsx

测试命令

bun test
bun test tests/server
bun test tests/web
bun run check
bun run verify

组件测试环境

组件测试使用 jsdom配置位于 tests/setup.ts,通过 bunfig.toml preload 加载。

包含的 polyfill 和 mock

  • ResizeObserver
  • IntersectionObserver
  • matchMedia
  • attachEvent
  • recharts 图表 mock

编写规范

  • 优先使用 @testing-library/react 的语义化查询。
  • 测试用户行为而非实现细节。
  • 只 mock 系统边界。
  • 使用真实的 QueryClientProvider 包裹组件。
  • 组件测试文件命名为 tests/web/components/ComponentName.test.tsx
  • 异步错误断言使用 helper 或显式 try/catch避免依赖 Bun expect(...).rejectsawait-thenable 规则的类型不匹配。
  • polyfill 中的 intentional no-op 使用显式可解释写法。
  • process.exit 等系统 API 使用 spyOn 受控 mock。