mirror of
https://github.com/httprunner/httprunner.git
synced 2026-05-26 10:50:12 +08:00
refactor: add argument typing
This commit is contained in:
@@ -1,11 +1,11 @@
|
|||||||
import ast
|
import ast
|
||||||
import builtins
|
import builtins
|
||||||
import re
|
import re
|
||||||
from typing import Any, Set, Text, Callable, Tuple, List, Dict, Union
|
from typing import Any, Set, Text, Callable, List, Dict
|
||||||
|
|
||||||
from httprunner import loader, utils
|
from httprunner import loader, utils
|
||||||
from httprunner.v3 import exceptions
|
from httprunner.v3 import exceptions
|
||||||
from httprunner.v3.exceptions import VariableNotFound, FunctionNotFound
|
from httprunner.v3.schema import VariablesMapping, FunctionsMapping
|
||||||
|
|
||||||
absolute_http_url_regexp = re.compile(r"^https?://", re.I)
|
absolute_http_url_regexp = re.compile(r"^https?://", re.I)
|
||||||
|
|
||||||
@@ -130,7 +130,7 @@ def extract_variables(content: Any) -> Set:
|
|||||||
return set()
|
return set()
|
||||||
|
|
||||||
|
|
||||||
def parse_function_params(params):
|
def parse_function_params(params: Text) -> Dict:
|
||||||
""" parse function params to args and kwargs.
|
""" parse function params to args and kwargs.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@@ -182,7 +182,7 @@ def parse_function_params(params):
|
|||||||
return function_meta
|
return function_meta
|
||||||
|
|
||||||
|
|
||||||
def get_mapping_variable(variable_name: Text, variables_mapping: Dict[Text, Any]) -> Any:
|
def get_mapping_variable(variable_name: Text, variables_mapping: VariablesMapping) -> Any:
|
||||||
""" get variable from variables_mapping.
|
""" get variable from variables_mapping.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@@ -203,7 +203,7 @@ def get_mapping_variable(variable_name: Text, variables_mapping: Dict[Text, Any]
|
|||||||
raise exceptions.VariableNotFound(f"{variable_name} not found in {variables_mapping}")
|
raise exceptions.VariableNotFound(f"{variable_name} not found in {variables_mapping}")
|
||||||
|
|
||||||
|
|
||||||
def get_mapping_function(function_name: Text, functions_mapping: Dict[Text, Callable]) -> Callable:
|
def get_mapping_function(function_name: Text, functions_mapping: FunctionsMapping) -> Callable:
|
||||||
""" get function from functions_mapping,
|
""" get function from functions_mapping,
|
||||||
if not found, then try to check if builtin function.
|
if not found, then try to check if builtin function.
|
||||||
|
|
||||||
@@ -250,8 +250,8 @@ def get_mapping_function(function_name: Text, functions_mapping: Dict[Text, Call
|
|||||||
|
|
||||||
def parse_string(
|
def parse_string(
|
||||||
raw_string: Text,
|
raw_string: Text,
|
||||||
variables_mapping: Dict[Text, Any],
|
variables_mapping: VariablesMapping,
|
||||||
functions_mapping: Dict[Text, Callable]) -> Any:
|
functions_mapping: FunctionsMapping) -> Any:
|
||||||
""" parse string content with variables and functions mapping.
|
""" parse string content with variables and functions mapping.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@@ -346,8 +346,8 @@ def parse_string(
|
|||||||
|
|
||||||
def parse_data(
|
def parse_data(
|
||||||
raw_data: Any,
|
raw_data: Any,
|
||||||
variables_mapping: Dict[Text, Any] = None,
|
variables_mapping: VariablesMapping = None,
|
||||||
functions_mapping: Dict[Text, Callable] = None) -> Any:
|
functions_mapping: FunctionsMapping = None) -> Any:
|
||||||
""" parse raw data with evaluated variables mapping.
|
""" parse raw data with evaluated variables mapping.
|
||||||
Notice: variables_mapping should not contain any variable or function.
|
Notice: variables_mapping should not contain any variable or function.
|
||||||
"""
|
"""
|
||||||
@@ -379,10 +379,10 @@ def parse_data(
|
|||||||
|
|
||||||
|
|
||||||
def parse_variables_mapping(
|
def parse_variables_mapping(
|
||||||
variables_mapping: Dict[Text, Any],
|
variables_mapping: VariablesMapping,
|
||||||
functions_mapping: Dict[Text, Callable] = None) -> Dict[Text, Any]:
|
functions_mapping: FunctionsMapping = None) -> VariablesMapping:
|
||||||
|
|
||||||
parsed_variables: Dict[Text, Any] = {}
|
parsed_variables: VariablesMapping = {}
|
||||||
|
|
||||||
while len(parsed_variables) != len(variables_mapping):
|
while len(parsed_variables) != len(variables_mapping):
|
||||||
for var_name in variables_mapping:
|
for var_name in variables_mapping:
|
||||||
@@ -409,12 +409,12 @@ def parse_variables_mapping(
|
|||||||
if not_defined_variables:
|
if not_defined_variables:
|
||||||
# e.g. {"varA": "123$varB", "varB": "456$varC"}
|
# e.g. {"varA": "123$varB", "varB": "456$varC"}
|
||||||
# e.g. {"varC": "${sum_two($a, $b)}"}
|
# e.g. {"varC": "${sum_two($a, $b)}"}
|
||||||
raise VariableNotFound(not_defined_variables)
|
raise exceptions.VariableNotFound(not_defined_variables)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
parsed_value = parse_data(
|
parsed_value = parse_data(
|
||||||
var_value, parsed_variables, functions_mapping)
|
var_value, parsed_variables, functions_mapping)
|
||||||
except VariableNotFound:
|
except exceptions.VariableNotFound:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
parsed_variables[var_name] = parsed_value
|
parsed_variables[var_name] = parsed_value
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from loguru import logger
|
|||||||
|
|
||||||
from httprunner.v3.parser import build_url, parse_data, parse_variables_mapping
|
from httprunner.v3.parser import build_url, parse_data, parse_variables_mapping
|
||||||
from httprunner.v3.response import ResponseObject
|
from httprunner.v3.response import ResponseObject
|
||||||
from httprunner.v3.schema import TestsConfig, TestStep
|
from httprunner.v3.schema import TestsConfig, TestStep, VariablesMapping
|
||||||
|
|
||||||
|
|
||||||
class TestCaseRunner(object):
|
class TestCaseRunner(object):
|
||||||
@@ -18,11 +18,11 @@ class TestCaseRunner(object):
|
|||||||
self.session = s
|
self.session = s
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def with_variables(self, **variables) -> "TestCaseRunner":
|
def with_variables(self, **variables: VariablesMapping) -> "TestCaseRunner":
|
||||||
self.config.variables.update(variables)
|
self.config.variables.update(variables)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def run_step(self, step):
|
def run_step(self, step: TestStep):
|
||||||
logger.info(f"run step: {step.name}")
|
logger.info(f"run step: {step.name}")
|
||||||
|
|
||||||
# parse
|
# parse
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ from pydantic import HttpUrl
|
|||||||
Name = Text
|
Name = Text
|
||||||
Url = Text
|
Url = Text
|
||||||
BaseUrl = Union[HttpUrl, Text]
|
BaseUrl = Union[HttpUrl, Text]
|
||||||
Variables = Dict[Text, Any]
|
VariablesMapping = Dict[Text, Any]
|
||||||
|
FunctionsMapping = Dict[Text, Callable]
|
||||||
Headers = Dict[Text, Text]
|
Headers = Dict[Text, Text]
|
||||||
Verify = bool
|
Verify = bool
|
||||||
Hook = List[Text]
|
Hook = List[Text]
|
||||||
@@ -33,8 +34,8 @@ class TestsConfig(BaseModel):
|
|||||||
name: Name
|
name: Name
|
||||||
verify: Verify = False
|
verify: Verify = False
|
||||||
base_url: BaseUrl = ""
|
base_url: BaseUrl = ""
|
||||||
variables: Variables = {}
|
variables: VariablesMapping = {}
|
||||||
functions: Dict[Text, Callable]
|
functions: FunctionsMapping = {}
|
||||||
setup_hooks: Hook = []
|
setup_hooks: Hook = []
|
||||||
teardown_hooks: Hook = []
|
teardown_hooks: Hook = []
|
||||||
export: Export = []
|
export: Export = []
|
||||||
@@ -56,6 +57,6 @@ class Request(BaseModel):
|
|||||||
class TestStep(BaseModel):
|
class TestStep(BaseModel):
|
||||||
name: Name
|
name: Name
|
||||||
request: Request
|
request: Request
|
||||||
variables: Variables = {}
|
variables: VariablesMapping = {}
|
||||||
extract: Dict[Text, Text] = {}
|
extract: Dict[Text, Text] = {}
|
||||||
validation: Validate = Field([], alias="validate")
|
validation: Validate = Field([], alias="validate")
|
||||||
|
|||||||
Reference in New Issue
Block a user