Skip to content

Commit 049b243

Browse files
nashifmmahadevan108
authored andcommitted
twister: stats: use anytree to create summary
Do not create the tree structure manually, use anytree instead. Signed-off-by: Anas Nashif <[email protected]>
1 parent a43a67e commit 049b243

File tree

2 files changed

+54
-58
lines changed

2 files changed

+54
-58
lines changed

scripts/pylib/twister/twisterlib/runner.py

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
logger = logging.getLogger('twister')
5858
logger.setLevel(logging.DEBUG)
5959
import expr_parser
60+
from anytree import Node, RenderTree
6061

6162

6263
class ExecutionCounter(object):
@@ -146,44 +147,42 @@ def _find_number_length(n):
146147

147148
def summary(self):
148149
selected_cases = self.cases - self.filtered_cases
149-
completed_configs = self.done - self.filtered_static - self.filtered_runtime
150-
151-
# Find alignment length for aesthetic printing
152-
suites_n_length = self._find_number_length(self.total if self.total > self.done else self.done)
153-
completed_suites_n_length = self._find_number_length(completed_configs)
154-
filtered_suites_n_length = self._find_number_length(self.filtered_configs)
155-
total_cases_n_length = self._find_number_length(self.cases)
156-
selected_cases_n_length = self._find_number_length(selected_cases)
157-
158-
print("--------------------------------------------------")
159-
print(f"{'Total test suites: ':<23}{self.total:>{suites_n_length}}") # actually test instances
160-
print(f"{'Processed test suites: ':<23}{self.done:>{suites_n_length}}")
161-
print(f"└─{'Filtered test suites: ':<21}{self.filtered_configs}")
162-
print(f" ├─ {'Filtered test suites (static): ':<37}{self.filtered_static:>{filtered_suites_n_length}}")
163-
print(f" └─ {'Filtered test suites (at runtime): ':<37}{self.filtered_runtime:>{filtered_suites_n_length}}")
164-
print(f"└─ {'Selected test suites: ':<37}{completed_configs:>{completed_suites_n_length}}")
165-
print(f" ├─ {'Skipped test suites: ':<37}{self.skipped:>{completed_suites_n_length}}")
166-
print(f" ├─ {'Passed test suites: ':<37}{self.passed:>{completed_suites_n_length}}")
167-
print(f" ├─ {'Built only test suites: ':<37}{self.notrun:>{completed_suites_n_length}}")
168-
print(f" ├─ {'Failed test suites: ':<37}{self.failed:>{completed_suites_n_length}}")
169-
print(f" └─ {'Errors in test suites: ':<37}{self.error:>{completed_suites_n_length}}")
170-
print("---------------------- ----------------------")
171-
print(f"{'Total test cases: ':<18}{self.cases}")
172-
print(f"├─ {'Filtered test cases: ':<21}{self.filtered_cases:>{total_cases_n_length}}")
173-
print(f"└─ {'Selected test cases: ':<21}{selected_cases:>{total_cases_n_length}}")
174-
print(f" ├─ {'Passed test cases: ':<25}{self.passed_cases:>{selected_cases_n_length}}")
175-
print(f" ├─ {'Skipped test cases: ':<25}{self.skipped_cases:>{total_cases_n_length}}")
176-
print(f" ├─ {'Built only test cases: ':<25}{self.notrun_cases:>{selected_cases_n_length}}")
177-
print(f" ├─ {'Blocked test cases: ':<25}{self.blocked_cases:>{selected_cases_n_length}}")
178-
print(f" ├─ {'Failed test cases: ':<25}{self.failed_cases:>{selected_cases_n_length}}")
179-
print(f" {'├' if self.none_cases or self.started_cases else '└'}{'Errors in test cases: ':<25}{self.error_cases:>{selected_cases_n_length}}")
150+
selected_configs = self.done - self.filtered_static - self.filtered_runtime
151+
152+
153+
root = Node("Summary")
154+
155+
Node(f"Total test suites: {self.total}", parent=root)
156+
processed_suites = Node(f"Processed test suites: {self.done}", parent=root)
157+
filtered_suites = Node(f"Filtered test suites: {self.filtered_configs}", parent=processed_suites)
158+
Node(f"Filtered test suites (static): {self.filtered_static}", parent=filtered_suites)
159+
Node(f"Filtered test suites (at runtime): {self.filtered_runtime}", parent=filtered_suites)
160+
selected_suites = Node(f"Selected test suites: {selected_configs}", parent=processed_suites)
161+
Node(f"Skipped test suites: {self.skipped}", parent=selected_suites)
162+
Node(f"Passed test suites: {self.passed}", parent=selected_suites)
163+
Node(f"Built only test suites: {self.notrun}", parent=selected_suites)
164+
Node(f"Failed test suites: {self.failed}", parent=selected_suites)
165+
Node(f"Errors in test suites: {self.error}", parent=selected_suites)
166+
167+
total_cases = Node(f"Total test cases: {self.cases}", parent=root)
168+
Node(f"Filtered test cases: {self.filtered_cases}", parent=total_cases)
169+
selected_cases_node = Node(f"Selected test cases: {selected_cases}", parent=total_cases)
170+
Node(f"Passed test cases: {self.passed_cases}", parent=selected_cases_node)
171+
Node(f"Skipped test cases: {self.skipped_cases}", parent=selected_cases_node)
172+
Node(f"Built only test cases: {self.notrun_cases}", parent=selected_cases_node)
173+
Node(f"Blocked test cases: {self.blocked_cases}", parent=selected_cases_node)
174+
Node(f"Failed test cases: {self.failed_cases}", parent=selected_cases_node)
175+
error_cases_node = Node(f"Errors in test cases: {self.error_cases}", parent=selected_cases_node)
176+
180177
if self.none_cases or self.started_cases:
181-
print(f" ├──── The following test case statuses should not appear in a proper execution ───")
178+
Node("The following test case statuses should not appear in a proper execution", parent=error_cases_node)
182179
if self.none_cases:
183-
print(f" {'├' if self.started_cases else '└'}{'Statusless test cases: ':<25}{self.none_cases:>{selected_cases_n_length}}")
180+
Node(f"Statusless test cases: {self.none_cases}", parent=error_cases_node)
184181
if self.started_cases:
185-
print(f" └─ {'Test cases only started: ':<25}{self.started_cases:>{selected_cases_n_length}}")
186-
print("--------------------------------------------------")
182+
Node(f"Test cases only started: {self.started_cases}", parent=error_cases_node)
183+
184+
for pre, _, node in RenderTree(root):
185+
print("%s%s" % (pre, node.name))
187186

