diff --git a/scripts/publish_test_metrics.py b/scripts/publish_test_metrics.py index 49e9d75..2bb85be 100644 --- a/scripts/publish_test_metrics.py +++ b/scripts/publish_test_metrics.py @@ -65,6 +65,37 @@ def _load_junit(path: str) -> dict[str, int]: return totals +def _load_junit_cases(path: str) -> list[tuple[str, str]]: + tree = ET.parse(path) + root = tree.getroot() + + suites: list[ET.Element] + if root.tag == "testsuite": + suites = [root] + elif root.tag == "testsuites": + suites = list(root.findall("testsuite")) + else: + suites = [] + + cases: list[tuple[str, str]] = [] + for suite in suites: + for case in suite.findall("testcase"): + name = (case.attrib.get("name") or "").strip() + classname = (case.attrib.get("classname") or "").strip() + if not name: + continue + test_id = f"{classname}::{name}" if classname else name + status = "passed" + if case.find("failure") is not None: + status = "failed" + elif case.find("error") is not None: + status = "error" + elif case.find("skipped") is not None: + status = "skipped" + cases.append((test_id, status)) + return cases + + def _read_http(url: str) -> str: try: with urllib.request.urlopen(url, timeout=10) as resp: @@ -192,8 +223,10 @@ def main() -> int: docs_gate_rc = _load_gate_rc(Path(os.getenv("QUALITY_GATE_DOCS_RC_PATH", str(build_dir / "docs-naming.rc")))) source_lines_over_500 = _count_source_files_over_limit(repo_root, max_lines=500) totals = {"tests": 0, "failures": 0, "errors": 0, "skipped": 0} + test_cases: list[tuple[str, str]] = [] if os.path.exists(junit_path): totals = _load_junit(junit_path) + test_cases = _load_junit_cases(junit_path) passed = max(totals["tests"] - totals["failures"] - totals["errors"] - totals["skipped"], 0) outcome = "ok" @@ -247,9 +280,14 @@ def main() -> int: "# TYPE platform_quality_gate_source_lines_over_500_total gauge", f'platform_quality_gate_source_lines_over_500_total{{suite="{suite}"}} {source_lines_over_500}', "# TYPE ariadne_quality_gate_checks_total gauge", + "# TYPE platform_quality_gate_test_case_result gauge", "# TYPE ariadne_quality_gate_build_info gauge", f"ariadne_quality_gate_build_info{_label_str(labels)} 1", ] + payload_lines.extend( + f'platform_quality_gate_test_case_result{{suite="{suite}",test="{_escape_label(test_name)}",status="{_escape_label(test_status)}"}} 1' + for test_name, test_status in test_cases + ) payload_lines.extend( f'ariadne_quality_gate_checks_total{{suite="{suite}",check="{check_name}",result="{check_status}"}} 1' for check_name, check_status in checks.items()