<div dir="ltr"><div dir="ltr">You are missing type annotations throughout this. <br><br>On Mon, Nov 14, 2022 at 11:54 AM Juraj Linkeš <juraj.linkes@pantheon.tech> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Provide a summary of testcase passed/failed/blocked counts.<br>
<br>
Signed-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech><br>
---<br>
 dts/framework/dts.py            |  3 ++<br>
 dts/framework/stats_reporter.py | 65 +++++++++++++++++++++++++++++++++<br>
 2 files changed, 68 insertions(+)<br>
 create mode 100644 dts/framework/stats_reporter.py<br>
<br>
diff --git a/dts/framework/dts.py b/dts/framework/dts.py<br>
index d606f8de2e..a7c243a5c3 100644<br>
--- a/dts/framework/dts.py<br>
+++ b/dts/framework/dts.py<br>
@@ -14,11 +14,13 @@<br>
 from .exception import DTSError, ReturnCode<br>
 from .logger import DTSLOG, getLogger<br>
 from .settings import SETTINGS<br>
+from .stats_reporter import TestStats<br>
 from .test_result import Result<br>
 from .utils import check_dts_python_version<br>
<br>
 dts_logger: DTSLOG = getLogger("dts")<br>
 result: Result = Result()<br>
+test_stats: TestStats = TestStats(SETTINGS.output_dir + "/statistics.txt")<br>
<br>
<br>
 def run_all() -> None:<br>
@@ -29,6 +31,7 @@ def run_all() -> None:<br>
     return_code = ReturnCode.NO_ERR<br>
     global dts_logger<br>
     global result<br>
+    global test_stats<br>
<br>
     # check the python version of the server that run dts<br>
     check_dts_python_version()<br>
diff --git a/dts/framework/stats_reporter.py b/dts/framework/stats_reporter.py<br>
new file mode 100644<br>
index 0000000000..a2735d0a1d<br>
--- /dev/null<br>
+++ b/dts/framework/stats_reporter.py<br>
@@ -0,0 +1,65 @@<br>
+# SPDX-License-Identifier: BSD-3-Clause<br>
+# Copyright(c) 2010-2014 Intel Corporation<br>
+# Copyright(c) 2022 PANTHEON.tech s.r.o.<br>
+<br>
+"""<br>
+Simple text file statistics generator<br>
+"""<br>
+<br>
+<br>
+class TestStats(object):<br>
+    """<br>
+    Generates a small statistics file containing the number of passing,<br>
+    failing and blocked tests. It makes use of a Result instance as input.<br>
+    """<br>
+<br>
+    def __init__(self, filename):<br>
+        self.filename = filename<br>
+<br>
+    def __add_stat(self, test_result): </blockquote><div><br>I think that this should probably be an option of an enum that gets matched over. ex:<br><br>match test_result:</div><div>    case None:<br>        pass<br>    case PASSED:</div><div>        self.passed += 1<br>    case FAILED:<br>        self.failed += 1<br>    case BLOCKED:<br>        self.blocked <a class="gmail_plusreply" id="plusReplyChip-2">+= 1<br></a>    case unknown:<br>        # log this and throw an error. <br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+        if test_result is not None:<br>
+            if test_result[0] == "PASSED":<br>
+                self.passed += 1<br>
+            if test_result[0] == "FAILED":<br>
+                self.failed += 1<br>
+            if test_result[0] == "BLOCKED":<br>
+                self.blocked += 1<br>
+            self.total += 1<br>
+<br>
+    def __count_stats(self):<br>
+        for sut in self.result.all_suts():<br>
+            for target in self.result.all_targets(sut):<br>
+                for suite in self.result.all_test_suites(sut, target):<br>
+                    for case in self.result.all_test_cases(sut, target, suite):<br>
+                        test_result = self.result.result_for(sut, target, suite, case)<br>
+                        if len(test_result):<br>
+                            self.__add_stat(test_result)<br>
+<br>
+    def __write_stats(self):<br>
+        sut_nodes = self.result.all_suts()<br>
+        if len(sut_nodes) == 1:<br>
+            self.stats_file.write(<br>
+                f"dpdk_version = {self.result.current_dpdk_version(sut_nodes[0])}\n"<br>
+            )<br>
+        else:<br>
+            for sut in sut_nodes:<br>
+                dpdk_version = self.result.current_dpdk_version(sut)<br>
+                self.stats_file.write(f"{sut}.dpdk_version = {dpdk_version}\n")<br>
+        self.__count_stats()<br>
+        self.stats_file.write(f"Passed     = {self.passed}\n")<br>
+        self.stats_file.write(f"Failed     = {self.failed}\n")<br>
+        self.stats_file.write(f"Blocked    = {self.blocked}\n")<br>
+        rate = 0<br>
+        if self.total > 0:<br>
+            rate = self.passed * 100.0 / self.total<br>
+        self.stats_file.write(f"Pass rate  = {rate:.1f}\n")<br>
+<br>
+    def save(self, result):<br>
+        self.passed = 0<br>
+        self.failed = 0<br>
+        self.blocked = 0<br>
+        self.total = 0<br>
+        self.stats_file = open(self.filename, "w+")<br>
+        self.result = result<br>
+        self.__write_stats()<br>
+        self.stats_file.close()<br>
-- <br>
2.30.2<br>
<br>
</blockquote></div></div>