5.1 KiB
5.1 KiB
测试规范文档
📋 测试策略
测试层次
- 单元测试: 覆盖率 >= 80%
- 集成测试: 覆盖核心业务流程
- 接口测试: 覆盖所有API端点
- 端到端测试: 覆盖用户关键路径
测试框架
- 后端: Jest + Supertest
- 前端: Vitest + Vue Test Utils
- 接口: Postman + Newman
- 性能: JMeter
🧪 单元测试规范
测试文件命名
src/services/user.service.js -> tests/unit/services/user.service.test.js
src/utils/validator.js -> tests/unit/utils/validator.test.js
src/components/UserForm.vue -> tests/unit/components/UserForm.spec.ts
测试结构
describe('模块名称', () => {
beforeEach(() => {
// 测试前置操作
});
describe('方法名称', () => {
it('should 预期行为 when 条件', () => {
// Arrange - 准备
// Act - 执行
// Assert - 断言
});
});
});
示例代码
// 后端单元测试
describe('UserService', () => {
describe('createUser', () => {
it('should create user successfully', async () => {
const userData = { phone: '13800138000' };
const mockUser = { id: 1, ...userData };
User.create = jest.fn().mockResolvedValue(mockUser);
const result = await UserService.createUser(userData);
expect(User.create).toHaveBeenCalledWith(userData);
expect(result).toEqual(mockUser);
});
});
});
// 前端组件测试
describe('UserForm', () => {
it('validates required fields', async () => {
const wrapper = mount(UserForm);
await wrapper.find('form').trigger('submit');
expect(wrapper.text()).toContain('请输入真实姓名');
});
});
🔗 接口测试规范
Postman测试集合
// 认证接口测试
pm.test("登录成功", function () {
pm.response.to.have.status(200);
const response = pm.response.json();
pm.expect(response.code).to.eql(200);
pm.expect(response.data.token).to.not.be.empty;
// 保存token用于后续测试
pm.environment.set("authToken", response.data.token);
});
// 业务接口测试
pm.test("创建订单成功", function () {
pm.response.to.have.status(200);
const response = pm.response.json();
pm.expect(response.data.id).to.be.a('number');
pm.environment.set("orderId", response.data.id);
});
自动化测试脚本
# 运行Postman测试
newman run tests/api/niumall-api.postman_collection.json \
-e tests/api/test-environment.json \
--reporters cli,html \
--reporter-html-export reports/api-test-report.html
🎯 端到端测试
关键用户路径
- 用户注册登录流程
- 订单创建到完成流程
- 运输跟踪流程
- 支付结算流程
Cypress测试示例
describe('订单管理流程', () => {
beforeEach(() => {
cy.login('client'); // 自定义命令
});
it('客户可以创建订单', () => {
cy.visit('/orders/create');
cy.get('[data-cy=supplier-select]').select('供应商A');
cy.get('[data-cy=cattle-type]').type('肉牛');
cy.get('[data-cy=quantity]').type('10');
cy.get('[data-cy=submit-btn]').click();
cy.url().should('include', '/orders/');
cy.contains('订单创建成功');
});
});
📊 性能测试
JMeter测试计划
<!-- 并发用户登录测试 -->
<ThreadGroup>
<elementProp name="ThreadGroup.arguments" elementType="Arguments"/>
<stringProp name="ThreadGroup.num_threads">100</stringProp>
<stringProp name="ThreadGroup.ramp_time">60</stringProp>
<stringProp name="ThreadGroup.duration">300</stringProp>
</ThreadGroup>
性能指标要求
- 响应时间: API < 200ms, 页面 < 3s
- 并发用户: 支持1000并发
- 错误率: < 0.1%
- TPS: >= 500
🔍 质量检查
代码覆盖率
# 后端覆盖率
npm run test:coverage
# 前端覆盖率
npm run test:unit -- --coverage
测试执行
# 运行所有测试
npm test
# 运行单元测试
npm run test:unit
# 运行集成测试
npm run test:integration
# 运行E2E测试
npm run test:e2e
CI/CD集成
# .github/workflows/test.yml
name: Test Pipeline
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: '18'
- name: Install dependencies
run: npm ci
- name: Run unit tests
run: npm run test:unit
- name: Run integration tests
run: npm run test:integration
- name: Upload coverage
uses: codecov/codecov-action@v2
📋 测试检查清单
提交前检查
- 所有单元测试通过
- 代码覆盖率 >= 80%
- 集成测试通过
- API测试通过
- 无ESLint错误
发布前检查
- 端到端测试通过
- 性能测试达标
- 安全扫描通过
- 浏览器兼容性测试
- 移动端适配测试
📞 测试支持
- 测试负责人: test@niumall.com
- 质量保证: qa@niumall.com
- 性能测试: perf@niumall.com