fix: missing setup/teardown hooks for referenced testcase

This commit is contained in:
debugtalk
2020-06-23 16:27:08 +08:00
parent d1450ba332
commit 1aacc28dd1
8 changed files with 46 additions and 10 deletions

View File

@@ -1,5 +1,11 @@
# Release History # Release History
## 3.1.2 (2020-06-23)
**Fixed**
- fix: missing setup/teardown hooks for referenced testcase
## 3.1.1 (2020-06-23) ## 3.1.1 (2020-06-23)
**Added** **Added**
@@ -8,7 +14,7 @@
**Fixed** **Fixed**
- fix #942: type_match None - fix: ValueError when type_match None
- fix: override referenced testcase export in teststep - fix: override referenced testcase export in teststep
- fix: avoid duplicate import - fix: avoid duplicate import
- fix: override locust weight - fix: override locust weight

View File

@@ -1,4 +1,4 @@
# NOTE: Generated By HttpRunner v3.1.0 # NOTE: Generated By HttpRunner v3.1.2
# FROM: request_methods/request_with_functions.yml # FROM: request_methods/request_with_functions.yml
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase

View File

@@ -13,7 +13,11 @@ teststeps:
variables: variables:
foo1: testcase_ref_bar1 foo1: testcase_ref_bar1
expect_foo1: testcase_ref_bar1 expect_foo1: testcase_ref_bar1
setup_hooks:
- ${sleep(0.1)}
testcase: request_methods/request_with_functions.yml testcase: request_methods/request_with_functions.yml
teardown_hooks:
- ${sleep(0.2)}
export: export:
- foo3 - foo3
- -

View File

@@ -1,4 +1,4 @@
# NOTE: Generated By HttpRunner v3.1.0 # NOTE: Generated By HttpRunner v3.1.2
# FROM: request_methods/request_with_testcase_reference.yml # FROM: request_methods/request_with_testcase_reference.yml
import sys import sys
@@ -33,7 +33,9 @@ class TestCaseRequestWithTestcaseReference(HttpRunner):
.with_variables( .with_variables(
**{"foo1": "testcase_ref_bar1", "expect_foo1": "testcase_ref_bar1"} **{"foo1": "testcase_ref_bar1", "expect_foo1": "testcase_ref_bar1"}
) )
.setup_hook("${sleep(0.1)}")
.call(RequestWithFunctions) .call(RequestWithFunctions)
.teardown_hook("${sleep(0.2)}")
.export(*["foo3"]) .export(*["foo3"])
), ),
Step( Step(

View File

@@ -1,4 +1,4 @@
__version__ = "3.1.1" __version__ = "3.1.2"
__description__ = "One-stop solution for HTTP(S) testing." __description__ = "One-stop solution for HTTP(S) testing."
# import firstly for monkey patch if needed # import firstly for monkey patch if needed

View File

@@ -89,7 +89,7 @@ class HttpRunner(object):
return self return self
def __call_hooks( def __call_hooks(
self, hooks: Hooks, step_variables: VariablesMapping, hook_type: Text, self, hooks: Hooks, step_variables: VariablesMapping, hook_msg: Text,
) -> NoReturn: ) -> NoReturn:
""" call hook actions. """ call hook actions.
@@ -106,10 +106,10 @@ class HttpRunner(object):
request: parsed request dict request: parsed request dict
response: ResponseObject for current response response: ResponseObject for current response
hook_type: setup/teardown hook_msg: setup/teardown request/testcase
""" """
logger.debug(f"call {hook_type} hook actions.") logger.info(f"call hook actions: {hook_msg}")
if not isinstance(hooks, List): if not isinstance(hooks, List):
logger.error(f"Invalid hooks format: {hooks}") logger.error(f"Invalid hooks format: {hooks}")
@@ -153,7 +153,7 @@ class HttpRunner(object):
# setup hooks # setup hooks
if step.setup_hooks: if step.setup_hooks:
self.__call_hooks(step.setup_hooks, step.variables, "setup") self.__call_hooks(step.setup_hooks, step.variables, "setup request")
# prepare arguments # prepare arguments
method = parsed_request_dict.pop("method") method = parsed_request_dict.pop("method")
@@ -169,7 +169,7 @@ class HttpRunner(object):
# teardown hooks # teardown hooks
if step.teardown_hooks: if step.teardown_hooks:
self.__call_hooks(step.teardown_hooks, step.variables, "teardown") self.__call_hooks(step.teardown_hooks, step.variables, "teardown request")
def log_req_resp_details(): def log_req_resp_details():
err_msg = "\n{} DETAILED REQUEST & RESPONSE {}\n".format("*" * 32, "*" * 32) err_msg = "\n{} DETAILED REQUEST & RESPONSE {}\n".format("*" * 32, "*" * 32)
@@ -236,6 +236,10 @@ class HttpRunner(object):
step_variables = step.variables step_variables = step.variables
step_export = step.export step_export = step.export
# setup hooks
if step.setup_hooks:
self.__call_hooks(step.setup_hooks, step_variables, "setup testcase")
if hasattr(step.testcase, "config") and hasattr(step.testcase, "teststeps"): if hasattr(step.testcase, "config") and hasattr(step.testcase, "teststeps"):
testcase_cls = step.testcase testcase_cls = step.testcase
case_result = ( case_result = (
@@ -269,6 +273,10 @@ class HttpRunner(object):
f"Invalid teststep referenced testcase: {step.dict()}" f"Invalid teststep referenced testcase: {step.dict()}"
) )
# teardown hooks
if step.teardown_hooks:
self.__call_hooks(step.teardown_hooks, step.variables, "teardown testcase")
step_data.data = case_result.get_step_datas() # list of step data step_data.data = case_result.get_step_datas() # list of step data
step_data.export_vars = case_result.get_export_variables() step_data.export_vars = case_result.get_export_variables()
step_data.success = case_result.success step_data.success = case_result.success

View File

@@ -350,6 +350,14 @@ class StepRefCase(object):
def __init__(self, step_context: TStep): def __init__(self, step_context: TStep):
self.__step_context = step_context self.__step_context = step_context
def teardown_hook(self, hook: Text, assign_var_name: Text = None) -> "StepRefCase":
if assign_var_name:
self.__step_context.teardown_hooks.append({assign_var_name: hook})
else:
self.__step_context.teardown_hooks.append(hook)
return self
def export(self, *var_name: Text) -> "StepRefCase": def export(self, *var_name: Text) -> "StepRefCase":
self.__step_context.export.extend(var_name) self.__step_context.export.extend(var_name)
return self return self
@@ -366,6 +374,14 @@ class RunTestCase(object):
self.__step_context.variables.update(variables) self.__step_context.variables.update(variables)
return self return self
def setup_hook(self, hook: Text, assign_var_name: Text = None) -> "RunTestCase":
if assign_var_name:
self.__step_context.setup_hooks.append({assign_var_name: hook})
else:
self.__step_context.setup_hooks.append(hook)
return self
def call(self, testcase: Callable) -> StepRefCase: def call(self, testcase: Callable) -> StepRefCase:
self.__step_context.testcase = testcase self.__step_context.testcase = testcase
return StepRefCase(self.__step_context) return StepRefCase(self.__step_context)

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "httprunner" name = "httprunner"
version = "3.1.1" version = "3.1.2"
description = "One-stop solution for HTTP(S) testing." description = "One-stop solution for HTTP(S) testing."
license = "Apache-2.0" license = "Apache-2.0"
readme = "README.md" readme = "README.md"