188187
@property
189188
def warnings(self):

scripts/tests/twister/test_runner.py

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -206,29 +206,26 @@ def test_executioncounter(capfd):
206206
sys.stderr.write(err)
207207

208208
assert (
209-
'--------------------------------------------------\n'
210-
'Total test suites: 12\n'
211-
'Processed test suites: 9\n'
212-
'└─Filtered test suites: 3\n'
213-
' ├─ Filtered test suites (static): 2\n'
214-
' └─ Filtered test suites (at runtime): 1\n'
215-
'└─ Selected test suites: 6\n'
216-
' ├─ Skipped test suites: 0\n'
217-
' ├─ Passed test suites: 6\n'
218-
' ├─ Built only test suites: 0\n'
219-
' ├─ Failed test suites: 1\n'
220-
' └─ Errors in test suites: 2\n'
221-
'---------------------- ----------------------\n'
222-
'Total test cases: 25\n'
223-
'├─ Filtered test cases: 0\n'
224-
'└─ Selected test cases: 25\n'
225-
' ├─ Passed test cases: 0\n'
226-
' ├─ Skipped test cases: 6\n'
227-
' ├─ Built only test cases: 0\n'
228-
' ├─ Blocked test cases: 0\n'
229-
' ├─ Failed test cases: 0\n'
230-
' └─ Errors in test cases: 0\n'
231-
'--------------------------------------------------\n'
209+
"├── Total test suites: 12\n"
210+
"├── Processed test suites: 9\n"
211+
"│ ├── Filtered test suites: 3\n"
212+
"│ │ ├── Filtered test suites (static): 2\n"
213+
"│ │ └── Filtered test suites (at runtime): 1\n"
214+
"│ └── Selected test suites: 6\n"
215+
"│ ├── Skipped test suites: 0\n"
216+
"│ ├── Passed test suites: 6\n"
217+
"│ ├── Built only test suites: 0\n"
218+
"│ ├── Failed test suites: 1\n"
219+
"│ └── Errors in test suites: 2\n"
220+
"└── Total test cases: 25\n"
221+
" ├── Filtered test cases: 0\n"
222+
" └── Selected test cases: 25\n"
223+
" ├── Passed test cases: 0\n"
224+
" ├── Skipped test cases: 6\n"
225+
" ├── Built only test cases: 0\n"
226+
" ├── Blocked test cases: 0\n"
227+
" ├── Failed test cases: 0\n"
228+
" └── Errors in test cases: 0\n"
232229
) in out
233230

234231
assert ec.cases == 25

0 commit comments

Comments
 (0)