File: convert_junitxml.py

package info (click to toggle)
mnemosyne 2.11%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 9,988 kB
  • sloc: python: 34,697; ansic: 837; xml: 625; makefile: 258; sh: 72
file content (89 lines) | stat: -rwxr-xr-x 3,065 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/python3

# JUnitXML to todo.txt Parser
# Ace Z. Alba (acezalba+github@slmail.me)
#

import os
import xml.etree.ElementTree as ET

def parse_junitxml(xml_file):
    tree = ET.parse(xml_file)
    root = tree.getroot()

    test_results = []

    junitxml_errors = [
        "AssertionError",
        "NullPointerException",
        "TimeoutException",
        "IllegalArgumentException",
        "Exception",
        "IndexError",
        "KeyError",
        "TypeError",
        "ValueError"
    ]

    total_tests = len(root.findall('.//testcase'))
    successful_tests = total_tests  # Initialize successful_tests to the total number of tests
    failures_count = 0
    errors_count = 0

    for testcase in root.findall('.//testcase'):
        test_name = testcase.get('name')
        classname = testcase.get('classname', '')
        time = testcase.get('time', '')

        failure = testcase.find('failure')
        error = testcase.find('error')

        if failure is not None:
            failures_count += 1
            successful_tests -= 1  # Decrement successful_tests on failure
            failure_message = failure.get('message', '')

            for error_type in junitxml_errors:
                if error_type in failure_message:
                    test_results.append(
                        f"{classname}::{test_name} time:{time} @failure @{error_type} message:\"{failure_message}\""
                    )
                    break
            else:
                test_results.append(f"{classname}::{test_name} time:{time} @failure message:\"{failure_message}\"")
        elif error is not None:
            errors_count += 1
            successful_tests -= 1  # Decrement successful_tests on error
            error_message = error.get('message', '')

            for error_type in junitxml_errors:
                if error_type in error_message:
                    test_results.append(
                        f"{classname}::{test_name} time:{time} @error @{error_type} message:\"{error_message}\""
                    )
                    break
            else:
                test_results.append(f"{classname}::{test_name} time:{time} @error message:\"{error_message}\"")
        else:
            test_results.append(f"x {classname}::{test_name} time:{time}")

    print("Summary:")
    print(f"Total Tests: {total_tests}")
    print(f"Successful Tests: {successful_tests}")
    print(f"Failures: {failures_count}")
    print(f"Errors: {errors_count}")

    return test_results

def save_to_todo_file(todo_file, test_results):
    with open(todo_file, 'w') as file:
        file.write('\n'.join(test_results))

if __name__ == "__main__":
    script_dir = os.path.dirname(os.path.abspath(__file__))
    junitxml_file = os.path.join(script_dir, os.pardir, "test-results.xml")
    todo_file = os.path.join(script_dir, os.pardir, "test-results.todo.txt")

    test_results = parse_junitxml(junitxml_file)
    save_to_todo_file(todo_file, test_results)
    print(f"Conversion complete. Results saved to test-results.todo.txt")