Source code for qa_analytics_insights.xml_parser

"""Copyright (c) 2023, Aydin Abdi.

This module is responsible for parsing XML files into TestSuite objects.
"""

from collections import defaultdict
from typing import List  # noqa: F401
from xml.etree import ElementTree as ET  # noqa: F401

from loguru import logger

from qa_analytics_insights.data_classes import TestClass, TestSuite
from qa_analytics_insights.parser import ParserTestCase, ParserTestSuite
from qa_analytics_insights.xml_tag_finder import XMLTagFinder


[docs] class XMLParser: """Responsible for parsing XML files into TestClass and TestCase objects.""" def __init__(self, xml_tag_finder: XMLTagFinder) -> None: """Responsible for parsing XML files into TestClass and TestCase objects. Args: xml_tag_finder: XMLTagFinder object. """ self.xml_tag_finder = xml_tag_finder self.root = self.xml_tag_finder.root # type: ET.Element self.xml_path = self.xml_tag_finder.xml_loader.xml_path # type: str self.test_case_tags = self.xml_tag_finder.test_cases # type: List[ET.Element] self.suite_tag = self.xml_tag_finder.suite # type: ET.Element self.suite_parser = ParserTestSuite(self.suite_tag) # type: ParserTestSuite
[docs] def parse(self) -> TestSuite: """Parses the XML file into TestClass and TestCase objects. This method parses test cases and groups them by their class name. If a test case has no class name,it will be added to the ungrouped_test_cases list. Returns: TestSuite object. """ ungrouped_test_cases = [] classwise_test_cases = defaultdict(list) # Creating test cases and grouping them by classname for testcase in self.test_case_tags: test_case_parser = ParserTestCase(testcase) test_case = test_case_parser.parse() if not test_case.test_class or test_case.test_class is None: logger.debug(f"Test case {test_case.name} has no test class.") ungrouped_test_cases.append(test_case) else: classwise_test_cases[test_case.test_class].append(test_case) # Creating TestClass objects from the grouped test cases test_classes = [ TestClass(name=classname, test_cases=test_cases) for classname, test_cases in classwise_test_cases.items() ] # Creating TestSuite object test_suite = self.suite_parser.parse() test_suite.test_classes = test_classes test_suite.test_cases = ungrouped_test_cases return test_suite