本文目录导读:

- 解析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负载测试),请提供测试框架名称和输出格式,我可以给出针对性代码。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播