From f6714aff03c5bdbf030f7d7633c0bdf58f7bb5a1 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Wed, 22 Apr 2020 23:26:09 +0800 Subject: [PATCH] refactor: adjust summary data structure --- httprunner/report/html/result.py | 15 +++++----- httprunner/report/stringify.py | 5 ++-- httprunner/report/summarize.py | 17 ++++-------- httprunner/v3/api.py | 47 ++++++++++++++++++++++++-------- httprunner/v3/api_test.py | 3 +- httprunner/v3/schema.py | 35 +++++++----------------- 6 files changed, 62 insertions(+), 60 deletions(-) diff --git a/httprunner/report/html/result.py b/httprunner/report/html/result.py index 9cb16ab3..40cd3547 100644 --- a/httprunner/report/html/result.py +++ b/httprunner/report/html/result.py @@ -3,8 +3,6 @@ import unittest from loguru import logger -from httprunner.v3.schema import Record - class HtmlTestResult(unittest.TextTestResult): """ A html result class that can generate formatted html results, used by TextTestRunner. @@ -12,13 +10,16 @@ class HtmlTestResult(unittest.TextTestResult): """ def __init__(self, stream, descriptions, verbosity): super(HtmlTestResult, self).__init__(stream, descriptions, verbosity) - self.record = Record() + self.name = "" + self.status = "" + self.attachment = "" + self.meta_datas = None def _record_test(self, test, status, attachment=''): - self.record.name = test.shortDescription() - self.record.status = status - self.record.attachment = attachment - self.record.meta_datas = test.meta_datas + self.name = test.shortDescription() + self.status = status + self.attachment = attachment + self.meta_datas = test.meta_datas def startTestRun(self): self.start_at = time.time() diff --git a/httprunner/report/stringify.py b/httprunner/report/stringify.py index f0a28c7d..7adbdd8e 100644 --- a/httprunner/report/stringify.py +++ b/httprunner/report/stringify.py @@ -206,7 +206,6 @@ def stringify_summary(testsuite_summary: TestSuiteSummary): if not testcase_summary.name: testcase_summary.name = f"testcase {index}" - record = testcase_summary.record - meta_datas = record.meta_datas + meta_datas = testcase_summary.meta_datas __stringify_meta_datas(meta_datas) - record.response_time = __get_total_response_time(meta_datas) + testcase_summary.total_response_time = __get_total_response_time(meta_datas) diff --git a/httprunner/report/summarize.py b/httprunner/report/summarize.py index a8845fe9..2d9d14fd 100644 --- a/httprunner/report/summarize.py +++ b/httprunner/report/summarize.py @@ -2,7 +2,7 @@ import platform from httprunner import __version__ from httprunner.report.html.result import HtmlTestResult -from httprunner.v3.schema import TestCaseSummary, TestCaseStat, TestCaseTime, TestCaseInOut +from httprunner.v3.schema import TestCaseSummary, TestCaseTime, TestCaseInOut def get_platform(): @@ -59,18 +59,13 @@ def get_summary(result: HtmlTestResult) -> TestCaseSummary: """ return TestCaseSummary( success=result.wasSuccessful(), - stat=TestCaseStat( - total=result.testsRun, - failures=len(result.failures), - errors=len(result.errors), - skipped=len(result.skipped), - expectedFailures=len(result.expectedFailures), - unexpectedSuccesses=len(result.unexpectedSuccesses) - ), time=TestCaseTime( start_at=result.start_at, duration=result.duration ), - record=result.record, - in_out=TestCaseInOut() + name=result.name, + status=result.status, + attachment=result.attachment, + in_out=TestCaseInOut(), + meta_datas=result.meta_datas ) diff --git a/httprunner/v3/api.py b/httprunner/v3/api.py index b7a11d63..a31e4024 100644 --- a/httprunner/v3/api.py +++ b/httprunner/v3/api.py @@ -108,7 +108,6 @@ class HttpRunner(object): result = self.unittest_runner.run(testcase) testcase_summary = report.get_summary(result) - testcase_summary.name = testcase.config.name testcase_summary.in_out.vars = testcase.config.variables testcase_summary.in_out.out = testcase.config.export @@ -136,12 +135,9 @@ class HttpRunner(object): testsuite_summary = { "success": True, "stat": { - "testcases": { - "total": len(tests_results), - "success": 0, - "fail": 0 - }, - "teststeps": {} + "total": len(tests_results), + "success": 0, + "fail": 0 }, "time": {}, "platform": report.get_platform(), @@ -150,13 +146,11 @@ class HttpRunner(object): for testcase_summary in tests_results: if testcase_summary.success: - testsuite_summary["stat"]["testcases"]["success"] += 1 + testsuite_summary["stat"]["success"] += 1 else: - testsuite_summary["stat"]["testcases"]["fail"] += 1 + testsuite_summary["stat"]["fail"] += 1 testsuite_summary["success"] &= testcase_summary.success - - report.aggregate_stat(testsuite_summary["stat"]["teststeps"], testcase_summary.stat.dict()) report.aggregate_stat(testsuite_summary["time"], testcase_summary.time.dict()) testsuite_summary["details"].append(testcase_summary) @@ -197,7 +191,7 @@ class HttpRunner(object): utils.prepare_log_file_abs_path(self.test_path, "summary.json") ) # save variables and export data - vars_out = self.get_vars_out() # TODO + vars_out = self.get_vars_out() utils.dump_json_file( vars_out, utils.prepare_log_file_abs_path(self.test_path, "io.json") @@ -205,6 +199,35 @@ class HttpRunner(object): return self._summary + def get_vars_out(self): + """ get variables and output + Returns: + list: list of variables and output. + if tests are parameterized, list items are corresponded to parameters. + + [ + { + "in": { + "user1": "leo" + }, + "out": { + "out1": "out_value_1" + } + }, + {...} + ] + + None: returns None if tests not started or finished or corrupted. + + """ + if not self._summary: + return None + + return [ + testcase_summary.in_out.dict() + for testcase_summary in self._summary.details + ] + def run_path(self, path, dot_env_path=None, mapping=None) -> TestSuiteSummary: """ run testcase/testsuite file or folder. diff --git a/httprunner/v3/api_test.py b/httprunner/v3/api_test.py index 1ac1ad25..8a377bb8 100644 --- a/httprunner/v3/api_test.py +++ b/httprunner/v3/api_test.py @@ -12,6 +12,5 @@ class TestHttpRunner(unittest.TestCase): summary = self.runner.run_path("examples/postman_echo/request_methods/") self.assertTrue(summary.success) self.assertEqual(summary.details[0].name, "request methods testcase with variables") - self.assertEqual(summary.details[0].record.name, "request methods testcase with variables") - self.assertEqual(summary.stat.testcases["total"], 1) + self.assertGreater(summary.stat.total, 1) # self.assertEqual(summary.stat.teststeps["total"], 2) diff --git a/httprunner/v3/schema.py b/httprunner/v3/schema.py index 4a0c393b..b52dcff5 100644 --- a/httprunner/v3/schema.py +++ b/httprunner/v3/schema.py @@ -82,27 +82,12 @@ class TestsMapping(BaseModel): testcases: List[TestCase] -class Stat(BaseModel): - testcases: Dict - teststeps: Dict - - class TestCaseTime(BaseModel): start_at: float duration: float start_datetime: Text = "" -class TestCaseStat(BaseModel): - total: int = 0 - successes: int = 0 - failures: int = 0 - errors: int = 0 - skipped: int = 0 - expectedFailures: int = 0 - unexpectedSuccesses: int = 0 - - class TestCaseInOut(BaseModel): vars: VariablesMapping = {} out: Export = [] @@ -121,22 +106,16 @@ class MetaData(BaseModel): validators: Dict = {} -class Record(BaseModel): - name: Text = "" - status: Text = "" - attachment: Text = "" - meta_datas: List[MetaData] = [] - response_time: Text = "N/A" - - class TestCaseSummary(BaseModel): name: Text = "" success: bool - stat: TestCaseStat + status: Text = "" + attachment: Text = "" time: TestCaseTime - record: Record = {} in_out: TestCaseInOut = {} log: Text = "" + meta_datas: List[MetaData] = [] + total_response_time: Text = "N/A" class PlatformInfo(BaseModel): @@ -145,6 +124,12 @@ class PlatformInfo(BaseModel): platform: Text +class Stat(BaseModel): + total: int = 0 + success: int = 0 + fail: int = 0 + + class TestSuiteSummary(BaseModel): success: bool stat: Stat