本文目录导读:

- 解析JUnit/TestNG XML报告(Python)
- 解析性能测试结果(JMeter CSV报告)
- 使用CI/CD变量(Shell脚本)
- 解析JSON格式的测试报告(Node.js)
- 结合邮件/通知(Python + SMTP)
- 通用日志分析(正则表达式)
- 最佳实践建议
要使用脚本自动分析测试结果,通常需要结合测试框架的输出(如日志、XML、JSON或HTML报告)和脚本语言(如Python、Shell或Node.js)进行解析,以下是几种常见场景的自动化分析方法,附具体代码示例:
解析JUnit/TestNG XML报告(Python)
JUnit/TestNG生成的XML报告(如testng-results.xml)是自动化分析的标准格式。
import xml.etree.ElementTree as ET
# 解析XML文件
tree = ET.parse('testng-results.xml')
root = tree.getroot()
# 统计结果
passed = 0
failed = 0
skipped = 0
for testcase in root.iter('testcase'):
if testcase.find('failure') is not None:
failed += 1
# 输出失败测试名称和错误信息
print(f"FAILED: {testcase.get('name')}")
print(testcase.find('failure').get('message'))
elif testcase.find('skipped') is not None:
skipped += 1
else:
passed += 1
print(f"Passed: {passed}, Failed: {failed}, Skipped: {skipped}")
解析性能测试结果(JMeter CSV报告)
JMeter生成的CSV文件包含时间戳、响应码、响应时间等字段。
import csv
with open('jmeter_result.csv', 'r') as f:
reader = csv.DictReader(f) # 自动识别表头
data = list(reader)
# 计算关键指标
total_requests = len(data)
success = sum(1 for row in data if row['success'] == 'true')
avg_response_time = sum(int(row['elapsed']) for row in data) / total_requests
print(f"总请求: {total_requests}, 成功: {success}, 平均响应时间: {avg_response_time:.2f} ms")
使用CI/CD变量(Shell脚本)
在Jenkins/GitLab CI中,通常需要从测试输出中提取数字并设置环境变量。
#!/bin/bash
# 从控制台日志中提取测试结果(假设格式为 "PASSED: 80, FAILED: 3, SKIPPED: 1")
# 使用grep和awk
summary=$(grep -oP 'PASSED: \d+, FAILED: \d+' test_log.txt | tail -1)
passed=$(echo $summary | grep -oP 'PASSED: \K\d+')
failed=$(echo $summary | grep -oP 'FAILED: \K\d+')
# 设置环境变量供后续步骤使用
echo "TEST_PASSED=$passed" >> $GITLAB_ENVIRONMENT_FILE
echo "TEST_FAILED=$failed" >> $GITLAB_ENVIRONMENT_FILE
# 根据失败数量决定是否继续
if [ "$failed" -gt 10 ]; then
echo "错误率过高,构建失败!"
exit 1
fi
解析JSON格式的测试报告(Node.js)
许多现代测试框架(如Jest、Mocha、Cypress)支持输出JSON报告。
const fs = require('fs');
const report = JSON.parse(fs.readFileSync('test-report.json', 'utf8'));
const summary = {
total: report.numTotalTests,
passed: report.numPassedTests,
failed: report.numFailedTests,
// 提取失败的测试名称列表
failedTests: report.testResults
.flatMap(suite => suite.assertionResults)
.filter(result => result.status === 'failed')
.map(result => result.fullName)
};
console.log(JSON.stringify(summary, null, 2));
结合邮件/通知(Python + SMTP)
当测试失败时自动发送邮件。
import smtplib
from email.mime.text import MIMEText
# 假设已解析出失败数量
failed_count = 5
if failed_count > 0:
msg = MIMEText(f"测试中发现 {failed_count} 个失败,请登录CI查看详情。")
msg['Subject'] = '[告警] 测试失败'
msg['From'] = 'ci@company.com'
msg['To'] = 'team@company.com'
with smtplib.SMTP('smtp.company.com') as server:
server.login('user', 'pass')
server.send_message(msg)
通用日志分析(正则表达式)
如果测试结果格式非常随意,可用正则提取关键信息。
import re
with open('test_output.log', 'r') as f:
log = f.read()
# 假设日志中有 "TEST RESULT: 80 passed, 3 failed"
match = re.search(r'TEST RESULT: (\d+) passed, (\d+) failed', log)
if match:
passed = int(match.group(1))
failed = int(match.group(2))
最佳实践建议
- 标准化输出:让测试框架输出结构化数据(XML/JSON)而非纯文本。
- 定义阈值:在脚本中设置
失败率>5%或关键用例失败时触发告警。 - 集成CI/CD:将脚本编写为CI流水线中的步骤(如GitLab CI的
script)。 - 可视化:将分析结果写入数据库(如InfluxDB),用Grafana展示趋势。
如果需要更具体的场景(如Selenium UI测试、API负载测试),请提供测试框架名称和输出格式,我可以给出针对性代码。