forked from datawhale/whale-town-end
CRITICAL ISSUES: Database management service with major problems
WARNING: This commit contains code with significant issues that need immediate attention: 1. Type Safety Issues: - Unused import ZulipAccountsService causing compilation warnings - Implicit 'any' type in formatZulipAccount method parameter - Type inconsistencies in service injections 2. Service Integration Problems: - Inconsistent service interface usage - Missing proper type definitions for injected services - Potential runtime errors due to type mismatches 3. Code Quality Issues: - Violation of TypeScript strict mode requirements - Inconsistent error handling patterns - Missing proper interface implementations Files affected: - src/business/admin/database_management.service.ts (main issue) - Multiple test files and service implementations - Configuration and documentation updates Next steps required: 1. Fix TypeScript compilation errors 2. Implement proper type safety 3. Resolve service injection inconsistencies 4. Add comprehensive error handling 5. Update tests to match new implementations Impact: High - affects admin functionality and system stability Priority: Urgent - requires immediate review and fixes Author: moyin Date: 2026-01-10
This commit is contained in:
284
开发者代码检查规范.md
284
开发者代码检查规范.md
@@ -294,7 +294,11 @@ async validateUser(loginRequest: LoginRequest): Promise<AuthResult> {
|
||||
**修改记录更新要求:**
|
||||
- **必须添加**:每次修改文件后,必须在"最近修改"部分添加新的修改记录
|
||||
- **信息完整**:包含修改日期、修改类型、修改内容、修改者姓名
|
||||
- **时间更新**:只有真正修改了文件内容时才更新@lastModified字段,仅检查不修改内容时不更新日期
|
||||
- **时间更新规则**:
|
||||
- **仅检查不修改**:如果只是进行代码检查而没有实际修改文件内容,不更新@lastModified字段
|
||||
- **实际修改才更新**:只有真正修改了文件内容(功能代码、注释内容、结构调整等)时才更新@lastModified字段
|
||||
- **检查规范强调**:注释规范检查本身不是修改,除非发现需要修正的问题并进行了实际修改
|
||||
- **Git变更检测**:通过git status和git diff检查文件是否有实际变更,只有git显示文件被修改时才需要添加修改记录和更新时间戳
|
||||
- **版本递增**:根据修改类型适当递增版本号
|
||||
|
||||
**版本号递增规则:**
|
||||
@@ -690,6 +694,88 @@ export class DatabaseService {
|
||||
- ❌ **Config文件**:配置文件(`.config.ts`)不需要测试文件
|
||||
- ❌ **Constants文件**:常量定义(`.constants.ts`)不需要测试文件
|
||||
|
||||
**🔥 测试代码检查严格要求(新增):**
|
||||
|
||||
#### 1. 严格一对一映射原则
|
||||
- **强制要求**:每个测试文件必须严格对应一个源文件,属于严格一对一关系
|
||||
- **禁止多对一**:不允许一个测试文件测试多个源文件的功能
|
||||
- **禁止一对多**:不允许一个源文件的测试分散在多个测试文件中
|
||||
- **命名对应**:测试文件名必须与源文件名完全对应(除.spec.ts后缀外)
|
||||
|
||||
```typescript
|
||||
// ✅ 正确:严格一对一映射
|
||||
src/business/auth/login.service.ts
|
||||
src/business/auth/login.service.spec.ts
|
||||
|
||||
src/core/location_broadcast_core/location_broadcast_core.service.ts
|
||||
src/core/location_broadcast_core/location_broadcast_core.service.spec.ts
|
||||
|
||||
// ❌ 错误:一个测试文件测试多个源文件
|
||||
src/business/auth/auth_services.spec.ts # 测试多个service,违反一对一原则
|
||||
|
||||
// ❌ 错误:一个源文件的测试分散在多个文件
|
||||
src/business/auth/login.service.spec.ts
|
||||
src/business/auth/login_validation.spec.ts # 应该合并到login.service.spec.ts
|
||||
```
|
||||
|
||||
#### 2. 测试范围严格限制
|
||||
- **范围限制**:测试内容必须严格限于对应源文件的功能测试
|
||||
- **禁止跨文件**:不允许在单元测试中测试其他文件的功能
|
||||
- **依赖隔离**:使用Mock隔离外部依赖,专注测试当前文件
|
||||
|
||||
```typescript
|
||||
// ✅ 正确:只测试LoginService的功能
|
||||
// 文件:src/business/auth/login.service.spec.ts
|
||||
describe('LoginService', () => {
|
||||
describe('validateUser', () => {
|
||||
it('should validate user credentials', () => {
|
||||
// 只测试LoginService.validateUser方法
|
||||
// 使用Mock隔离UserRepository等外部依赖
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// ❌ 错误:在LoginService测试中测试其他服务
|
||||
describe('LoginService', () => {
|
||||
it('should integrate with UserRepository', () => {
|
||||
// 错误:这是集成测试,应该移到test/integration/
|
||||
});
|
||||
|
||||
it('should work with EmailService', () => {
|
||||
// 错误:测试了EmailService的功能,违反范围限制
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
#### 3. 集成测试强制分离
|
||||
- **强制分离**:所有集成测试必须从单元测试文件中移除
|
||||
- **统一位置**:集成测试统一放在顶层`test/integration/`目录
|
||||
- **最后执行**:集成测试在所有单元测试通过后统一执行
|
||||
|
||||
#### 4. 顶层test目录结构(强制要求)
|
||||
```
|
||||
test/
|
||||
├── integration/ # 集成测试 - 测试多个模块间的交互
|
||||
│ ├── auth_integration.spec.ts
|
||||
│ ├── location_broadcast_integration.spec.ts
|
||||
│ └── zulip_integration.spec.ts
|
||||
├── e2e/ # 端到端测试 - 完整业务流程测试
|
||||
│ ├── user_registration_e2e.spec.ts
|
||||
│ ├── location_broadcast_e2e.spec.ts
|
||||
│ └── admin_operations_e2e.spec.ts
|
||||
├── performance/ # 性能测试 - WebSocket和高并发测试
|
||||
│ ├── websocket_performance.spec.ts
|
||||
│ ├── database_performance.spec.ts
|
||||
│ └── memory_usage.spec.ts
|
||||
├── property/ # 属性测试 - 基于属性的随机测试
|
||||
│ ├── admin_property.spec.ts
|
||||
│ ├── user_validation_property.spec.ts
|
||||
│ └── position_update_property.spec.ts
|
||||
└── fixtures/ # 测试数据和工具
|
||||
├── test_data.ts
|
||||
└── test_helpers.ts
|
||||
```
|
||||
|
||||
**游戏服务器特殊测试要求:**
|
||||
```typescript
|
||||
// ✅ 必须有测试的文件类型
|
||||
@@ -932,15 +1018,50 @@ describe('AdminService Properties', () => {
|
||||
|
||||
**要求:复杂Service需要集成测试文件(.integration.spec.ts)**
|
||||
|
||||
**⚠️ 重要变更:集成测试必须移动到顶层test目录**
|
||||
|
||||
```typescript
|
||||
// ✅ 正确:游戏服务器集成测试
|
||||
// ❌ 错误:集成测试放在源文件目录(旧做法)
|
||||
src/core/location_broadcast_core/location_broadcast_core.service.ts
|
||||
src/core/location_broadcast_core/location_broadcast_core.service.spec.ts # 单元测试
|
||||
src/core/location_broadcast_core/location_broadcast_core.integration.spec.ts # 集成测试
|
||||
src/core/location_broadcast_core/location_broadcast_core.integration.spec.ts # 错误位置
|
||||
|
||||
src/business/zulip/zulip.service.ts
|
||||
src/business/zulip/zulip.service.spec.ts # 单元测试
|
||||
src/business/zulip/zulip_integration.e2e.spec.ts # E2E测试
|
||||
// ✅ 正确:集成测试统一放在顶层test目录(新要求)
|
||||
src/core/location_broadcast_core/location_broadcast_core.service.ts
|
||||
src/core/location_broadcast_core/location_broadcast_core.service.spec.ts # 单元测试
|
||||
test/integration/location_broadcast_core_integration.spec.ts # 正确位置
|
||||
|
||||
// ✅ 正确:其他类型测试的位置
|
||||
test/e2e/zulip_integration_e2e.spec.ts # E2E测试
|
||||
test/performance/websocket_performance.spec.ts # 性能测试
|
||||
test/property/admin_property.spec.ts # 属性测试
|
||||
```
|
||||
|
||||
**集成测试内容要求:**
|
||||
- **模块间交互**:测试多个模块之间的协作
|
||||
- **数据流验证**:验证数据在模块间的正确传递
|
||||
- **依赖关系**:测试真实的依赖关系而非Mock
|
||||
- **配置集成**:测试配置文件和环境变量的集成
|
||||
|
||||
**游戏服务器集成测试重点:**
|
||||
```typescript
|
||||
// test/integration/location_broadcast_integration.spec.ts
|
||||
describe('LocationBroadcast Integration', () => {
|
||||
it('should integrate gateway with core service and database', async () => {
|
||||
// 测试Gateway -> CoreService -> Database的完整链路
|
||||
});
|
||||
|
||||
it('should handle WebSocket connection with Redis session', async () => {
|
||||
// 测试WebSocket连接与Redis会话管理的集成
|
||||
});
|
||||
});
|
||||
|
||||
// test/integration/zulip_integration.spec.ts
|
||||
describe('Zulip Integration', () => {
|
||||
it('should sync messages between game chat and Zulip', async () => {
|
||||
// 测试游戏聊天与Zulip的消息同步集成
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### ⚡ 测试执行
|
||||
@@ -948,29 +1069,79 @@ src/business/zulip/zulip_integration.e2e.spec.ts # E2E测试
|
||||
**游戏服务器推荐的测试命令:**
|
||||
|
||||
```bash
|
||||
# 单元测试(排除集成测试和E2E测试)
|
||||
# 单元测试(严格限制:只执行.spec.ts文件,排除集成测试和E2E测试)
|
||||
npm run test:unit
|
||||
# 等价于: jest --testPathPattern=spec.ts --testPathIgnorePatterns="integration.spec.ts|e2e.spec.ts"
|
||||
# 等价于: jest --testPathPattern=spec.ts --testPathIgnorePatterns="integration|e2e|performance|property"
|
||||
|
||||
# 集成测试
|
||||
jest --testPathPattern=integration.spec.ts
|
||||
# 集成测试(统一在test/integration/目录执行)
|
||||
npm run test:integration
|
||||
# 等价于: jest test/integration/
|
||||
|
||||
# E2E测试(需要设置环境变量)
|
||||
# E2E测试(统一在test/e2e/目录执行,需要设置环境变量)
|
||||
npm run test:e2e
|
||||
# 等价于: cross-env RUN_E2E_TESTS=true jest --testPathPattern=e2e.spec.ts
|
||||
# 等价于: cross-env RUN_E2E_TESTS=true jest test/e2e/
|
||||
|
||||
# 属性测试(管理员模块)
|
||||
jest --testPathPattern=property.spec.ts
|
||||
# 属性测试(统一在test/property/目录执行)
|
||||
npm run test:property
|
||||
# 等价于: jest test/property/
|
||||
|
||||
# 性能测试(WebSocket相关)
|
||||
jest --testPathPattern=perf.spec.ts
|
||||
# 性能测试(统一在test/performance/目录执行)
|
||||
npm run test:performance
|
||||
# 等价于: jest test/performance/
|
||||
|
||||
# 全部测试
|
||||
# 分阶段执行(推荐顺序)
|
||||
npm run test:unit # 第一阶段:单元测试
|
||||
npm run test:integration # 第二阶段:集成测试
|
||||
npm run test:e2e # 第三阶段:E2E测试
|
||||
npm run test:performance # 第四阶段:性能测试
|
||||
|
||||
# 全部测试(按顺序执行所有测试)
|
||||
npm run test:all
|
||||
|
||||
# 带覆盖率的测试执行
|
||||
npm run test:cov
|
||||
```
|
||||
|
||||
**测试执行顺序说明:**
|
||||
1. **单元测试优先**:确保每个模块的基础功能正确
|
||||
2. **集成测试其次**:验证模块间的协作
|
||||
3. **E2E测试再次**:验证完整的业务流程
|
||||
4. **性能测试最后**:在功能正确的基础上验证性能
|
||||
|
||||
**Jest配置建议:**
|
||||
```javascript
|
||||
// jest.config.js
|
||||
module.exports = {
|
||||
// 单元测试配置
|
||||
testMatch: [
|
||||
'<rootDir>/src/**/*.spec.ts' // 只匹配源文件目录中的.spec.ts文件
|
||||
],
|
||||
testPathIgnorePatterns: [
|
||||
'<rootDir>/test/', // 忽略顶层test目录
|
||||
'integration', // 忽略集成测试
|
||||
'e2e', // 忽略E2E测试
|
||||
'performance', // 忽略性能测试
|
||||
'property' // 忽略属性测试
|
||||
],
|
||||
|
||||
// 集成测试配置(单独配置文件)
|
||||
projects: [
|
||||
{
|
||||
displayName: 'unit',
|
||||
testMatch: ['<rootDir>/src/**/*.spec.ts'],
|
||||
testPathIgnorePatterns: ['<rootDir>/test/']
|
||||
},
|
||||
{
|
||||
displayName: 'integration',
|
||||
testMatch: ['<rootDir>/test/integration/**/*.spec.ts']
|
||||
},
|
||||
{
|
||||
displayName: 'e2e',
|
||||
testMatch: ['<rootDir>/test/e2e/**/*.spec.ts']
|
||||
}
|
||||
]
|
||||
};
|
||||
```
|
||||
---
|
||||
|
||||
## 6️⃣ 功能文档生成
|
||||
@@ -1201,6 +1372,13 @@ npm run test:cov
|
||||
|
||||
#### 测试覆盖检查清单
|
||||
- [ ] 每个Service都有对应的.spec.ts测试文件
|
||||
- [ ] 测试文件与源文件严格一对一映射
|
||||
- [ ] 测试内容严格限于对应源文件的功能范围
|
||||
- [ ] 所有集成测试已移动到test/integration/目录
|
||||
- [ ] 所有E2E测试已移动到test/e2e/目录
|
||||
- [ ] 所有性能测试已移动到test/performance/目录
|
||||
- [ ] 所有属性测试已移动到test/property/目录
|
||||
- [ ] 单元测试文件中不包含集成测试或跨文件测试代码
|
||||
- [ ] 所有公共方法都有测试覆盖
|
||||
- [ ] 测试覆盖正常情况、异常情况、边界情况
|
||||
- [ ] 测试代码质量高,真实有效
|
||||
@@ -1219,16 +1397,23 @@ npm run test:cov
|
||||
|
||||
#### 测试相关命令
|
||||
```bash
|
||||
# 游戏服务器测试命令
|
||||
npm run test:unit # 单元测试
|
||||
# 游戏服务器测试命令(更新后的结构)
|
||||
npm run test:unit # 单元测试(只测试src/目录中的.spec.ts)
|
||||
npm run test:integration # 集成测试(test/integration/目录)
|
||||
npm run test:e2e # E2E测试(test/e2e/目录)
|
||||
npm run test:property # 属性测试(test/property/目录)
|
||||
npm run test:performance # 性能测试(test/performance/目录)
|
||||
npm run test:cov # 测试覆盖率
|
||||
npm run test:e2e # E2E测试
|
||||
npm run test:all # 全部测试
|
||||
npm run test:all # 全部测试(按顺序执行)
|
||||
|
||||
# Jest特定测试类型
|
||||
jest --testPathPattern=property.spec.ts # 属性测试
|
||||
jest --testPathPattern=integration.spec.ts # 集成测试
|
||||
jest --testPathPattern=perf.spec.ts # 性能测试
|
||||
# 分阶段测试执行(推荐)
|
||||
npm run test:unit && npm run test:integration && npm run test:e2e
|
||||
|
||||
# Jest特定目录测试
|
||||
jest src/ # 只测试源文件目录
|
||||
jest test/integration/ # 只测试集成测试
|
||||
jest test/e2e/ # 只测试E2E测试
|
||||
jest test/performance/ # 只测试性能测试
|
||||
|
||||
# WebSocket测试(需要启动服务)
|
||||
npm run dev & # 后台启动开发服务器
|
||||
@@ -1278,21 +1463,36 @@ npx prettier --write src/**/*.ts
|
||||
- 解决:将业务逻辑移到Business层
|
||||
|
||||
#### 测试覆盖常见错误
|
||||
1. **WebSocket测试文件缺失**
|
||||
1. **测试文件位置错误**
|
||||
- 错误:测试文件放在单独的tests/文件夹中
|
||||
- 正确:测试文件必须与源文件放在同一目录
|
||||
- 解决:将测试文件移动到对应源文件的同一目录
|
||||
|
||||
2. **测试范围混乱**
|
||||
- 错误:单元测试中包含集成测试代码
|
||||
- 正确:严格区分单元测试和集成测试
|
||||
- 解决:将集成测试移动到test/integration/目录
|
||||
|
||||
3. **一对多测试文件**
|
||||
- 错误:一个测试文件测试多个源文件
|
||||
- 正确:每个测试文件严格对应一个源文件
|
||||
- 解决:拆分测试文件,确保一对一映射
|
||||
|
||||
4. **WebSocket测试文件缺失**
|
||||
- 错误:Gateway没有对应的.spec.ts文件
|
||||
- 解决:为每个Gateway创建完整的连接、消息处理测试
|
||||
|
||||
2. **双模式测试不完整**
|
||||
5. **双模式测试不完整**
|
||||
- 错误:只测试数据库模式,忽略内存模式
|
||||
- 正确:确保两种模式行为一致性测试
|
||||
- 解决:创建对比测试用例
|
||||
|
||||
3. **属性测试缺失**
|
||||
6. **属性测试缺失**
|
||||
- 错误:管理员模块缺少随机化测试
|
||||
- 正确:使用fast-check进行属性测试
|
||||
- 解决:补充基于属性的测试用例
|
||||
- 解决:在test/property/目录补充基于属性的测试用例
|
||||
|
||||
4. **实时通信测试场景不完整**
|
||||
7. **实时通信测试场景不完整**
|
||||
- 错误:只测试正常连接,忽略异常断开
|
||||
- 正确:测试连接、断开、重连、消息处理全流程
|
||||
- 解决:补充WebSocket生命周期测试
|
||||
@@ -1402,21 +1602,39 @@ npx prettier --write src/**/*.ts
|
||||
|
||||
### 🧪 测试策略优化
|
||||
|
||||
1. **属性测试应用**
|
||||
1. **严格一对一测试映射**
|
||||
- 每个测试文件严格对应一个源文件
|
||||
- 测试内容严格限于对应源文件的功能
|
||||
- 禁止跨文件测试和混合测试
|
||||
|
||||
2. **分层测试架构**
|
||||
- 单元测试:放在源文件同目录,测试单个模块功能
|
||||
- 集成测试:统一放在test/integration/,测试模块间协作
|
||||
- E2E测试:统一放在test/e2e/,测试完整业务流程
|
||||
- 性能测试:统一放在test/performance/,测试系统性能
|
||||
- 属性测试:统一放在test/property/,进行随机化测试
|
||||
|
||||
3. **属性测试应用**
|
||||
- 管理员模块使用fast-check
|
||||
- 随机化用户状态变更测试
|
||||
- 边界条件自动发现
|
||||
|
||||
2. **集成测试重点**
|
||||
4. **集成测试重点**
|
||||
- WebSocket连接生命周期
|
||||
- 双模式服务一致性
|
||||
- 第三方服务集成
|
||||
|
||||
3. **E2E测试场景**
|
||||
5. **E2E测试场景**
|
||||
- 完整的用户游戏流程
|
||||
- 多用户实时交互
|
||||
- 异常恢复和降级
|
||||
|
||||
6. **测试执行顺序**
|
||||
- 第一阶段:单元测试(快速反馈)
|
||||
- 第二阶段:集成测试(模块协作)
|
||||
- 第三阶段:E2E测试(业务流程)
|
||||
- 第四阶段:性能测试(系统性能)
|
||||
|
||||
### 📊 监控和告警
|
||||
|
||||
1. **关键指标监控**
|
||||
|
||||
Reference in New Issue
Block a user