pytest获取报告信息

import os


# def pytest_terminal_summary(terminalreporter, exitstatus, config):
#     total = terminalreporter._numcollected
#     passed = len(terminalreporter.stats.get('passed', []))
#     failed = len(terminalreporter.stats.get('failed', []))
#
#     print(f"总测试个数: {total}")
#     print(f"成功个数: {passed}")
#     print(f"失败个数: {failed}")
#     # 检查是否有 htmlpath 属性
#     html_report = getattr(config.option, "htmlpath", None)
#     json_report = getattr(config.option, "json_report_file", None)
#
#     if html_report:
#         print(f"HTML 报告已生成: {os.path.abspath(html_report)}")
#     else:
#         print("没有生成 HTML 报告")
#
#     if json_report:
#         print(f"JSON 报告已生成: {os.path.abspath(json_report)}")
#     else:
#         print("没有生成 JSON 报告")


import os

def pytest_terminal_summary(terminalreporter, exitstatus, config):
    # 获取测试结果统计信息
    summary_stats = terminalreporter.stats

    # 成功测试
    passed = len(summary_stats.get('passed', []))
    # 失败测试
    failed = len(summary_stats.get('failed', []))
    # 跳过的测试
    skipped = len(summary_stats.get('skipped', []))
    # 出现异常的测试
    errors = len(summary_stats.get('error', []))
    # 预计会失败的测试(实际失败的)
    xfailed = len(summary_stats.get('xfailed', []))
    # 预计会失败但意外通过的测试
    xpassed = len(summary_stats.get('xpassed', []))
    # 警告信息
    warnings = len(summary_stats.get('warnings', []))

    # 输出报告信息
    print(f"测试总数: {passed + failed + skipped}")
    print(f"成功的测试: {passed}")
    print(f"失败的测试: {failed}")
    print(f"跳过的测试: {skipped}")
    print(f"出现错误的测试: {errors}")
    print(f"预计失败的测试 (XFailed): {xfailed}")
    print(f"意外通过的测试 (XPassed): {xpassed}")
    print(f"警告数: {warnings}")

    # 获取 HTML 和 JSON 报告路径(如果有)
    html_report = getattr(config.option, "htmlpath", None)
    json_report = getattr(config.option, "json_report_file", None)

    if html_report:
        print(f"HTML 报告已生成: {os.path.abspath(html_report)}")
    if json_report:
        print(f"JSON 报告已生成: {os.path.abspath(json_report)}")

    current_dir = os.path.dirname(os.path.abspath(__file__))
    report_file = os.path.join(current_dir, 'pytest_results.txt')

    with open(report_file, 'w') as f:
        f.write(f"PASSED={passed}\n")
        f.write(f"FAILED={failed}\n")
        f.write(f"SKIPPED={skipped}\n")
        f.write(f"ERRORS={errors}\n")




#!/bin/bash

# 指定文件路径
report_file="tests/pytest_results.txt"

# 检查文件是否存在
if [[ ! -f $report_file ]]; then
    echo "Report file not found!"
    exit 1
fi

# 读取文件中的变量
while IFS='=' read -r key value; do
    case $key in
        PASSED) PASSED=$value ;;
        FAILED) FAILED=$value ;;
        SKIPPED) SKIPPED=$value ;;
        ERRORS) ERRORS=$value ;;
    esac
done < "$report_file"

# 输出结果
echo "Passed tests: $PASSED"
echo "Failed tests: $FAILED"
echo "Skipped tests: $SKIPPED"
echo "Errors: $ERRORS"









其它:

```bash
import os
import subprocess
import xml.etree.ElementTree as ET


def run_tests_and_generate_report():
    current_directory = os.path.dirname(os.path.abspath(__file__))

    # 指定报告的目录和文件名
    report_directory = os.path.join(current_directory, "unit", "reports")
    html_report_file = "report.html"
    xml_report_file = "report.xml"
    html_report_path = os.path.join(report_directory, html_report_file)
    xml_report_path = os.path.join(report_directory, xml_report_file)

    # 确保目录存在
    os.makedirs(report_directory, exist_ok=True)

    # 在子进程中运行 pytest 并生成 HTML 和 JUnit XML 报告
    result = subprocess.run(
        ["pytest", f"--html={html_report_path}", f"--junitxml={xml_report_path}"],
        capture_output=True,
        text=True,
        encoding="utf-8",
    )

    # 打印标准输出和标准错误
    print(result.stdout)
    print(result.stderr)

    # 打印HTML报告的绝对路径
    absolute_html_report_path = os.path.abspath(html_report_path)
    print(f"HTML report generated at: {absolute_html_report_path}")

    # 解析 XML 报告以获取测试结果
    parse_test_results(xml_report_path)

    # 根据返回码判断测试是否成功
    if result.returncode == 0:
        print("Tests ran successfully.")
    else:
        print("Tests failed.")

    # 返回子进程的返回码
    return result.returncode


def parse_test_results(xml_report_path):
    # 解析 XML 文件
    tree = ET.parse(xml_report_path)
    root = tree.getroot()
    for testsuite in root.findall("testsuite"):
        name = testsuite.get("name")
        errors = int(testsuite.get("errors") or 0)
        failures = int(testsuite.get("failures") or 0)
        skipped = int(testsuite.get("skipped") or 0)
        tests = int(testsuite.get("tests") or 0)
        passed = tests - (failures + errors + skipped)

        print(f"Testsuite: {name}")
        print(f"Errors: {errors}")
        print(f"Failures: {failures}")
        print(f"Skipped: {skipped}")
        print(f"Total tests: {tests}")
        print(f"Passed tests: {passed}")
        print(f"Time: {testsuite.get('time')}")

        print(f"TESTSUITE_NAME='{name}'")
        print(f"ERRORS={errors}")
        print(f"FAILURES={failures}")
        print(f"SKIPPED={skipped}")
        print(f"TOTAL_TESTS={tests}")
        print(f"PASSED_TESTS={passed}")
        print(f"TIME='{testsuite.get('time')}'")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值