From d79fc265672ad399e66aa4f4d732c2cb6a717e1a Mon Sep 17 00:00:00 2001 From: debugtalk Date: Tue, 21 Apr 2020 13:09:03 +0800 Subject: [PATCH] refactor: add argument typing --- httprunner/v3/parser.py | 28 ++++++++++++++-------------- httprunner/v3/runner.py | 6 +++--- httprunner/v3/schema/__init__.py | 9 +++++---- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/httprunner/v3/parser.py b/httprunner/v3/parser.py index c80c2a2e..c0e12c7a 100644 --- a/httprunner/v3/parser.py +++ b/httprunner/v3/parser.py @@ -1,11 +1,11 @@ import ast import builtins 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.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) @@ -130,7 +130,7 @@ def extract_variables(content: Any) -> Set: return set() -def parse_function_params(params): +def parse_function_params(params: Text) -> Dict: """ parse function params to args and kwargs. Args: @@ -182,7 +182,7 @@ def parse_function_params(params): 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. 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}") -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, 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( raw_string: Text, - variables_mapping: Dict[Text, Any], - functions_mapping: Dict[Text, Callable]) -> Any: + variables_mapping: VariablesMapping, + functions_mapping: FunctionsMapping) -> Any: """ parse string content with variables and functions mapping. Args: @@ -346,8 +346,8 @@ def parse_string( def parse_data( raw_data: Any, - variables_mapping: Dict[Text, Any] = None, - functions_mapping: Dict[Text, Callable] = None) -> Any: + variables_mapping: VariablesMapping = None, + functions_mapping: FunctionsMapping = None) -> Any: """ parse raw data with evaluated variables mapping. Notice: variables_mapping should not contain any variable or function. """ @@ -379,10 +379,10 @@ def parse_data( def parse_variables_mapping( - variables_mapping: Dict[Text, Any], - functions_mapping: Dict[Text, Callable] = None) -> Dict[Text, Any]: + variables_mapping: VariablesMapping, + functions_mapping: FunctionsMapping = None) -> VariablesMapping: - parsed_variables: Dict[Text, Any] = {} + parsed_variables: VariablesMapping = {} while len(parsed_variables) != len(variables_mapping): for var_name in variables_mapping: @@ -409,12 +409,12 @@ def parse_variables_mapping( if not_defined_variables: # e.g. {"varA": "123$varB", "varB": "456$varC"} # e.g. {"varC": "${sum_two($a, $b)}"} - raise VariableNotFound(not_defined_variables) + raise exceptions.VariableNotFound(not_defined_variables) try: parsed_value = parse_data( var_value, parsed_variables, functions_mapping) - except VariableNotFound: + except exceptions.VariableNotFound: continue parsed_variables[var_name] = parsed_value diff --git a/httprunner/v3/runner.py b/httprunner/v3/runner.py index 3e3c3489..8ab7113b 100644 --- a/httprunner/v3/runner.py +++ b/httprunner/v3/runner.py @@ -5,7 +5,7 @@ from loguru import logger from httprunner.v3.parser import build_url, parse_data, parse_variables_mapping from httprunner.v3.response import ResponseObject -from httprunner.v3.schema import TestsConfig, TestStep +from httprunner.v3.schema import TestsConfig, TestStep, VariablesMapping class TestCaseRunner(object): @@ -18,11 +18,11 @@ class TestCaseRunner(object): self.session = s return self - def with_variables(self, **variables) -> "TestCaseRunner": + def with_variables(self, **variables: VariablesMapping) -> "TestCaseRunner": self.config.variables.update(variables) return self - def run_step(self, step): + def run_step(self, step: TestStep): logger.info(f"run step: {step.name}") # parse diff --git a/httprunner/v3/schema/__init__.py b/httprunner/v3/schema/__init__.py index ea1220d2..198e4b57 100644 --- a/httprunner/v3/schema/__init__.py +++ b/httprunner/v3/schema/__init__.py @@ -8,7 +8,8 @@ from pydantic import HttpUrl Name = Text Url = Text BaseUrl = Union[HttpUrl, Text] -Variables = Dict[Text, Any] +VariablesMapping = Dict[Text, Any] +FunctionsMapping = Dict[Text, Callable] Headers = Dict[Text, Text] Verify = bool Hook = List[Text] @@ -33,8 +34,8 @@ class TestsConfig(BaseModel): name: Name verify: Verify = False base_url: BaseUrl = "" - variables: Variables = {} - functions: Dict[Text, Callable] + variables: VariablesMapping = {} + functions: FunctionsMapping = {} setup_hooks: Hook = [] teardown_hooks: Hook = [] export: Export = [] @@ -56,6 +57,6 @@ class Request(BaseModel): class TestStep(BaseModel): name: Name request: Request - variables: Variables = {} + variables: VariablesMapping = {} extract: Dict[Text, Text] = {} validation: Validate = Field([], alias="validate")