refactor: adjust summary data structure

This commit is contained in:
debugtalk
2020-04-22 23:26:09 +08:00
parent f423437c0b
commit f6714aff03
6 changed files with 62 additions and 60 deletions

View File

@@ -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()

View File

@@ -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)

View File

@@ -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
)

View File

@@ -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.

View File

@@ -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)

View File

@@ -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