Просмотр исходного кода

ci: name the test case id with _qemu postfix for qemu test cases

Fu Hanxi 2 лет назад
Родитель
Сommit
7c3143dba8
1 измененных файлов с 37 добавлено и 28 удалено
  1. 37 28
      conftest.py

+ 37 - 28
conftest.py

@@ -145,8 +145,15 @@ SUB_JUNIT_FILENAME = 'dut.xml'
 ##################
 # Help Functions #
 ##################
-def format_case_id(target: Optional[str], config: Optional[str], case: str) -> str:
-    return f'{target}.{config}.{case}'
+def format_case_id(target: Optional[str], config: Optional[str], case: str, is_qemu: bool = False) -> str:
+    parts = []
+    if target:
+        parts.append((str(target) + '_qemu') if is_qemu else str(target))
+    if config:
+        parts.append(str(config))
+    parts.append(case)
+
+    return '.'.join(parts)
 
 
 def item_marker_names(item: Item) -> List[str]:
@@ -217,16 +224,12 @@ def get_target_marker_from_expr(markexpr: str) -> str:
         raise ValueError('Please specify one target marker via "--target [TARGET]" or via "-m [TARGET]"')
 
 
-def merge_junit_files(junit_files: List[str], target_path: str) -> Optional[ET.Element]:
+def merge_junit_files(junit_files: List[str], target_path: str) -> None:
+    if len(junit_files) <= 1:
+        return
+
     merged_testsuite: ET.Element = ET.Element('testsuite')
     testcases: Dict[str, ET.Element] = {}
-
-    if len(junit_files) == 0:
-        return None
-
-    if len(junit_files) == 1:
-        return ET.parse(junit_files[0]).getroot()
-
     for junit in junit_files:
         logging.info(f'Merging {junit} to {target_path}')
         tree: ET.ElementTree = ET.parse(junit)
@@ -257,7 +260,8 @@ def merge_junit_files(junit_files: List[str], target_path: str) -> Optional[ET.E
     merged_testsuite.set('errors', str(len(merged_testsuite.findall('.//testcase/error'))))
     merged_testsuite.set('skipped', str(len(merged_testsuite.findall('.//testcase/skipped'))))
 
-    return merged_testsuite
+    with open(target_path, 'wb') as fw:
+        fw.write(ET.tostring(merged_testsuite))
 
 
 ############
@@ -297,7 +301,8 @@ def test_func_name(request: FixtureRequest) -> str:
 
 @pytest.fixture
 def test_case_name(request: FixtureRequest, target: str, config: str) -> str:
-    return format_case_id(target, config, request.node.originalname)
+    is_qemu = request._pyfuncitem.get_closest_marker('qemu') is not None
+    return format_case_id(target, config, request.node.originalname, is_qemu=is_qemu)
 
 
 @pytest.fixture
@@ -730,26 +735,30 @@ class IdfPytestEmbedded:
         if not junits:
             return
 
+        if len(junits) > 1:
+            merge_junit_files(junits, os.path.join(tempdir, SUB_JUNIT_FILENAME))
+            junits = [os.path.join(tempdir, SUB_JUNIT_FILENAME)]
+
+        is_qemu = item.get_closest_marker('qemu') is not None
         failed_sub_cases = []
         target = item.funcargs['target']
         config = item.funcargs['config']
-        merged_dut_junit_filepath = os.path.join(tempdir, SUB_JUNIT_FILENAME)
-        merged_testsuite = merge_junit_files(junit_files=junits, target_path=merged_dut_junit_filepath)
-
-        if merged_testsuite is None:
-            return
+        for junit in junits:
+            xml = ET.parse(junit)
+            testcases = xml.findall('.//testcase')
+            for case in testcases:
+                # modify the junit files
+                new_case_name = format_case_id(target, config, case.attrib['name'], is_qemu=is_qemu)
+                case.attrib['name'] = new_case_name
+                if 'file' in case.attrib:
+                    case.attrib['file'] = case.attrib['file'].replace('/IDF/', '')  # our unity test framework
+
+                # collect real failure cases
+                if case.find('failure') is not None:
+                    failed_sub_cases.append(new_case_name)
+
+            xml.write(junit)
 
-        for testcase in merged_testsuite.findall('testcase'):
-            new_case_name: str = format_case_id(target, config, testcase.attrib['name'])
-            testcase.attrib['name'] = new_case_name
-            if 'file' in testcase.attrib:
-                testcase.attrib['file'] = testcase.attrib['file'].replace('/IDF/', '')  # Our unity test framework
-            # Collect real failure cases
-            if testcase.find('failure') is not None:
-                failed_sub_cases.append(new_case_name)
-
-        merged_tree: ET.ElementTree = ET.ElementTree(merged_testsuite)
-        merged_tree.write(merged_dut_junit_filepath)
         item.stash[_item_failed_cases_key] = failed_sub_cases
 
     def pytest_sessionfinish(self, session: Session, exitstatus: int) -> None: