648851df92
- 添加E2E测试报告 - 添加UAT测试报告 - 添加测试计划文档 - 添加测试改进总结
370 lines
9.3 KiB
Markdown
370 lines
9.3 KiB
Markdown
# Novalon管理系统TDD改进方案实施计划
|
||
|
||
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
|
||
|
||
**Goal:** 通过测试驱动开发(TDD)方法全面提升Novalon管理系统的测试覆盖率、代码质量和系统可靠性
|
||
|
||
**Architecture:** 采用三阶段迭代改进方案,从基础设施修复到核心业务重构,再到前端优化,确保每个阶段都遵循"编写测试→实现功能→重构优化"的TDD流程
|
||
|
||
**Tech Stack:** Spring Boot 3.5.13, Vue 3, JUnit 5, Vitest, Playwright, pytest, PostgreSQL
|
||
|
||
---
|
||
|
||
## 项目现状分析
|
||
|
||
### 当前测试覆盖率
|
||
- **API集成测试**: 26%覆盖率,存在编译错误
|
||
- **后端单元测试**: 837个测试用例,18个测试失败
|
||
- **前端单元测试**: 32个测试文件配置错误
|
||
- **E2E测试**: Playwright配置问题导致无法运行
|
||
|
||
### 关键问题
|
||
1. Java测试代码构造器参数不匹配
|
||
2. Mock配置错误和依赖注入问题
|
||
3. 异步测试断言不准确
|
||
4. 前端测试环境配置错误
|
||
|
||
## 迭代计划概览
|
||
|
||
### 迭代周期1:基础设施修复与TDD流程建立(已完成)
|
||
- ✅ 修复Java测试代码构造器参数问题
|
||
- 🔄 建立TDD工作流规范
|
||
|
||
### 迭代周期2:核心业务逻辑TDD重构
|
||
- 修复用户管理模块测试失败
|
||
- 实现权限管理模块TDD开发
|
||
- 提升API测试覆盖率至80%
|
||
|
||
### 迭代周期3:前端组件TDD优化
|
||
- 修复前端测试配置问题
|
||
- 实现Vue组件TDD开发模式
|
||
- 完善E2E测试覆盖
|
||
|
||
## 详细实施任务
|
||
|
||
### 任务1:修复后端测试失败用例
|
||
|
||
**文件:**
|
||
- Modify: `novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/handler/auth/SysAuthHandlerTest.java`
|
||
- Modify: `novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/SysUserServiceTest.java`
|
||
- Modify: `novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/interceptor/OperationLogFilterTest.java`
|
||
|
||
**步骤1:分析SysAuthHandlerTest测试失败原因**
|
||
|
||
```java
|
||
// 检查第84行测试失败原因
|
||
@Test
|
||
void testLogin_Success() {
|
||
// 分析expectNextMatches失败的具体原因
|
||
}
|
||
```
|
||
|
||
**步骤2:修复Mock配置问题**
|
||
|
||
```java
|
||
// 确保所有Mock对象正确配置
|
||
@Mock
|
||
private PasswordEncoder passwordEncoder;
|
||
|
||
@BeforeEach
|
||
void setUp() {
|
||
when(passwordEncoder.matches(anyString(), anyString())).thenReturn(true);
|
||
}
|
||
```
|
||
|
||
**步骤3:修复异步测试断言**
|
||
|
||
```java
|
||
// 使用正确的响应式测试模式
|
||
StepVerifier.create(result)
|
||
.expectNextMatches(response -> {
|
||
// 精确的断言逻辑
|
||
return response.statusCode().is2xxSuccessful();
|
||
})
|
||
.verifyComplete();
|
||
```
|
||
|
||
**步骤4:运行修复后的测试**
|
||
|
||
```bash
|
||
cd /Users/zhangxiang/Codes/Novalon/novalon-manage-system/novalon-manage-api/manage-sys
|
||
mvn test -Dtest=SysAuthHandlerTest
|
||
```
|
||
|
||
**预期结果:** 所有SysAuthHandlerTest测试通过
|
||
|
||
### 任务2:修复前端测试配置
|
||
|
||
**文件:**
|
||
- Modify: `novalon-manage-web/playwright.config.ts`
|
||
- Modify: `novalon-manage-web/e2e/*.spec.ts`
|
||
- Create: `novalon-manage-web/vitest.config.ts`
|
||
|
||
**步骤1:修复Playwright配置**
|
||
|
||
```typescript
|
||
// playwright.config.ts
|
||
import { defineConfig, devices } from '@playwright/test';
|
||
|
||
export default defineConfig({
|
||
testDir: './e2e',
|
||
fullyParallel: true,
|
||
forbidOnly: !!process.env.CI,
|
||
retries: process.env.CI ? 2 : 0,
|
||
workers: process.env.CI ? 1 : undefined,
|
||
reporter: 'html',
|
||
use: {
|
||
baseURL: 'http://localhost:5173',
|
||
trace: 'on-first-retry',
|
||
},
|
||
projects: [
|
||
{
|
||
name: 'chromium',
|
||
use: { ...devices['Desktop Chrome'] },
|
||
},
|
||
],
|
||
webServer: {
|
||
command: 'npm run dev',
|
||
url: 'http://localhost:5173',
|
||
reuseExistingServer: !process.env.CI,
|
||
},
|
||
});
|
||
```
|
||
|
||
**步骤2:修复E2E测试文件**
|
||
|
||
```typescript
|
||
// e2e/basic.spec.ts
|
||
import { test, expect } from '@playwright/test';
|
||
|
||
test('basic test', async ({ page }) => {
|
||
await page.goto('/');
|
||
await expect(page).toHaveTitle(/Novalon/);
|
||
});
|
||
```
|
||
|
||
**步骤3:配置Vitest测试环境**
|
||
|
||
```typescript
|
||
// vitest.config.ts
|
||
import { defineConfig } from 'vitest/config';
|
||
import vue from '@vitejs/plugin-vue';
|
||
|
||
export default defineConfig({
|
||
plugins: [vue()],
|
||
test: {
|
||
environment: 'jsdom',
|
||
globals: true,
|
||
},
|
||
});
|
||
```
|
||
|
||
**步骤4:运行前端测试**
|
||
|
||
```bash
|
||
cd /Users/zhangxiang/Codes/Novalon/novalon-manage-system/novalon-manage-web
|
||
npm run test:unit
|
||
npm run test:e2e
|
||
```
|
||
|
||
**预期结果:** 前端测试能够正常运行
|
||
|
||
### 任务3:实现用户管理模块TDD开发
|
||
|
||
**文件:**
|
||
- Create: `novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/UserServiceTDDTest.java`
|
||
- Modify: `novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysUserServiceImpl.java`
|
||
|
||
**步骤1:编写用户创建功能失败测试**
|
||
|
||
```java
|
||
@Test
|
||
void testCreateUser_WithInvalidEmail_ShouldFail() {
|
||
CreateUserCommand command = new CreateUserCommand(
|
||
"testuser",
|
||
"password123",
|
||
"invalid-email",
|
||
"Test User"
|
||
);
|
||
|
||
assertThrows(ValidationException.class, () -> {
|
||
userService.createUser(command);
|
||
});
|
||
}
|
||
```
|
||
|
||
**步骤2:运行测试确认失败**
|
||
|
||
```bash
|
||
mvn test -Dtest=UserServiceTDDTest::testCreateUser_WithInvalidEmail_ShouldFail
|
||
```
|
||
|
||
**步骤3:实现最小验证逻辑**
|
||
|
||
```java
|
||
public Mono<SysUser> createUser(CreateUserCommand command) {
|
||
// 添加邮箱格式验证
|
||
if (!isValidEmail(command.getEmail())) {
|
||
return Mono.error(new ValidationException("Invalid email format"));
|
||
}
|
||
|
||
// 原有业务逻辑
|
||
return userRepository.save(user);
|
||
}
|
||
|
||
private boolean isValidEmail(String email) {
|
||
return email.matches("^[A-Za-z0-9+_.-]+@(.+)$");
|
||
}
|
||
```
|
||
|
||
**步骤4:运行测试确认通过**
|
||
|
||
```bash
|
||
mvn test -Dtest=UserServiceTDDTest::testCreateUser_WithInvalidEmail_ShouldFail
|
||
```
|
||
|
||
**步骤5:提交代码**
|
||
|
||
```bash
|
||
git add novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/UserServiceTDDTest.java
|
||
git add novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysUserServiceImpl.java
|
||
git commit -m "feat: add email validation with TDD approach"
|
||
```
|
||
|
||
### 任务4:建立测试覆盖率监控
|
||
|
||
**文件:**
|
||
- Create: `novalon-manage-system/.woodpecker/quality-gates.yml`
|
||
- Modify: `novalon-manage-api/pom.xml`
|
||
- Modify: `novalon-manage-web/package.json`
|
||
|
||
**步骤1:配置JaCoCo测试覆盖率**
|
||
|
||
```xml
|
||
<!-- pom.xml -->
|
||
<plugin>
|
||
<groupId>org.jacoco</groupId>
|
||
<artifactId>jacoco-maven-plugin</artifactId>
|
||
<version>0.8.11</version>
|
||
<executions>
|
||
<execution>
|
||
<goals>
|
||
<goal>prepare-agent</goal>
|
||
</goals>
|
||
</execution>
|
||
<execution>
|
||
<id>report</id>
|
||
<phase>test</phase>
|
||
<goals>
|
||
<goal>report</goal>
|
||
</goals>
|
||
</execution>
|
||
</executions>
|
||
</plugin>
|
||
```
|
||
|
||
**步骤2:配置质量门禁规则**
|
||
|
||
```yaml
|
||
# .woodpecker/quality-gates.yml
|
||
steps:
|
||
- name: test-coverage-check
|
||
image: maven:3.9-openjdk-21
|
||
commands:
|
||
- mvn clean test jacoco:report
|
||
- |
|
||
COVERAGE=$(cat target/site/jacoco/index.html | grep -oP 'Total.*?\K[0-9]+%' | head -1 | sed 's/%//')
|
||
if [ $COVERAGE -lt 80 ]; then
|
||
echo "Test coverage $COVERAGE% is below required 80%"
|
||
exit 1
|
||
fi
|
||
```
|
||
|
||
**步骤3:配置前端测试覆盖率**
|
||
|
||
```json
|
||
// package.json
|
||
{
|
||
"scripts": {
|
||
"test:coverage": "vitest run --coverage",
|
||
"test:e2e:coverage": "playwright test --reporter=html"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 任务5:建立TDD工作流规范
|
||
|
||
**文件:**
|
||
- Create: `novalon-manage-system/docs/tdd-workflow.md`
|
||
- Create: `novalon-manage-system/.github/workflows/tdd-pipeline.yml`
|
||
|
||
**步骤1:创建TDD工作流文档**
|
||
|
||
```markdown
|
||
# TDD工作流规范
|
||
|
||
## 开发流程
|
||
1. 编写失败测试用例(Red)
|
||
2. 实现最小功能使测试通过(Green)
|
||
3. 重构优化代码质量(Refactor)
|
||
4. 提交代码并运行完整测试套件
|
||
|
||
## 质量门禁
|
||
- 单元测试覆盖率 ≥ 80%
|
||
- 集成测试覆盖率 ≥ 70%
|
||
- 零编译错误,测试通过率100%
|
||
```
|
||
|
||
**步骤2:配置GitHub Actions TDD流水线**
|
||
|
||
```yaml
|
||
name: TDD Pipeline
|
||
on: [push, pull_request]
|
||
|
||
jobs:
|
||
tdd-validation:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v3
|
||
- name: Setup Java
|
||
uses: actions/setup-java@v3
|
||
with:
|
||
java-version: '21'
|
||
distribution: 'temurin'
|
||
- name: Run TDD Tests
|
||
run: |
|
||
mvn clean test
|
||
npm run test:coverage
|
||
npm run test:e2e
|
||
```
|
||
|
||
## 验收标准
|
||
|
||
### 质量指标
|
||
- ✅ 后端单元测试覆盖率 ≥ 80%
|
||
- ✅ 前端单元测试覆盖率 ≥ 70%
|
||
- ✅ E2E测试关键路径覆盖率100%
|
||
- ✅ 零编译错误,测试通过率100%
|
||
|
||
### 流程指标
|
||
- ✅ TDD工作流规范文档完善
|
||
- ✅ 质量门禁机制正常运行
|
||
- ✅ 持续集成流水线稳定运行
|
||
|
||
## 风险与缓解措施
|
||
|
||
### 技术风险
|
||
1. **异步测试复杂性** - 采用StepVerifier等专业工具
|
||
2. **前端测试环境配置** - 使用容器化测试环境
|
||
3. **测试数据管理** - 建立测试数据工厂模式
|
||
|
||
### 流程风险
|
||
1. **团队TDD接受度** - 提供培训和最佳实践示例
|
||
2. **测试维护成本** - 建立测试代码审查机制
|
||
3. **性能影响** - 优化测试执行策略
|
||
|
||
---
|
||
|
||
**计划制定完成时间:** 2026-03-30
|
||
**预计实施周期:** 2-3周
|
||
**负责人:** 张翔(全栈质量保障与效能工程师) |