diff options
author | Aníbal Limón <anibal.limon@linux.intel.com> | 2017-05-26 15:37:45 -0500 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-06-02 13:36:14 +0100 |
commit | c746ee11eca0f09d71e23986fb77392777e255cd (patch) | |
tree | 3a55b1f77d403e0792456e91f5aae1d6a9876eca | |
parent | 49223c47fc20ed4215cf82831a07dae6a1793dd0 (diff) | |
download | poky-c746ee11eca0f09d71e23986fb77392777e255cd.tar.gz |
oeqa/core: Add support for run tests by module, class and name
This will enable only run certain module tests and filter by
class and test name.
(From OE-Core rev: 0f7531803aa6ffef2b7c5be9acee3efe7d2974ef)
Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/lib/oeqa/core/context.py | 6 | ||||
-rw-r--r-- | meta/lib/oeqa/core/loader.py | 66 |
2 files changed, 68 insertions, 4 deletions
diff --git a/meta/lib/oeqa/core/context.py b/meta/lib/oeqa/core/context.py index bc958d0dfe..28ae017090 100644 --- a/meta/lib/oeqa/core/context.py +++ b/meta/lib/oeqa/core/context.py | |||
@@ -85,9 +85,9 @@ class OETestContextExecutor(object): | |||
85 | help="results output log, default: %s" % self.default_output_log) | 85 | help="results output log, default: %s" % self.default_output_log) |
86 | 86 | ||
87 | group = self.parser.add_mutually_exclusive_group() | 87 | group = self.parser.add_mutually_exclusive_group() |
88 | group.add_argument('--run-tests', action='store', | 88 | group.add_argument('--run-tests', action='store', nargs='+', |
89 | default=self.default_tests, | 89 | default=self.default_tests, |
90 | help="tests to run in <module>[.<class>[.<name>]] format. Just works for modules now") | 90 | help="tests to run in <module>[.<class>[.<name>]]") |
91 | group.add_argument('--list-tests', action='store', | 91 | group.add_argument('--list-tests', action='store', |
92 | choices=('module', 'class', 'name'), | 92 | choices=('module', 'class', 'name'), |
93 | help="lists available tests") | 93 | help="lists available tests") |
@@ -136,7 +136,7 @@ class OETestContextExecutor(object): | |||
136 | self.tc_kwargs['init']['td'] = {} | 136 | self.tc_kwargs['init']['td'] = {} |
137 | 137 | ||
138 | if args.run_tests: | 138 | if args.run_tests: |
139 | self.tc_kwargs['load']['modules'] = args.run_tests.split() | 139 | self.tc_kwargs['load']['modules'] = args.run_tests |
140 | else: | 140 | else: |
141 | self.tc_kwargs['load']['modules'] = None | 141 | self.tc_kwargs['load']['modules'] = None |
142 | 142 | ||
diff --git a/meta/lib/oeqa/core/loader.py b/meta/lib/oeqa/core/loader.py index 63a1703536..bffb2dac8d 100644 --- a/meta/lib/oeqa/core/loader.py +++ b/meta/lib/oeqa/core/loader.py | |||
@@ -29,6 +29,51 @@ def _find_duplicated_modules(suite, directory): | |||
29 | if path: | 29 | if path: |
30 | raise ImportError("Duplicated %s module found in %s" % (module, path)) | 30 | raise ImportError("Duplicated %s module found in %s" % (module, path)) |
31 | 31 | ||
32 | def _built_modules_dict(modules): | ||
33 | modules_dict = {} | ||
34 | |||
35 | if modules == None: | ||
36 | return modules_dict | ||
37 | |||
38 | for m in modules: | ||
39 | ms = m.split('.') | ||
40 | |||
41 | if len(ms) == 1: | ||
42 | module_name = ms[0] | ||
43 | if not module_name in modules_dict: | ||
44 | modules_dict[module_name] = {} | ||
45 | elif len(ms) == 2: | ||
46 | module_name = ms[0] | ||
47 | class_name = ms[1] | ||
48 | if not module_name in modules_dict: | ||
49 | modules_dict[module_name] = {} | ||
50 | if not class_name in modules_dict[module_name]: | ||
51 | modules_dict[module_name][class_name] = [] | ||
52 | elif len(ms) == 3: | ||
53 | module_name = ms[0] | ||
54 | class_name = ms[1] | ||
55 | test_name = ms[2] | ||
56 | |||
57 | if not module_name in modules_dict: | ||
58 | modules_dict[module_name] = {} | ||
59 | if not class_name in modules_dict[module_name]: | ||
60 | modules_dict[module_name][class_name] = [] | ||
61 | if not test_name in modules_dict[module_name][class_name]: | ||
62 | modules_dict[module_name][class_name].append(test_name) | ||
63 | elif len(ms) >= 4: | ||
64 | module_name = '.'.join(ms[0:-2]) | ||
65 | class_name = ms[-2] | ||
66 | test_name = ms[-1] | ||
67 | |||
68 | if not module_name in modules_dict: | ||
69 | modules_dict[module_name] = {} | ||
70 | if not class_name in modules_dict[module_name]: | ||
71 | modules_dict[module_name][class_name] = [] | ||
72 | if not test_name in modules_dict[module_name][class_name]: | ||
73 | modules_dict[module_name][class_name].append(test_name) | ||
74 | |||
75 | return modules_dict | ||
76 | |||
32 | class OETestLoader(unittest.TestLoader): | 77 | class OETestLoader(unittest.TestLoader): |
33 | caseClass = OETestCase | 78 | caseClass = OETestCase |
34 | 79 | ||
@@ -39,7 +84,8 @@ class OETestLoader(unittest.TestLoader): | |||
39 | filters, *args, **kwargs): | 84 | filters, *args, **kwargs): |
40 | self.tc = tc | 85 | self.tc = tc |
41 | 86 | ||
42 | self.modules = modules | 87 | self.modules = _built_modules_dict(modules) |
88 | |||
43 | self.tests = tests | 89 | self.tests = tests |
44 | self.modules_required = modules_required | 90 | self.modules_required = modules_required |
45 | 91 | ||
@@ -116,6 +162,24 @@ class OETestLoader(unittest.TestLoader): | |||
116 | """ | 162 | """ |
117 | Returns True if test case must be filtered, False otherwise. | 163 | Returns True if test case must be filtered, False otherwise. |
118 | """ | 164 | """ |
165 | # Filters by module.class.name | ||
166 | module_name = case.__module__ | ||
167 | class_name = case.__class__.__name__ | ||
168 | test_name = case._testMethodName | ||
169 | |||
170 | if self.modules: | ||
171 | if not module_name in self.modules: | ||
172 | return True | ||
173 | |||
174 | if self.modules[module_name]: | ||
175 | if not class_name in self.modules[module_name]: | ||
176 | return True | ||
177 | |||
178 | if self.modules[module_name][class_name]: | ||
179 | if test_name not in self.modules[module_name][class_name]: | ||
180 | return True | ||
181 | |||
182 | # Decorator filters | ||
119 | if self.filters: | 183 | if self.filters: |
120 | filters = self.filters.copy() | 184 | filters = self.filters.copy() |
121 | case_decorators = [cd for cd in case.decorators | 185 | case_decorators = [cd for cd in case.decorators |