From 7e8451a994e4fd5ccdba0df9f0688f8d207b3d8c Mon Sep 17 00:00:00 2001 From: MaximilianSoerenPollak Date: Thu, 15 Jan 2026 17:04:16 +0100 Subject: [PATCH 1/5] Combined Class+Func name in tests if available --- .../tests/expected_grouped.json | 2 +- .../tests/expected_testlink.json | 2 +- .../tests/test_source_code_link_integration.py | 4 ++-- .../score_source_code_linker/xml_parser.py | 14 ++++++++++---- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/extensions/score_source_code_linker/tests/expected_grouped.json b/src/extensions/score_source_code_linker/tests/expected_grouped.json index da05343c..7520d83e 100644 --- a/src/extensions/score_source_code_linker/tests/expected_grouped.json +++ b/src/extensions/score_source_code_linker/tests/expected_grouped.json @@ -21,7 +21,7 @@ ], "TestLinks": [ { - "name": "test_system_startup_time", + "name": "test_requirements_coverage.TestRequirementsCoverage__test_system_startup_time", "file": "src/tests/testfile_2.py", "line": 25, "need": "TREQ_ID_1", diff --git a/src/extensions/score_source_code_linker/tests/expected_testlink.json b/src/extensions/score_source_code_linker/tests/expected_testlink.json index 9dc32210..d97538a4 100644 --- a/src/extensions/score_source_code_linker/tests/expected_testlink.json +++ b/src/extensions/score_source_code_linker/tests/expected_testlink.json @@ -36,7 +36,7 @@ "result_text": "" }, { - "name": "test_system_startup_time", + "name": "test_requirements_coverage.TestRequirementsCoverage__test_system_startup_time", "file": "src/tests/testfile_2.py", "line": 25, "need": "TREQ_ID_1", diff --git a/src/extensions/score_source_code_linker/tests/test_source_code_link_integration.py b/src/extensions/score_source_code_linker/tests/test_source_code_link_integration.py index 44ea35a6..c2a16e24 100644 --- a/src/extensions/score_source_code_linker/tests/test_source_code_link_integration.py +++ b/src/extensions/score_source_code_linker/tests/test_source_code_link_integration.py @@ -338,8 +338,8 @@ def example_source_link_text_all_ok(sphinx_base_dir: Path): def example_test_link_text_all_ok(sphinx_base_dir: Path): return { "TREQ_ID_1": [ - DataForTestLink( - name="test_system_startup_time", + DataForTestLink( + name="test_requirements_coverage.TestRequirementsCoverage__test_system_startup_time", file=Path("src/tests/testfile_2.py"), need="TREQ_ID_1", line=25, diff --git a/src/extensions/score_source_code_linker/xml_parser.py b/src/extensions/score_source_code_linker/xml_parser.py index 022168d2..d4b870df 100644 --- a/src/extensions/score_source_code_linker/xml_parser.py +++ b/src/extensions/score_source_code_linker/xml_parser.py @@ -104,10 +104,16 @@ def read_test_xml_file(file: Path) -> tuple[list[DataOfTestCase], list[str]]: for testsuite in root.findall("testsuite"): for testcase in testsuite.findall("testcase"): case_properties = {} - testname = testcase.get("name") - assert testname is not None, ( - f"Testcase: {testcase} does not have a 'name' attribute. " - "This is mandatory. This should not happen, something is wrong." + testcasename = testcase.get("name", "") + testclassname = testcase.get("classname", "") + assert testclassname or testcasename, ( + f"Testcase: {testcase} does not have a 'name' or 'classname' attribute. " + "One of which is mandatory. This should not happen, something is wrong." + ) + testname = ( + "__".join([testclassname, testcasename]) + if testclassname + else testcasename ) test_file = testcase.get("file") line = testcase.get("line") From 1cd3025a542cca65fb5e07a55bd2104e1a42545c Mon Sep 17 00:00:00 2001 From: MaximilianSoerenPollak Date: Thu, 15 Jan 2026 17:13:06 +0100 Subject: [PATCH 2/5] Shorten ClassName --- docs/internals/extensions/source_code_linker.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/internals/extensions/source_code_linker.md b/docs/internals/extensions/source_code_linker.md index 51ba7690..2f53c840 100644 --- a/docs/internals/extensions/source_code_linker.md +++ b/docs/internals/extensions/source_code_linker.md @@ -92,7 +92,7 @@ def test_feature(): 1. **XML Parsing** (`xml_parser.py`) - Scans `bazel-testlogs/` for `test.xml` files. - Parses test cases and extracts: - - Name + - Name & Classname - File path - Line - Result (e.g. passed, failed, skipped) @@ -104,6 +104,8 @@ def test_feature(): - `DataFromTestCase` (used for external needs) - `DataForTestLink` (used for linking tests to requirements) +> If there is a Classname then it gets combined with the function name for the displayed link as follows: `Classname__Functionname` + 2. **Need Linking** - Generates external Sphinx needs from `DataFromTestCase`. - Creates `testlink` attributes on linked requirements. From 6b074934a93c4040dedb35fad8e402128c1641d7 Mon Sep 17 00:00:00 2001 From: MaximilianSoerenPollak Date: Thu, 15 Jan 2026 17:28:09 +0100 Subject: [PATCH 3/5] Debug Prints & Fixing tests --- .../tests/expected_grouped.json | 2 +- .../tests/expected_testlink.json | 2 +- .../tests/test_source_code_link_integration.py | 2 +- .../score_source_code_linker/xml_parser.py | 13 ++++++++----- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/extensions/score_source_code_linker/tests/expected_grouped.json b/src/extensions/score_source_code_linker/tests/expected_grouped.json index 7520d83e..b5abf26c 100644 --- a/src/extensions/score_source_code_linker/tests/expected_grouped.json +++ b/src/extensions/score_source_code_linker/tests/expected_grouped.json @@ -21,7 +21,7 @@ ], "TestLinks": [ { - "name": "test_requirements_coverage.TestRequirementsCoverage__test_system_startup_time", + "name": "TestRequirementsCoverage__test_system_startup_time", "file": "src/tests/testfile_2.py", "line": 25, "need": "TREQ_ID_1", diff --git a/src/extensions/score_source_code_linker/tests/expected_testlink.json b/src/extensions/score_source_code_linker/tests/expected_testlink.json index d97538a4..19068a4d 100644 --- a/src/extensions/score_source_code_linker/tests/expected_testlink.json +++ b/src/extensions/score_source_code_linker/tests/expected_testlink.json @@ -36,7 +36,7 @@ "result_text": "" }, { - "name": "test_requirements_coverage.TestRequirementsCoverage__test_system_startup_time", + "name": "TestRequirementsCoverage__test_system_startup_time", "file": "src/tests/testfile_2.py", "line": 25, "need": "TREQ_ID_1", diff --git a/src/extensions/score_source_code_linker/tests/test_source_code_link_integration.py b/src/extensions/score_source_code_linker/tests/test_source_code_link_integration.py index c2a16e24..778ce525 100644 --- a/src/extensions/score_source_code_linker/tests/test_source_code_link_integration.py +++ b/src/extensions/score_source_code_linker/tests/test_source_code_link_integration.py @@ -339,7 +339,7 @@ def example_test_link_text_all_ok(sphinx_base_dir: Path): return { "TREQ_ID_1": [ DataForTestLink( - name="test_requirements_coverage.TestRequirementsCoverage__test_system_startup_time", + name="TestRequirementsCoverage__test_system_startup_time", file=Path("src/tests/testfile_2.py"), need="TREQ_ID_1", line=25, diff --git a/src/extensions/score_source_code_linker/xml_parser.py b/src/extensions/score_source_code_linker/xml_parser.py index d4b870df..158e379b 100644 --- a/src/extensions/score_source_code_linker/xml_parser.py +++ b/src/extensions/score_source_code_linker/xml_parser.py @@ -110,11 +110,14 @@ def read_test_xml_file(file: Path) -> tuple[list[DataOfTestCase], list[str]]: f"Testcase: {testcase} does not have a 'name' or 'classname' attribute. " "One of which is mandatory. This should not happen, something is wrong." ) - testname = ( - "__".join([testclassname, testcasename]) - if testclassname - else testcasename - ) + if testclassname: + testcn = testclassname.split(".")[-1] + print("==========================") + print(testcn) + print("==========================") + testname = "__".join([testcn, testcasename]) + else: + testname = testcasename test_file = testcase.get("file") line = testcase.get("line") From ebd5f98b9aaf5dd3de76dabd0230865c29d919bb Mon Sep 17 00:00:00 2001 From: MaximilianSoerenPollak Date: Thu, 15 Jan 2026 17:35:44 +0100 Subject: [PATCH 4/5] Remove debugging prints --- src/extensions/score_source_code_linker/xml_parser.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/extensions/score_source_code_linker/xml_parser.py b/src/extensions/score_source_code_linker/xml_parser.py index 158e379b..3d7ba67b 100644 --- a/src/extensions/score_source_code_linker/xml_parser.py +++ b/src/extensions/score_source_code_linker/xml_parser.py @@ -112,9 +112,6 @@ def read_test_xml_file(file: Path) -> tuple[list[DataOfTestCase], list[str]]: ) if testclassname: testcn = testclassname.split(".")[-1] - print("==========================") - print(testcn) - print("==========================") testname = "__".join([testcn, testcasename]) else: testname = testcasename From 234241fd7413c21b7a02ca55cc8e5b01b7ecc88c Mon Sep 17 00:00:00 2001 From: MaximilianSoerenPollak Date: Thu, 15 Jan 2026 17:51:38 +0100 Subject: [PATCH 5/5] Formatting & Linting --- .../tests/test_source_code_link_integration.py | 2 +- src/extensions/score_source_code_linker/xml_parser.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/extensions/score_source_code_linker/tests/test_source_code_link_integration.py b/src/extensions/score_source_code_linker/tests/test_source_code_link_integration.py index 778ce525..a400ff77 100644 --- a/src/extensions/score_source_code_linker/tests/test_source_code_link_integration.py +++ b/src/extensions/score_source_code_linker/tests/test_source_code_link_integration.py @@ -338,7 +338,7 @@ def example_source_link_text_all_ok(sphinx_base_dir: Path): def example_test_link_text_all_ok(sphinx_base_dir: Path): return { "TREQ_ID_1": [ - DataForTestLink( + DataForTestLink( name="TestRequirementsCoverage__test_system_startup_time", file=Path("src/tests/testfile_2.py"), need="TREQ_ID_1", diff --git a/src/extensions/score_source_code_linker/xml_parser.py b/src/extensions/score_source_code_linker/xml_parser.py index 3d7ba67b..93456971 100644 --- a/src/extensions/score_source_code_linker/xml_parser.py +++ b/src/extensions/score_source_code_linker/xml_parser.py @@ -107,7 +107,7 @@ def read_test_xml_file(file: Path) -> tuple[list[DataOfTestCase], list[str]]: testcasename = testcase.get("name", "") testclassname = testcase.get("classname", "") assert testclassname or testcasename, ( - f"Testcase: {testcase} does not have a 'name' or 'classname' attribute. " + f"Testcase: {testcase} does not have a 'name' or 'classname' attribute." "One of which is mandatory. This should not happen, something is wrong." ) if testclassname: