11 KiB
11 KiB
宁夏智慧养殖监管平台 测试文档
版本历史
| 版本 | 日期 | 作者 | 描述 |
|---|---|---|---|
| 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 配置
{
"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测试
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 配置
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 组件测试
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 测试配置
// 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 用户认证测试
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测试
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 响应时间测试
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 输入验证测试
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 后端测试
# 运行所有测试
npm test
# 运行单元测试
npm run test:unit
# 运行集成测试
npm run test:integration
# 生成覆盖率报告
npm run test:coverage
# 监听模式
npm run test:watch
5.1.2 前端测试
# 运行所有测试
npm run test
# 运行单元测试
npm run test:unit
# 运行端到端测试
npm run test:e2e
# 生成覆盖率报告
npm run test:coverage
5.1.3 小程序测试
# 运行测试
npm run test
# 监听模式
npm run test:watch
# 覆盖率报告
npm run test:coverage
5.2 持续集成
5.2.1 GitHub Actions 配置
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 种子数据
// 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 数据清理
// 测试前清理数据
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
// __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 测试编写原则
- 独立性: 测试用例之间相互独立
- 可重复性: 测试结果可重复
- 快速执行: 单元测试执行时间短
- 清晰命名: 测试名称描述清楚
- 边界测试: 包含边界值测试
8.2 测试维护
- 定期更新: 随代码变更更新测试
- 重构测试: 消除重复代码
- 性能优化: 提高测试执行效率
- 文档更新: 保持测试文档最新
9. 故障排除
9.1 常见问题
9.1.1 测试环境问题
- 数据库连接失败
- 依赖服务不可用
- 环境变量配置错误
9.1.2 测试用例问题
- 异步测试超时
- Mock数据不正确
- 测试数据污染
9.2 解决方案
9.2.1 环境检查
# 检查数据库连接
npm run test:db-connection
# 检查服务状态
npm run test:services
# 验证环境配置
npm run test:config
9.2.2 调试技巧
// 使用调试模式
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
维护团队: 宁夏智慧养殖平台测试团队