From b4e4c754cfdf3399ce01a636a56fd352a43a7173 Mon Sep 17 00:00:00 2001 From: HenrikSchuette Date: Thu, 23 Oct 2025 09:15:37 +0200 Subject: [PATCH 1/3] added path to metadata of tcs --- testbench2robotframework/__init__.py | 2 +- testbench2robotframework/json_reader.py | 1 + testbench2robotframework/model.py | 2 ++ testbench2robotframework/testbench2robotframework.py | 3 ++- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/testbench2robotframework/__init__.py b/testbench2robotframework/__init__.py index b704470..9622991 100644 --- a/testbench2robotframework/__init__.py +++ b/testbench2robotframework/__init__.py @@ -17,4 +17,4 @@ from .testbench2robotframework import testbench2robotframework # noqa: F401 -__version__ = "0.8.0a1" +__version__ = "0.8.0b1" diff --git a/testbench2robotframework/json_reader.py b/testbench2robotframework/json_reader.py index 0e75fd4..4ccf41f 100644 --- a/testbench2robotframework/json_reader.py +++ b/testbench2robotframework/json_reader.py @@ -28,6 +28,7 @@ def metadata(self) -> dict[str, str]: "UniqueID": self.details.uniqueID, "Name": self.details.name, "Numbering": self.details.numbering, + "Path": self.details.path, } diff --git a/testbench2robotframework/model.py b/testbench2robotframework/model.py index c64718d..6b4b578 100644 --- a/testbench2robotframework/model.py +++ b/testbench2robotframework/model.py @@ -510,6 +510,7 @@ class TestCaseSetDetails: key: str numbering: str uniqueID: str + path:str name: str spec: TestCaseSetSpecificationSummary testCases: list[TestCaseSummary] @@ -522,6 +523,7 @@ def from_dict(cls, dictionary) -> TestCaseSetDetails: numbering=dictionary.get("numbering", ""), uniqueID=dictionary.get("uniqueID", ""), name=dictionary.get("name", ""), + path=dictionary.get("path", ""), spec=TestCaseSetSpecificationSummary.from_dict(dictionary.get("spec", {})), exec=TestCaseSetExecutionSummary.from_dict(dictionary.get("exec", {})) if dictionary.get("exec") diff --git a/testbench2robotframework/testbench2robotframework.py b/testbench2robotframework/testbench2robotframework.py index 6869d26..09bde21 100644 --- a/testbench2robotframework/testbench2robotframework.py +++ b/testbench2robotframework/testbench2robotframework.py @@ -15,6 +15,7 @@ def testbench2robotframework(testbench_report: str, config: dict): setup_logger(configuration) logger.debug("Configuration loaded.") testbench_report = Path(testbench_report) + temp_dir = None try: if is_zip_file(testbench_report): temp_dir = tempfile.TemporaryDirectory(dir=Path.cwd()) @@ -41,6 +42,6 @@ def testbench2robotframework(testbench_report: str, config: dict): return write_test_suites(test_suites, configuration) except Exception as exception: - if temp_dir: + if temp_dir is not None: temp_dir.cleanup() raise exception From bedb7d45cf20aabcec742d3eeb208cabebebd598 Mon Sep 17 00:00:00 2001 From: HenrikSchuette Date: Thu, 30 Oct 2025 09:19:14 +0100 Subject: [PATCH 2/3] added project, tov and cycle to metadata --- testbench2robotframework/__init__.py | 2 +- testbench2robotframework/json_reader.py | 4 ++++ testbench2robotframework/testbench2rf.py | 13 +++++++++++-- .../testbench2robotframework.py | 6 +++++- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/testbench2robotframework/__init__.py b/testbench2robotframework/__init__.py index 9622991..abfb39a 100644 --- a/testbench2robotframework/__init__.py +++ b/testbench2robotframework/__init__.py @@ -17,4 +17,4 @@ from .testbench2robotframework import testbench2robotframework # noqa: F401 -__version__ = "0.8.0b1" +__version__ = "0.8.0b2" diff --git a/testbench2robotframework/json_reader.py b/testbench2robotframework/json_reader.py index 4ccf41f..6d76a14 100644 --- a/testbench2robotframework/json_reader.py +++ b/testbench2robotframework/json_reader.py @@ -50,6 +50,10 @@ def get_structure_tree_path(self) -> Path: if not tov_path.exists(): sys.exit(f"Neither {cycle_path} nor {tov_path} found.") return tov_path + + def get_project_json(self) -> Optional[dict]: + project_path = Path(self.json_dir) / "project.json" + return read_json(str(project_path)) @property def test_theme_tree(self) -> TestStructureTree: diff --git a/testbench2robotframework/testbench2rf.py b/testbench2robotframework/testbench2rf.py index 5bc9d58..5c656bf 100644 --- a/testbench2robotframework/testbench2rf.py +++ b/testbench2robotframework/testbench2rf.py @@ -507,6 +507,9 @@ def create_test_suites( test_case_set_catalog: dict[str, TestCaseSet], path_resolver: PathResolver, config: Configuration, + project: str | None, + tov: str | None, + cycle: str | None ) -> dict[str, File]: if not Group: if config.compound_interaction_logging == CompoundInteractionLogging.GROUP: @@ -526,7 +529,7 @@ def create_test_suites( test_suites = {} for uid, test_case_set in test_case_set_catalog.items(): test_suites[uid] = RobotSuiteFileBuilder( - test_case_set, tcs_paths[uid], config + test_case_set, tcs_paths[uid], config, project, tov, cycle ).create_test_suite_file() tt_paths = path_resolver.tt_paths for uid, test_theme in path_resolver.tt_catalog.items(): @@ -586,11 +589,14 @@ def create_meta_data(name, value): class RobotSuiteFileBuilder: def __init__( - self, test_case_set: TestCaseSet, tcs_path: PurePath, config: Configuration + self, test_case_set: TestCaseSet, tcs_path: PurePath, config: Configuration, project: str | None, tov: str | None, cycle: str | None ) -> None: self.test_case_set = test_case_set self.tcs_path = tcs_path self.config = config + self.project = project + self.tov = tov + self.cycle = cycle self._rf_test_cases: list[RfTestCase] = [ RfTestCase(test_case_details=test_case, config=config) for test_case in self.test_case_set.test_cases.values() @@ -764,6 +770,9 @@ def _create_setting_section(self) -> SettingSection: setting_section.body.extend(self._create_rf_resource_imports(subdivisions)) setting_section.body.extend(self._create_rf_unknown_imports(subdivisions)) setting_section_meta_data = self.test_case_set.metadata + setting_section.body.append(create_meta_data("Project", self.project)) + setting_section.body.append(create_meta_data("TOV", self.tov)) + setting_section.body.append(create_meta_data("Cycle", self.cycle)) setting_section.body.extend( [ create_meta_data(metadata_name, metadata_value) diff --git a/testbench2robotframework/testbench2robotframework.py b/testbench2robotframework/testbench2robotframework.py index 09bde21..88802ed 100644 --- a/testbench2robotframework/testbench2robotframework.py +++ b/testbench2robotframework/testbench2robotframework.py @@ -34,8 +34,12 @@ def testbench2robotframework(testbench_report: str, config: dict): tuple(reader.get_test_case_set_catalog().keys()), configuration.log_suite_numbering, ) + project_information = reader.get_project_json() + project = project_information.get("name") if project_information else None + tov = project_information.get("projectContext", {}).get("tovName") if project_information else None + cycle = project_information.get("projectContext", {}).get("cycleName") if project_information else None test_suites = create_test_suites( - reader.get_test_case_set_catalog(), path_resolver, configuration + reader.get_test_case_set_catalog(), path_resolver, configuration, project, tov, cycle ) if not test_suites: logger.warning("There are no test suites in the exported TestBench Projekt.") From ffb3476bf461c60c96d773deb3722385d8bea19d Mon Sep 17 00:00:00 2001 From: HenrikSchuette Date: Fri, 31 Oct 2025 08:35:29 +0100 Subject: [PATCH 3/3] set textual interaction result to skipped --- testbench2robotframework/result_writer.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/testbench2robotframework/result_writer.py b/testbench2robotframework/result_writer.py index b0157d6..973314b 100644 --- a/testbench2robotframework/result_writer.py +++ b/testbench2robotframework/result_writer.py @@ -158,6 +158,13 @@ def end_test(self, test: TestCase): compound_interactions = list( self._get_interactions_by_type(itb_test_case.interactions, InteractionType.Compound) ) + textual_interactions = list( + self._get_interactions_by_type(itb_test_case.interactions, InteractionType.Textual) + ) + for step in textual_interactions: + if step.exec is None: + step.exec = InteractionExecutionSummary.from_dict({}) + step.exec.verdict = InteractionVerdict.Skipped self._set_atomic_interactions_execution_result(atomic_interactions, self.test_chain) for interaction in compound_interactions: self._set_compound_interaction_execution_result(interaction)