Files
nxxmdata/docs/development/测试文档.md

570 lines
11 KiB
Markdown
Raw Normal View History

2025-09-19 23:46:15 +08:00
# 宁夏智慧养殖监管平台 测试文档
## 版本历史
| 版本 | 日期 | 作者 | 描述 |
|------|------|------|------|
| v1.0 | 2025-01-20 | 测试团队 | 初始版本 |
## 1. 测试概述
### 1.1 测试目标
本文档旨在为宁夏智慧养殖监管平台提供全面的测试指导,确保系统的功能性、性能、安全性和可靠性满足产品需求。
### 1.2 测试范围
**包含的测试内容:**
- 前端应用测试Vue 3 + Vite
- 后端API测试Node.js + Express
- 数据库测试MySQL
- 小程序测试uni-app
- 集成测试
- 性能测试
- 安全测试
**不包含的测试内容:**
- 第三方服务测试百度地图API等
- 硬件设备测试
- 网络基础设施测试
## 2. 测试策略
### 2.1 测试类型
#### 2.1.1 单元测试
- **目标覆盖率**: ≥80%
- **测试框架**: Jest (后端), Vitest (前端)
- **测试内容**: 函数、组件、工具类
- **执行频率**: 每次代码提交
#### 2.1.2 集成测试
- **测试框架**: Supertest (API), Vue Test Utils (组件)
- **测试内容**: API接口、组件交互、数据流
- **执行频率**: 每日构建
#### 2.1.3 端到端测试
- **测试框架**: Cypress
- **测试内容**: 完整业务流程、用户交互
- **执行频率**: 版本发布前
#### 2.1.4 性能测试
- **测试工具**: Jest (单元性能), 自定义脚本
- **测试内容**: 响应时间、并发处理、资源使用
- **执行频率**: 版本发布前
### 2.2 测试环境
#### 2.2.1 开发环境
- **用途**: 开发人员自测
- **数据**: 模拟数据
- **配置**: 本地开发配置
#### 2.2.2 测试环境
- **用途**: QA团队测试
- **数据**: 测试数据集
- **配置**: 接近生产环境
#### 2.2.3 预生产环境
- **用途**: 用户验收测试
- **数据**: 生产数据副本
- **配置**: 生产环境配置
## 3. 测试工具和框架
### 3.1 后端测试工具
#### 3.1.1 Jest 配置
```json
{
"testEnvironment": "node",
"collectCoverageFrom": [
"controllers/**/*.js",
"models/**/*.js",
"routes/**/*.js",
"utils/**/*.js",
"!**/node_modules/**",
"!**/migrations/**",
"!**/seeds/**"
],
"coverageDirectory": "coverage",
"coverageReporters": ["text", "lcov", "html"]
}
```
#### 3.1.2 Supertest API测试
```javascript
const request = require('supertest');
const app = require('../app');
describe('API Tests', () => {
test('GET /api/farms', async () => {
const response = await request(app)
.get('/api/farms')
.expect(200);
expect(response.body).toHaveProperty('data');
expect(Array.isArray(response.body.data)).toBe(true);
});
});
```
### 3.2 前端测试工具
#### 3.2.1 Vitest 配置
```typescript
import { defineConfig } from 'vitest/config'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
test: {
environment: 'jsdom',
coverage: {
reporter: ['text', 'json', 'html']
}
}
})
```
#### 3.2.2 Vue Test Utils 组件测试
```typescript
import { mount } from '@vue/test-utils'
import StatusTag from '@/components/StatusTag.vue'
describe('StatusTag.vue', () => {
it('renders correctly', () => {
const wrapper = mount(StatusTag, {
props: {
status: 'success',
text: '正常'
}
})
expect(wrapper.text()).toContain('正常')
expect(wrapper.classes()).toContain('status-success')
})
})
```
### 3.3 小程序测试工具
#### 3.3.1 uni-app 测试配置
```typescript
// jest.config.ts
export default {
preset: 'ts-jest',
testEnvironment: 'jsdom',
moduleNameMapping: {
'^@/(.*)$': '<rootDir>/src/$1'
},
transform: {
'^.+\\.vue$': '@vue/vue3-jest'
}
}
```
## 4. 测试用例设计
### 4.1 功能测试用例
#### 4.1.1 用户认证测试
```javascript
describe('用户认证', () => {
test('正确的用户名密码应该登录成功', async () => {
const loginData = {
username: 'testuser',
password: 'testpass123'
};
const response = await request(app)
.post('/api/auth/login')
.send(loginData)
.expect(200);
expect(response.body).toHaveProperty('token');
expect(response.body.user.username).toBe('testuser');
});
test('错误的密码应该返回401', async () => {
const loginData = {
username: 'testuser',
password: 'wrongpass'
};
await request(app)
.post('/api/auth/login')
.send(loginData)
.expect(401);
});
});
```
#### 4.1.2 数据CRUD测试
```javascript
describe('养殖场管理', () => {
let farmId;
test('创建养殖场', async () => {
const farmData = {
name: '测试养殖场',
location: '宁夏银川',
type: 'cattle'
};
const response = await request(app)
.post('/api/farms')
.send(farmData)
.expect(201);
farmId = response.body.data.id;
expect(response.body.data.name).toBe('测试养殖场');
});
test('获取养殖场列表', async () => {
const response = await request(app)
.get('/api/farms')
.expect(200);
expect(Array.isArray(response.body.data)).toBe(true);
expect(response.body.data.length).toBeGreaterThan(0);
});
test('更新养殖场信息', async () => {
const updateData = {
name: '更新后的养殖场'
};
const response = await request(app)
.put(`/api/farms/${farmId}`)
.send(updateData)
.expect(200);
expect(response.body.data.name).toBe('更新后的养殖场');
});
test('删除养殖场', async () => {
await request(app)
.delete(`/api/farms/${farmId}`)
.expect(204);
});
});
```
### 4.2 性能测试用例
#### 4.2.1 响应时间测试
```javascript
describe('性能测试', () => {
test('API响应时间应小于500ms', async () => {
const startTime = Date.now();
await request(app)
.get('/api/farms')
.expect(200);
const responseTime = Date.now() - startTime;
expect(responseTime).toBeLessThan(500);
});
test('并发请求处理', async () => {
const promises = [];
for (let i = 0; i < 10; i++) {
promises.push(
request(app)
.get('/api/farms')
.expect(200)
);
}
const results = await Promise.all(promises);
expect(results.length).toBe(10);
});
});
```
### 4.3 安全测试用例
#### 4.3.1 输入验证测试
```javascript
describe('安全测试', () => {
test('SQL注入防护', async () => {
const maliciousInput = {
name: "'; DROP TABLE farms; --"
};
await request(app)
.post('/api/farms')
.send(maliciousInput)
.expect(400);
});
test('XSS防护', async () => {
const xssInput = {
name: '<script>alert("xss")</script>'
};
const response = await request(app)
.post('/api/farms')
.send(xssInput)
.expect(201);
expect(response.body.data.name).not.toContain('<script>');
});
});
```
## 5. 测试执行
### 5.1 测试命令
#### 5.1.1 后端测试
```bash
# 运行所有测试
npm test
# 运行单元测试
npm run test:unit
# 运行集成测试
npm run test:integration
# 生成覆盖率报告
npm run test:coverage
# 监听模式
npm run test:watch
```
#### 5.1.2 前端测试
```bash
# 运行所有测试
npm run test
# 运行单元测试
npm run test:unit
# 运行端到端测试
npm run test:e2e
# 生成覆盖率报告
npm run test:coverage
```
#### 5.1.3 小程序测试
```bash
# 运行测试
npm run test
# 监听模式
npm run test:watch
# 覆盖率报告
npm run test:coverage
```
### 5.2 持续集成
#### 5.2.1 GitHub Actions 配置
```yaml
name: Test Suite
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: testpass
MYSQL_DATABASE: test_db
ports:
- 3306:3306
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 tests
run: npm test
- name: Upload coverage
uses: codecov/codecov-action@v2
```
## 6. 测试数据管理
### 6.1 测试数据准备
#### 6.1.1 种子数据
```javascript
// seeds/test-data.js
module.exports = {
farms: [
{
id: 1,
name: '测试养殖场1',
location: '宁夏银川',
type: 'cattle',
status: 'active'
},
{
id: 2,
name: '测试养殖场2',
location: '宁夏石嘴山',
type: 'sheep',
status: 'active'
}
],
users: [
{
id: 1,
username: 'testuser',
email: 'test@example.com',
role: 'admin'
}
]
};
```
#### 6.1.2 数据清理
```javascript
// 测试前清理数据
beforeEach(async () => {
await Farm.destroy({ where: {} });
await User.destroy({ where: {} });
});
// 测试后清理数据
afterEach(async () => {
await Farm.destroy({ where: {} });
await User.destroy({ where: {} });
});
```
### 6.2 Mock数据
#### 6.2.1 API Mock
```javascript
// __mocks__/api.js
export const mockFarmData = {
id: 1,
name: '模拟养殖场',
location: '宁夏银川',
animals: 100
};
export const getFarms = jest.fn(() =>
Promise.resolve({ data: [mockFarmData] })
);
```
## 7. 测试报告
### 7.1 覆盖率报告
测试覆盖率目标:
- **整体覆盖率**: ≥80%
- **函数覆盖率**: ≥85%
- **分支覆盖率**: ≥75%
- **行覆盖率**: ≥80%
### 7.2 测试结果分析
#### 7.2.1 成功标准
- 所有测试用例通过
- 覆盖率达到目标要求
- 性能测试满足要求
- 安全测试无漏洞
#### 7.2.2 失败处理
- 记录失败原因
- 分析根本原因
- 修复问题
- 重新执行测试
## 8. 最佳实践
### 8.1 测试编写原则
1. **独立性**: 测试用例之间相互独立
2. **可重复性**: 测试结果可重复
3. **快速执行**: 单元测试执行时间短
4. **清晰命名**: 测试名称描述清楚
5. **边界测试**: 包含边界值测试
### 8.2 测试维护
1. **定期更新**: 随代码变更更新测试
2. **重构测试**: 消除重复代码
3. **性能优化**: 提高测试执行效率
4. **文档更新**: 保持测试文档最新
## 9. 故障排除
### 9.1 常见问题
#### 9.1.1 测试环境问题
- 数据库连接失败
- 依赖服务不可用
- 环境变量配置错误
#### 9.1.2 测试用例问题
- 异步测试超时
- Mock数据不正确
- 测试数据污染
### 9.2 解决方案
#### 9.2.1 环境检查
```bash
# 检查数据库连接
npm run test:db-connection
# 检查服务状态
npm run test:services
# 验证环境配置
npm run test:config
```
#### 9.2.2 调试技巧
```javascript
// 使用调试模式
describe.only('特定测试', () => {
// 只运行这个测试套件
});
// 跳过测试
test.skip('暂时跳过的测试', () => {
// 这个测试不会执行
});
```
## 10. 联系信息
### 10.1 测试团队
- **测试负责人**: 张三 (zhang.san@nxxmdata.com)
- **自动化测试**: 李四 (li.si@nxxmdata.com)
- **性能测试**: 王五 (wang.wu@nxxmdata.com)
### 10.2 支持渠道
- **邮箱**: test-support@nxxmdata.com
- **Slack**: #testing-support
- **工作时间**: 周一至周五 9:00-18:00
---
**最后更新**: 2025年1月20日
**文档版本**: v1.0
**维护团队**: 宁夏智慧养殖平台测试团队