Appearance
集成测试
本文档引用的文件
- encrypt.test.ts
- Test.test.ts
- gql.ts
- request_id.ts
- context.ts
- auth.dao.ts
- org.dao.ts
- domain.dao.ts
- dept.dao.ts
- graphql.config.js
- request.ts
- request.ts
- graphql.ts
- usr.ts
- axios.ts
目录
- 集成测试
- 项目结构分析
- GraphQL API 测试基础
- 测试数据库与数据管理
- 用户管理模块测试示例
- 服务层与DAO层集成测试
- HTTP请求测试与request.ts使用
- 认证授权测试
- 事务与并发测试
- 错误处理与响应验证
项目结构分析
本项目采用多模块架构,主要包含以下核心目录:
- codegen:代码生成工具模块,用于自动生成数据库表结构、GraphQL Schema等。
- deno:后端服务核心,基于Deno运行时,包含GraphQL API、数据库访问层(DAO)、服务层(Service)等。
- pc:PC端前端应用,基于Vue框架,包含GraphQL客户端、路由、状态管理等。
- uni:跨平台移动端应用,基于uni-app框架,支持多端部署。
后端采用分层架构设计,每个业务模块(如usr
、org
、dept
)均包含.dao.ts
(数据访问对象)、.service.ts
(业务逻辑)、.resolver.ts
(GraphQL解析器)等文件,实现了清晰的关注点分离。
Section sources
GraphQL API 测试基础
GraphQL API的测试主要通过向/graphql
端点发送POST请求来完成。后端通过oak/gql.ts
中的路由处理器处理请求。
Diagram sources
Section sources
测试数据库与数据管理
测试数据库的设置依赖于context.ts
中定义的MySQL连接池管理。测试数据的创建和清理通过DAO层的_creates
和_deletes
等方法实现。
typescript
// 示例:创建组织数据
async function createTestOrg(inputs: OrgInput[]): Promise<OrgId[]> {
return await _creates(inputs, { is_silent_mode: true });
}
测试环境清理通常在测试用例的afterEach
或afterAll
钩子中执行,调用相应的删除方法清除测试数据。
Diagram sources
Section sources
用户管理模块测试示例
以用户管理模块为例,测试GraphQL查询和变更操作的完整流程如下:
- 设置测试环境:连接测试数据库,清空用户表。
- 创建测试数据:使用
usr.dao.ts
中的_creates
方法插入测试用户。 - 执行查询测试:发送GraphQL查询,验证返回的用户信息是否正确。
- 执行变更测试:发送GraphQL变更(mutation),如更新用户信息,验证变更结果。
- 清理环境:删除创建的测试用户。
Diagram sources
服务层与DAO层集成测试
服务层与DAO层的集成测试主要验证业务逻辑是否正确调用DAO方法,并处理返回结果。
typescript
// 示例:测试用户服务的创建方法
describe('UserService', () => {
it('should create a new user', async () => {
const input = { lbl: 'Test User', email: 'test@example.com' };
const userId = await userService.create(input);
// 验证DAO是否被正确调用
const user = await userDao.findById(userId);
expect(user.lbl).toBe(input.lbl);
});
});
此类测试通常在encrypt.test.ts
或Test.test.ts
等测试文件中编写,使用Deno的测试框架。
Section sources
HTTP请求测试与request.ts使用
前端通过request.ts
文件封装HTTP请求,支持GraphQL和RESTful API调用。
typescript
// pc端 request.ts 示例
export async function request(config: any): Promise<any> {
const url = getRequestUrl(config);
const response = await fetch(url, {
method: config.method || 'GET',
headers: config.header,
body: config.data ? JSON.stringify(config.data) : undefined,
});
return response.json();
}
测试时,可以模拟request
函数的行为,验证其是否生成正确的URL和请求头。
Diagram sources
Section sources
认证授权测试
认证授权测试主要验证auth.dao.ts
中的verifyToken
和refreshToken
方法。
测试时需验证:
- 有效Token能成功认证
- 过期Token能触发刷新
- 无效Token返回401错误
Diagram sources
Section sources
事务与并发测试
事务处理在DAO层通过数据库事务实现。并发测试需关注:
- 事务隔离性:确保并发操作不会破坏数据一致性。
- 锁机制:防止同一资源被同时修改。
- x-request-id:通过
request_id.ts
实现请求去重,防止重复提交。
typescript
// 示例:使用x-request-id防止重复请求
export async function handleRequestId(response: Response, requestId?: string) {
if (requestIdMap.has(requestId)) {
throw new ServiceException('x-request-id is duplicated');
}
requestIdMap.set(requestId, setTimeout(() => {
requestIdMap.delete(requestId);
}, 60000));
}
Section sources
错误处理与响应验证
API响应格式需符合GraphQL规范,包含data
和errors
字段。
json
{
"data": { "user": { "lbl": "John" } },
"errors": []
}
测试时需验证:
- 成功响应:
errors
为空,data
包含预期数据。 - 错误响应:
data
可能为空,errors
包含详细的错误信息。 - 状态码:通常为200,即使GraphQL内部出错。
前端request.ts
中的错误处理逻辑会捕获异常并显示错误消息。
Section sources