| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import re
- import json
- from pathlib import Path
- from Utils.Log import log_for_api
- logger = log_for_api()
- class TestResultParser:
- """测试结果解析器"""
- def __init__(self, results_dir):
- self.results_dir = Path(results_dir)
- def parse_pytest_output(self, output):
- """从pytest输出中解析测试结果"""
- results = {
- "total": 0,
- "passed": 0,
- "failed": 0,
- "skipped": 0,
- "errors": 0,
- "duration": 0,
- "pass_rate": 0
- }
- # 尝试从输出中解析结果
- try:
- # 匹配 pytest 结果摘要行
- pattern = r"(\d+) passed.*?(\d+) failed.*?(\d+) skipped"
- match = re.search(pattern, output)
- if match:
- results["passed"] = int(match.group(1))
- results["failed"] = int(match.group(2))
- results["skipped"] = int(match.group(3))
- results["total"] = results["passed"] + results["failed"] + results["skipped"]
- # 计算通过率
- if results["total"] > 0:
- results["pass_rate"] = round((results["passed"] / results["total"]) * 100, 2)
- # 尝试解析持续时间
- duration_pattern = r"in (\d+\.\d+)s"
- duration_match = re.search(duration_pattern, output)
- if duration_match:
- results["duration"] = float(duration_match.group(1))
- except Exception as e:
- logger.error(f"解析pytest输出时出错: {e}")
- return results
- def parse_allure_results(self):
- """从Allure结果文件中解析更详细的信息"""
- results = {
- "suites": [],
- "categories": [],
- "status_counts": {"passed": 0, "failed": 0, "broken": 0, "skipped": 0, "unknown": 0}
- }
- try:
- # 查找所有result.json文件
- result_files = list(self.results_dir.glob("*-result.json"))
- for result_file in result_files:
- with open(result_file, 'r', encoding='utf-8') as f:
- data = json.load(f)
- # 统计状态
- status = data.get("status", "unknown")
- if status in results["status_counts"]:
- results["status_counts"][status] += 1
- # 收集套件信息
- suite_name = data.get("labels", {}).get("suite", "Unknown Suite")
- if suite_name not in results["suites"]:
- results["suites"].append(suite_name)
- except Exception as e:
- logger.error(f"解析Allure结果时出错: {e}")
- return results
|