测试策略
测试分层
静态检查
后端
bash
cd yunstack-backend
pnpm lint # ESLint 检查
pnpm format # Prettier 格式化
npx tsc --noEmit # TypeScript 类型检查前端
bash
cd yunstack-web
pnpm lint:eslint # ESLint
pnpm lint:prettier # Prettier
pnpm lint:stylelint # Stylelint
pnpm type-check # TypeScript
cd yunstack-uniapp
pnpm lint:eslint
pnpm lint:prettier
pnpm lint:stylelint
pnpm type-check单元测试
后端 (Jest)
bash
cd yunstack-backend
pnpm test # 运行全部测试
pnpm test:watch # 监听模式
pnpm test:cov # 覆盖率报告编写规范:
typescript
// user.service.spec.ts
import { Test, TestingModule } from '@nestjs/testing';
import { UserService } from './user.service';
describe('UserService', () => {
let service: UserService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [UserService],
}).compile();
service = module.get<UserService>(UserService);
});
describe('findAll', () => {
it('should return paginated users', async () => {
const result = await service.findAll({ pageNum: 1, pageSize: 10 });
expect(result.list).toBeDefined();
expect(result.total).toBeGreaterThanOrEqual(0);
});
});
});前端 (待实现)
bash
cd yunstack-web
# 计划使用 Vitest
pnpm test
pnpm test:covE2E 测试
后端 (Supertest)
bash
cd yunstack-backend
pnpm test:e2etypescript
// test/auth.e2e-spec.ts
import * as request from 'supertest';
describe('Auth (e2e)', () => {
it('/api/v1/auth/login (POST)', () => {
return request(app.getHttpServer())
.post('/api/v1/auth/login')
.send({ username: 'admin', password: '123456' })
.expect(201)
.expect(res => {
expect(res.body.code).toBe('00000');
});
});
});测试覆盖率目标
| 层级 | 目标 | 说明 |
|---|---|---|
| Service 层 | ≥ 80% | 核心业务逻辑 |
| Controller 层 | ≥ 60% | 路由和参数校验 |
| 工具函数 | ≥ 90% | 纯函数易于测试 |
| E2E | 核心流程 | 登录、CRUD、设备通信 |
关键测试场景
后端必须测试
- 认证流程:登录成功/失败、Token 刷新、登出
- 权限控制:admin/普通用户访问权限边界
- CRUD 操作:创建、查询、更新、删除的正确性
- 参数校验:必填字段、类型校验、边界值
- MQTT 消息处理:消息解析、Topic 匹配
前端必须测试
- 登录流程:表单验证、Token 存储、路由跳转
- 权限路由:角色路由过滤
- 列表页面:分页、搜索、排序
CI/CD 集成
yaml
# 未来 GitHub Actions 参考
- name: Lint
run: pnpm lint
- name: Type Check
run: pnpm type-check
- name: Unit Test
run: pnpm test:cov
- name: Build
run: pnpm build