怎样用脚本自动分析测试结果?

wen 实用脚本 1

本文目录导读:

怎样用脚本自动分析测试结果?

  1. 解析JUnit/TestNG XML报告(Python)
  2. 解析性能测试结果(JMeter CSV报告)
  3. 使用CI/CD变量(Shell脚本)
  4. 解析JSON格式的测试报告(Node.js)
  5. 结合邮件/通知(Python + SMTP)
  6. 通用日志分析(正则表达式)
  7. 最佳实践建议

要使用脚本自动分析测试结果,通常需要结合测试框架的输出(如日志、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))

最佳实践建议

  1. 标准化输出:让测试框架输出结构化数据(XML/JSON)而非纯文本。
  2. 定义阈值:在脚本中设置失败率>5%关键用例失败时触发告警。
  3. 集成CI/CD:将脚本编写为CI流水线中的步骤(如GitLab CI的script)。
  4. 可视化:将分析结果写入数据库(如InfluxDB),用Grafana展示趋势。

如果需要更具体的场景(如Selenium UI测试、API负载测试),请提供测试框架名称输出格式,我可以给出针对性代码。

抱歉,评论功能暂时关闭!