Files
novalon-website/e2e/docs/allure-report-guide.md
T
张翔 eeccc59630 feat: 建立Allure测试报告系统
- 安装allure-playwright和allure-commandline依赖
- 添加Allure相关的npm脚本(test:allure、test:allure:open、test:allure:serve)
- 在playwright.config.ts中集成Allure reporter
- 创建Allure测试报告系统使用指南
- 支持测试描述、步骤、标签、严重级别、套件、链接、附件、参数等功能
- 支持CI/CD集成(Woodpecker、GitHub Actions、GitLab CI)
2026-02-28 16:46:55 +08:00

675 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Allure测试报告系统使用指南
## 概述
Allure是一个灵活的、轻量级的多语言测试报告工具,能够生成美观、详细的测试报告。本文档介绍如何在E2E测试项目中集成和使用Allure报告系统。
---
## 一、安装和配置
### 1.1 安装依赖
```bash
cd e2e
npm install --save-dev @playwright/test allure-playwright allure-commandline
```
### 1.2 配置Playwright
`playwright.config.ts`中添加Allure reporter
```typescript
export default defineConfig({
reporter: [
['html', { open: 'never' }],
['json', { outputFile: 'test-results/results.json' }],
['junit', { outputFile: 'test-results/junit.xml' }],
['line'],
['list'],
['allure-playwright', {
outputFolder: 'allure-results',
detail: true,
suiteTitle: false,
}],
],
});
```
### 1.3 添加npm脚本
`package.json`中添加Allure相关脚本:
```json
{
"scripts": {
"test": "playwright test",
"test:allure": "allure generate allure-results --clean -o allure-report",
"test:allure:open": "allure open allure-report",
"test:allure:serve": "allure serve allure-results"
}
}
```
---
## 二、基本使用
### 2.1 运行测试并生成报告
```bash
# 1. 运行测试
npm run test
# 2. 生成Allure报告
npm run test:allure
# 3. 打开报告
npm run test:allure:open
```
### 2.2 实时查看报告
```bash
# 在测试运行时实时查看报告
npm run test:allure:serve
```
### 2.3 清理历史报告
```bash
# 清理旧的报告数据
rm -rf allure-results allure-report
```
---
## 三、Allure注解
### 3.1 测试描述
使用`@allure.description`添加测试描述:
```typescript
import { test } from '@playwright/test';
import { allure } from 'allure-playwright';
test('测试用例描述', async ({ page }) => {
allure.description('这是一个测试用例的详细描述');
// 测试逻辑
});
```
### 3.2 测试步骤
使用`allure.step`添加测试步骤:
```typescript
import { test } from '@playwright/test';
import { allure } from 'allure-playwright';
test('测试步骤示例', async ({ page }) => {
await allure.step('步骤1: 打开首页', async () => {
await page.goto('/');
});
await allure.step('步骤2: 点击导航链接', async () => {
await page.click('nav a');
});
await allure.step('步骤3: 验证页面加载', async () => {
await expect(page).toHaveURL('/about');
});
});
```
### 3.3 测试标签
使用`@allure.tag`添加测试标签:
```typescript
import { test } from '@playwright/test';
import { allure } from 'allure-playwright';
test('测试标签示例', async ({ page }) => {
allure.tags('smoke', 'regression', 'high-priority');
// 测试逻辑
});
```
### 3.4 测试严重级别
使用`@allure.severity`添加测试严重级别:
```typescript
import { test } from '@playwright/test';
import { allure } from 'allure-playwright';
test('测试严重级别示例', async ({ page }) => {
allure.severity('critical');
// 测试逻辑
});
```
支持的严重级别:
- `blocker`: 阻塞级别
- `critical`: 严重级别
- `normal`: 普通级别
- `minor`: 次要级别
- `trivial`: 微不足道级别
### 3.5 测试套件
使用`@allure.suite`添加测试套件:
```typescript
import { test } from '@playwright/test';
import { allure } from 'allure-playwright';
test.describe('测试套件示例', () => {
test.beforeEach(async () => {
allure.suite('首页测试');
});
test('测试用例1', async ({ page }) => {
// 测试逻辑
});
test('测试用例2', async ({ page }) => {
// 测试逻辑
});
});
```
### 3.6 测试链接
使用`@allure.link`添加测试链接:
```typescript
import { test } from '@playwright/test';
import { allure } from 'allure-playwright';
test('测试链接示例', async ({ page }) => {
allure.link('https://example.com/ticket/123', 'JIRA链接');
allure.issue('123', 'JIRA问题');
allure.tms('456', '测试用例管理');
// 测试逻辑
});
```
### 3.7 附件
使用`allure.attachment`添加附件:
```typescript
import { test } from '@playwright/test';
import { allure } from 'allure-playwright';
test('附件示例', async ({ page }) => {
await page.goto('/');
// 添加截图附件
const screenshot = await page.screenshot();
allure.attachment('首页截图', screenshot, 'image/png');
// 添加文本附件
allure.attachment('页面URL', page.url(), 'text/plain');
// 添加JSON附件
const data = { key: 'value' };
allure.attachment('测试数据', JSON.stringify(data), 'application/json');
});
```
### 3.8 测试参数
使用`@allure.parameter`添加测试参数:
```typescript
import { test } from '@playwright/test';
import { allure } from 'allure-playwright';
test('测试参数示例', async ({ page }) => {
const browser = 'chromium';
const viewport = { width: 1280, height: 720 };
allure.parameter('浏览器', browser);
allure.parameter('视口大小', `${viewport.width}x${viewport.height}`);
// 测试逻辑
});
```
---
## 四、高级功能
### 4.1 环境信息
创建`allure-results/environment.properties`文件:
```properties
# Environment Properties
Browser=Chromium
Browser.Version=120.0.0
OS=macOS
OS.Version=14.0
Environment=staging
BaseURL=https://staging.novalon.com
```
### 4.2 测试分类
创建`allure-results/categories.json`文件:
```json
[
{
"name": "Ignored tests",
"matchedStatuses": ["skipped"]
},
{
"name": "Infrastructure problems",
"matchedStatuses": ["broken", "failed"],
"messageRegex": ".*Connection refused.*"
},
{
"name": "Outdated tests",
"matchedStatuses": ["broken"],
"traceRegex": ".*FileNotFoundException.*"
},
{
"name": "Product defects",
"matchedStatuses": ["failed"]
},
{
"name": "Test defects",
"matchedStatuses": ["broken"]
}
]
```
### 4.3 自定义测试执行器
创建`allure-results/executor.json`文件:
```json
{
"name": "Woodpecker CI",
"type": "woodpecker",
"url": "https://ci.example.com",
"buildOrder": "123",
"buildName": "E2E Tests #123",
"buildUrl": "https://ci.example.com/build/123",
"reportUrl": "https://ci.example.com/build/123/allure",
"reportName": "Allure Report"
}
```
---
## 五、CI/CD集成
### 5.1 Woodpecker CI集成
```yaml
# .woodpecker.yml
steps:
- name: Run Tests
image: mcr.microsoft.com/playwright:v1.48.0
commands:
- cd e2e
- npm ci
- npm run test
environment:
ALLURE_RESULTS_PATH: allure-results
- name: Generate Allure Report
image: frankescobar/allure-docker-service
commands:
- cd e2e
- allure generate allure-results --clean -o allure-report
when:
status: [success, failure]
- name: Upload Allure Report
image: plugins/s3
settings:
bucket: test-reports
source: e2e/allure-report/**
target: /allure/${CI_COMMIT_SHA}
when:
status: [success, failure]
```
### 5.2 GitHub Actions集成
```yaml
# .github/workflows/e2e-tests.yml
name: E2E Tests
on:
push:
branches: [main, develop]
pull_request:
branches: [main, develop]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '20'
- name: Install dependencies
run: |
cd e2e
npm ci
- name: Run tests
run: |
cd e2e
npm run test
- name: Generate Allure Report
run: |
cd e2e
npm run test:allure
- name: Upload Allure Report
uses: actions/upload-artifact@v3
with:
name: allure-report
path: e2e/allure-report
```
### 5.3 GitLab CI集成
```yaml
# .gitlab-ci.yml
stages:
- test
- report
test:
stage: test
image: mcr.microsoft.com/playwright:v1.48.0
script:
- cd e2e
- npm ci
- npm run test
artifacts:
when: always
paths:
- e2e/allure-results/
expire_in: 1 week
report:
stage: report
image: frankescobar/allure-docker-service
script:
- cd e2e
- allure generate allure-results --clean -o allure-report
- allure open allure-report
artifacts:
when: always
paths:
- e2e/allure-report/
expire_in: 1 week
dependencies:
- test
```
---
## 六、报告分析
### 6.1 测试概览
Allure报告提供以下概览信息:
- 测试总数
- 通过/失败/跳过的测试数量
- 测试执行时间
- 测试通过率
- 测试趋势
### 6.2 测试套件
按测试套件查看测试结果:
- 每个套件的测试数量
- 每个套件的通过率
- 每个套件的执行时间
### 6.3 测试用例
查看每个测试用例的详细信息:
- 测试描述
- 测试步骤
- 测试参数
- 测试附件
- 测试日志
- 测试截图
### 6.4 测试趋势
查看测试趋势图表:
- 测试通过率趋势
- 测试执行时间趋势
- 测试数量趋势
### 6.5 测试分类
按分类查看测试结果:
- Ignored tests(被忽略的测试)
- Infrastructure problems(基础设施问题)
- Outdated tests(过时的测试)
- Product defects(产品缺陷)
- Test defects(测试缺陷)
---
## 七、最佳实践
### 7.1 使用描述性测试名称
```typescript
// ✅ 好的做法
test('应该能够成功提交联系表单', async ({ page }) => {
// 测试逻辑
});
// ❌ 不好的做法
test('测试1', async ({ page }) => {
// 测试逻辑
});
```
### 7.2 添加详细的测试步骤
```typescript
// ✅ 好的做法
test('完整的测试步骤', async ({ page }) => {
await allure.step('步骤1: 打开首页', async () => {
await page.goto('/');
await page.waitForLoadState('networkidle');
});
await allure.step('步骤2: 填写联系表单', async () => {
await page.fill('input[name="name"]', '张三');
await page.fill('input[name="email"]', 'zhangsan@example.com');
await page.fill('input[name="phone"]', '13800138000');
await page.fill('textarea[name="message"]', '测试消息');
});
await allure.step('步骤3: 提交表单', async () => {
await page.click('button[type="submit"]');
await page.waitForSelector('.success');
});
});
// ❌ 不好的做法
test('没有测试步骤', async ({ page }) => {
await page.goto('/');
await page.fill('input[name="name"]', '张三');
await page.fill('input[name="email"]', 'zhangsan@example.com');
await page.fill('input[name="phone"]', '13800138000');
await page.fill('textarea[name="message"]', '测试消息');
await page.click('button[type="submit"]');
await page.waitForSelector('.success');
});
```
### 7.3 使用测试标签
```typescript
// ✅ 好的做法
test('带标签的测试', async ({ page }) => {
allure.tags('smoke', 'regression', 'high-priority');
allure.severity('critical');
// 测试逻辑
});
// ❌ 不好的做法
test('没有标签的测试', async ({ page }) => {
// 测试逻辑
});
```
### 7.4 添加测试附件
```typescript
// ✅ 好的做法
test('带附件的测试', async ({ page }) => {
await page.goto('/');
const screenshot = await page.screenshot();
allure.attachment('首页截图', screenshot, 'image/png');
const pageContent = await page.content();
allure.attachment('页面HTML', pageContent, 'text/html');
// 测试逻辑
});
// ❌ 不好的做法
test('没有附件的测试', async ({ page }) => {
await page.goto('/');
// 测试逻辑
});
```
### 7.5 使用测试参数
```typescript
// ✅ 好的做法
test('带参数的测试', async ({ page }) => {
const testData = {
name: '张三',
email: 'zhangsan@example.com',
phone: '13800138000',
};
allure.parameter('测试数据', JSON.stringify(testData));
allure.parameter('浏览器', 'chromium');
// 测试逻辑
});
// ❌ 不好的做法
test('没有参数的测试', async ({ page }) => {
// 测试逻辑
});
```
---
## 八、故障排查
### 8.1 报告生成失败
**问题**: 运行`npm run test:allure`时报告生成失败。
**原因**: `allure-results`目录不存在或为空。
**解决方案**:
```bash
# 确保先运行测试
npm run test
# 检查allure-results目录
ls -la allure-results
# 如果目录为空,重新运行测试
rm -rf allure-results
npm run test
```
### 8.2 报告打开失败
**问题**: 运行`npm run test:allure:open`时报告无法打开。
**原因**: `allure-report`目录不存在或Allure未正确安装。
**解决方案**:
```bash
# 重新生成报告
npm run test:allure
# 检查allure-report目录
ls -la allure-report
# 重新安装Allure
npm install --save-dev allure-commandline
```
### 8.3 测试步骤不显示
**问题**: Allure报告中没有显示测试步骤。
**原因**: 没有使用`allure.step`添加测试步骤。
**解决方案**:
```typescript
// 添加测试步骤
await allure.step('步骤描述', async () => {
// 测试逻辑
});
```
### 8.4 附件不显示
**问题**: Allure报告中没有显示附件。
**原因**: 没有使用`allure.attachment`添加附件或附件路径不正确。
**解决方案**:
```typescript
// 添加附件
const screenshot = await page.screenshot();
allure.attachment('截图', screenshot, 'image/png');
```
---
## 九、总结
Allure测试报告系统提供了强大的测试报告功能,包括:
1. **美观的报告界面**: 直观的UI设计,易于理解
2. **详细的测试信息**: 测试描述、步骤、参数、附件等
3. **测试趋势分析**: 通过率、执行时间、测试数量趋势
4. **测试分类**: 按缺陷类型分类,便于问题定位
5. **CI/CD集成**: 支持多种CI/CD工具集成
通过使用Allure报告系统,可以更好地了解测试执行情况,快速定位问题,提高测试效率。
---
**文档版本**: v1.0
**最后更新**: 2026-02-28
**维护者**: 张翔