twister: Skip scanning non-ztest tests in Twister

Twister scans C-files to find testcases that are implemented
using ZTest framework. Also runs scanning of Elf files
after building. Skip scanning files if it is not required.

Signed-off-by: Grzegorz Chwierut <grzegorz.chwierut@nordicsemi.no>
This commit is contained in:
Grzegorz Chwierut 2024-07-15 13:47:45 +02:00 committed by Anas Nashif
parent f3a6454f93
commit 663786d0a4
4 changed files with 29 additions and 17 deletions

View file

@ -660,15 +660,18 @@ class ProjectBuilder(FilterBuilder):
self.instance.add_missing_case_status("blocked", self.instance.reason)
pipeline.put({"op": "report", "test": self.instance})
else:
logger.debug(f"Determine test cases for test instance: {self.instance.name}")
try:
self.determine_testcases(results)
if self.instance.testsuite.harness in ['ztest', 'test']:
logger.debug(f"Determine test cases for test instance: {self.instance.name}")
try:
self.determine_testcases(results)
pipeline.put({"op": "gather_metrics", "test": self.instance})
except BuildError as e:
logger.error(str(e))
self.instance.status = "error"
self.instance.reason = str(e)
pipeline.put({"op": "report", "test": self.instance})
else:
pipeline.put({"op": "gather_metrics", "test": self.instance})
except BuildError as e:
logger.error(str(e))
self.instance.status = "error"
self.instance.reason = str(e)
pipeline.put({"op": "report", "test": self.instance})
elif op == "gather_metrics":
ret = self.gather_metrics(self.instance)

View file

@ -542,12 +542,19 @@ class TestPlan:
try:
parsed_data = TwisterConfigParser(suite_yaml_path, self.suite_schema)
parsed_data.load()
subcases, ztest_suite_names = scan_testsuite_path(suite_path)
subcases = None
ztest_suite_names = None
for name in parsed_data.scenarios.keys():
suite_dict = parsed_data.get_scenario(name)
suite = TestSuite(root, suite_path, name, data=suite_dict, detailed_test_id=self.options.detailed_test_id)
suite.add_subcases(suite_dict, subcases, ztest_suite_names)
if suite.harness in ['ztest', 'test']:
if subcases is None:
# scan it only once per testsuite
subcases, ztest_suite_names = scan_testsuite_path(suite_path)
suite.add_subcases(suite_dict, subcases, ztest_suite_names)
else:
suite.add_subcases(suite_dict)
if testsuite_filter:
scenario = os.path.basename(suite.name)
if suite.name and (suite.name in testsuite_filter or scenario in testsuite_filter):

View file

@ -423,21 +423,22 @@ class TestSuite(DisablePyTestCollectionMixin):
if self.harness == 'console' and not self.harness_config:
raise Exception('Harness config error: console harness defined without a configuration.')
def add_subcases(self, data, parsed_subcases, suite_names):
def add_subcases(self, data, parsed_subcases=None, suite_names=None):
testcases = data.get("testcases", [])
if testcases:
for tc in testcases:
self.add_testcase(name=f"{self.id}.{tc}")
else:
# only add each testcase once
for sub in set(parsed_subcases):
name = "{}.{}".format(self.id, sub)
self.add_testcase(name)
if not parsed_subcases:
self.add_testcase(self.id, freeform=True)
else:
# only add each testcase once
for sub in set(parsed_subcases):
name = "{}.{}".format(self.id, sub)
self.add_testcase(name)
self.ztest_suite_names = suite_names
if suite_names:
self.ztest_suite_names = suite_names
def add_testcase(self, name, freeform=False):
tc = TestCase(name=name, testsuite=self)

View file

@ -1504,6 +1504,7 @@ def test_projectbuilder_process(
instance_mock.run = instance_run
instance_mock.handler = mock.Mock()
instance_mock.handler.ready = instance_handler_ready
instance_mock.testsuite.harness = 'test'
env_mock = mock.Mock()
pb = ProjectBuilder(instance_mock, env_mock, mocked_jobserver)