- 安装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)
14 KiB
Allure测试报告系统使用指南
概述
Allure是一个灵活的、轻量级的多语言测试报告工具,能够生成美观、详细的测试报告。本文档介绍如何在E2E测试项目中集成和使用Allure报告系统。
一、安装和配置
1.1 安装依赖
cd e2e
npm install --save-dev @playwright/test allure-playwright allure-commandline
1.2 配置Playwright
在playwright.config.ts中添加Allure reporter:
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相关脚本:
{
"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 运行测试并生成报告
# 1. 运行测试
npm run test
# 2. 生成Allure报告
npm run test:allure
# 3. 打开报告
npm run test:allure:open
2.2 实时查看报告
# 在测试运行时实时查看报告
npm run test:allure:serve
2.3 清理历史报告
# 清理旧的报告数据
rm -rf allure-results allure-report
三、Allure注解
3.1 测试描述
使用@allure.description添加测试描述:
import { test } from '@playwright/test';
import { allure } from 'allure-playwright';
test('测试用例描述', async ({ page }) => {
allure.description('这是一个测试用例的详细描述');
// 测试逻辑
});
3.2 测试步骤
使用allure.step添加测试步骤:
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添加测试标签:
import { test } from '@playwright/test';
import { allure } from 'allure-playwright';
test('测试标签示例', async ({ page }) => {
allure.tags('smoke', 'regression', 'high-priority');
// 测试逻辑
});
3.4 测试严重级别
使用@allure.severity添加测试严重级别:
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添加测试套件:
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添加测试链接:
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添加附件:
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添加测试参数:
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文件:
# 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文件:
[
{
"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文件:
{
"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集成
# .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集成
# .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集成
# .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 使用描述性测试名称
// ✅ 好的做法
test('应该能够成功提交联系表单', async ({ page }) => {
// 测试逻辑
});
// ❌ 不好的做法
test('测试1', async ({ page }) => {
// 测试逻辑
});
7.2 添加详细的测试步骤
// ✅ 好的做法
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 使用测试标签
// ✅ 好的做法
test('带标签的测试', async ({ page }) => {
allure.tags('smoke', 'regression', 'high-priority');
allure.severity('critical');
// 测试逻辑
});
// ❌ 不好的做法
test('没有标签的测试', async ({ page }) => {
// 测试逻辑
});
7.4 添加测试附件
// ✅ 好的做法
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 使用测试参数
// ✅ 好的做法
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目录不存在或为空。
解决方案:
# 确保先运行测试
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未正确安装。
解决方案:
# 重新生成报告
npm run test:allure
# 检查allure-report目录
ls -la allure-report
# 重新安装Allure
npm install --save-dev allure-commandline
8.3 测试步骤不显示
问题: Allure报告中没有显示测试步骤。
原因: 没有使用allure.step添加测试步骤。
解决方案:
// 添加测试步骤
await allure.step('步骤描述', async () => {
// 测试逻辑
});
8.4 附件不显示
问题: Allure报告中没有显示附件。
原因: 没有使用allure.attachment添加附件或附件路径不正确。
解决方案:
// 添加附件
const screenshot = await page.screenshot();
allure.attachment('截图', screenshot, 'image/png');
九、总结
Allure测试报告系统提供了强大的测试报告功能,包括:
- 美观的报告界面: 直观的UI设计,易于理解
- 详细的测试信息: 测试描述、步骤、参数、附件等
- 测试趋势分析: 通过率、执行时间、测试数量趋势
- 测试分类: 按缺陷类型分类,便于问题定位
- CI/CD集成: 支持多种CI/CD工具集成
通过使用Allure报告系统,可以更好地了解测试执行情况,快速定位问题,提高测试效率。
文档版本: v1.0
最后更新: 2026-02-28
维护者: 张翔