style: add typing

This commit is contained in:
debugtalk
2020-06-03 16:50:53 +08:00
parent 526b1fcbc9
commit 03c1836075
3 changed files with 97 additions and 74 deletions
@@ -7,10 +7,10 @@ from httprunner import HttpRunner, Config, Step, Request
class TestCaseRequestWithFunctions(HttpRunner): class TestCaseRequestWithFunctions(HttpRunner):
config = ( config = (
Config("request methods testcase with functions") Config("request methods testcase with functions")
.set_variables(foo1="session_bar1") .variables(foo1="session_bar1")
.set_base_url("https://postman-echo.com") .base_url("https://postman-echo.com")
.set_verify(False) .verify(False)
.set_path( .path(
"examples/postman_echo/request_methods/request_with_functions_test.py" "examples/postman_echo/request_methods/request_with_functions_test.py"
) )
.init() .init()
@@ -18,12 +18,12 @@ class TestCaseRequestWithFunctions(HttpRunner):
teststeps = [ teststeps = [
Step("get with params") Step("get with params")
.set_variables(foo1="bar1", foo2="session_bar2", sum_v="${sum_two(1, 2)}") .with_variables(foo1="bar1", foo2="session_bar2", sum_v="${sum_two(1, 2)}")
.run_request( .run_request(
Request() Request()
.get("/get") .get("/get")
.set_params(foo1="$foo1", foo2="$foo2", sum_v="$sum_v") .with_params(foo1="$foo1", foo2="$foo2", sum_v="$sum_v")
.set_headers(**{"User-Agent": "HttpRunner/${get_httprunner_version()}"}) .with_headers(**{"User-Agent": "HttpRunner/${get_httprunner_version()}"})
) )
.extract("session_foo2", "body.args.foo2") .extract("session_foo2", "body.args.foo2")
.assert_equal("status_code", 200) .assert_equal("status_code", 200)
@@ -32,17 +32,17 @@ class TestCaseRequestWithFunctions(HttpRunner):
.assert_equal("body.args.foo2", "session_bar2") .assert_equal("body.args.foo2", "session_bar2")
.init(), .init(),
Step("post raw text") Step("post raw text")
.set_variables(foo1="hello world", foo3="$session_foo2") .with_variables(foo1="hello world", foo3="$session_foo2")
.run_request( .run_request(
Request() Request()
.post("/post") .post("/post")
.set_headers( .with_headers(
**{ **{
"User-Agent": "HttpRunner/${get_httprunner_version()}", "User-Agent": "HttpRunner/${get_httprunner_version()}",
"Content-Type": "text/plain", "Content-Type": "text/plain",
} }
) )
.set_data( .with_data(
"This is expected to be sent back as part of response body: $foo1-$foo3." "This is expected to be sent back as part of response body: $foo1-$foo3."
) )
) )
@@ -53,17 +53,17 @@ class TestCaseRequestWithFunctions(HttpRunner):
) )
.init(), .init(),
Step("post form data") Step("post form data")
.set_variables(**{"foo1": "bar1", "foo2": "bar2"}) .with_variables(**{"foo1": "bar1", "foo2": "bar2"})
.run_request( .run_request(
Request() Request()
.post("/post") .post("/post")
.set_headers( .with_headers(
**{ **{
"User-Agent": "HttpRunner/${get_httprunner_version()}", "User-Agent": "HttpRunner/${get_httprunner_version()}",
"Content-Type": "application/x-www-form-urlencoded", "Content-Type": "application/x-www-form-urlencoded",
} }
) )
.set_data("foo1=$foo1&foo2=$foo2") .with_data("foo1=$foo1&foo2=$foo2")
) )
.assert_equal("status_code", 200) .assert_equal("status_code", 200)
.assert_equal("body.form.foo1", "session_bar1") .assert_equal("body.form.foo1", "session_bar1")
+82 -59
View File
@@ -2,7 +2,7 @@ import os
import time import time
import uuid import uuid
from datetime import datetime from datetime import datetime
from typing import List, Dict, Text from typing import List, Dict, Text, Any, NoReturn
try: try:
import allure import allure
@@ -36,30 +36,30 @@ from httprunner.schema import (
class Config(object): class Config(object):
def __init__(self, name): def __init__(self, name: Text):
self.__name = name self.__name = name
self.__variables = {} self.__variables = {}
self.__base_url = "" self.__base_url = ""
self.__verify = False self.__verify = False
self.__path = "" self.__path = ""
def set_variables(self, **variables): def variables(self, **variables) -> "Config":
self.__variables.update(variables) self.__variables.update(variables)
return self return self
def set_base_url(self, base_url): def base_url(self, base_url: Text) -> "Config":
self.__base_url = base_url self.__base_url = base_url
return self return self
def set_verify(self, verify): def verify(self, verify: bool) -> "Config":
self.__verify = verify self.__verify = verify
return self return self
def set_path(self, path): def path(self, path: Text) -> "Config":
self.__path = path self.__path = path
return self return self
def init(self): def init(self) -> TConfig:
return TConfig( return TConfig(
name=self.__name, name=self.__name,
base_url=self.__base_url, base_url=self.__base_url,
@@ -69,50 +69,47 @@ class Config(object):
) )
class Request(object):
def get(self, url):
return RequestOptionalArgs(MethodEnum.GET, url)
def post(self, url):
return RequestOptionalArgs(MethodEnum.POST, url)
def put(self, url):
return RequestOptionalArgs(MethodEnum.PUT, url)
def head(self, url):
return RequestOptionalArgs(MethodEnum.HEAD, url)
def delete(self, url):
return RequestOptionalArgs(MethodEnum.DELETE, url)
def options(self, url):
return RequestOptionalArgs(MethodEnum.OPTIONS, url)
def patch(self, url):
return RequestOptionalArgs(MethodEnum.PATCH, url)
class RequestOptionalArgs(object): class RequestOptionalArgs(object):
def __init__(self, method: MethodEnum, url: Text): def __init__(self, method: MethodEnum, url: Text):
self.__method = method self.__method = method
self.__url = url self.__url = url
self.__params = {} self.__params = {}
self.__headers = {} self.__headers = {}
self.__cookies = {}
self.__data = "" self.__data = ""
self.__timeout = 120
self.__allow_redirects = True
self.__verify = False
def set_params(self, **params): def with_params(self, **params) -> "RequestOptionalArgs":
self.__params.update(params) self.__params.update(params)
return self return self
def set_headers(self, **headers): def with_headers(self, **headers) -> "RequestOptionalArgs":
self.__headers.update(headers) self.__headers.update(headers)
return self return self
def set_data(self, data): def with_cookies(self, **cookies) -> "RequestOptionalArgs":
self.__cookies.update(cookies)
return self
def with_data(self, data) -> "RequestOptionalArgs":
self.__data = data self.__data = data
return self return self
def perform(self): def set_timeout(self, timeout: float) -> "RequestOptionalArgs":
self.__timeout = timeout
return self
def set_verify(self, verify: bool) -> "RequestOptionalArgs":
self.__verify = verify
return self
def set_allow_redirects(self, allow_redirects: bool) -> "RequestOptionalArgs":
self.__allow_redirects = allow_redirects
return self
def perform(self) -> TRequest:
"""build TRequest object with configs""" """build TRequest object with configs"""
return TRequest( return TRequest(
method=self.__method, method=self.__method,
@@ -120,9 +117,35 @@ class RequestOptionalArgs(object):
params=self.__params, params=self.__params,
headers=self.__headers, headers=self.__headers,
data=self.__data, data=self.__data,
timeout=self.__timeout,
verify=self.__verify,
allow_redirects=self.__allow_redirects,
) )
class Request(object):
def get(self, url: Text) -> RequestOptionalArgs:
return RequestOptionalArgs(MethodEnum.GET, url)
def post(self, url: Text) -> RequestOptionalArgs:
return RequestOptionalArgs(MethodEnum.POST, url)
def put(self, url: Text) -> RequestOptionalArgs:
return RequestOptionalArgs(MethodEnum.PUT, url)
def head(self, url: Text) -> RequestOptionalArgs:
return RequestOptionalArgs(MethodEnum.HEAD, url)
def delete(self, url: Text) -> RequestOptionalArgs:
return RequestOptionalArgs(MethodEnum.DELETE, url)
def options(self, url: Text) -> RequestOptionalArgs:
return RequestOptionalArgs(MethodEnum.OPTIONS, url)
def patch(self, url: Text) -> RequestOptionalArgs:
return RequestOptionalArgs(MethodEnum.PATCH, url)
class Step(object): class Step(object):
def __init__(self, name): def __init__(self, name):
self.__name = name self.__name = name
@@ -131,31 +154,31 @@ class Step(object):
self.__extract = {} self.__extract = {}
self.__validators = [] self.__validators = []
def set_variables(self, **variables): def with_variables(self, **variables) -> "Step":
self.__variables.update(variables) self.__variables.update(variables)
return self return self
def extract(self, var_name, jmes_path): def run_request(self, req_obj: RequestOptionalArgs) -> "Step":
self.__extract[var_name] = jmes_path
return self
def assert_equal(self, jmes_path, expected_value):
self.__validators.append({"eq": [jmes_path, expected_value]})
return self
def assert_greater_than(self, jmes_path, expected_value):
self.__validators.append({"gt": [jmes_path, expected_value]})
return self
def assert_less_than(self, jmes_path, expected_value):
self.__validators.append({"lt": [jmes_path, expected_value]})
return self
def run_request(self, req_obj: Request) -> "Step":
self.__request = req_obj.perform() self.__request = req_obj.perform()
return self return self
def init(self): def extract(self, var_name: Text, jmes_path: Text) -> "Step":
self.__extract[var_name] = jmes_path
return self
def assert_equal(self, jmes_path: Text, expected_value: Any) -> "Step":
self.__validators.append({"eq": [jmes_path, expected_value]})
return self
def assert_greater_than(self, jmes_path: Text, expected_value: Any) -> "Step":
self.__validators.append({"gt": [jmes_path, expected_value]})
return self
def assert_less_than(self, jmes_path: Text, expected_value: Any) -> "Step":
self.__validators.append({"lt": [jmes_path, expected_value]})
return self
def init(self) -> TStep:
return TStep( return TStep(
name=self.__name, name=self.__name,
variables=self.__variables, variables=self.__variables,
@@ -197,7 +220,7 @@ class HttpRunner(object):
self.__session_variables = variables self.__session_variables = variables
return self return self
def __run_step_request(self, step: TStep): def __run_step_request(self, step: TStep) -> StepData:
"""run teststep: request""" """run teststep: request"""
step_data = StepData(name=step.name) step_data = StepData(name=step.name)
@@ -274,7 +297,7 @@ class HttpRunner(object):
return step_data return step_data
def __run_step_testcase(self, step): def __run_step_testcase(self, step: TStep) -> StepData:
"""run teststep: referenced testcase""" """run teststep: referenced testcase"""
step_data = StepData(name=step.name) step_data = StepData(name=step.name)
step_variables = step.variables step_variables = step.variables
@@ -315,7 +338,7 @@ class HttpRunner(object):
return step_data return step_data
def __run_step(self, step: TStep): def __run_step(self, step: TStep) -> Dict:
"""run teststep, teststep maybe a request or referenced testcase""" """run teststep, teststep maybe a request or referenced testcase"""
logger.info(f"run step begin: {step.name} >>>>>>") logger.info(f"run step begin: {step.name} >>>>>>")
@@ -332,7 +355,7 @@ class HttpRunner(object):
logger.info(f"run step end: {step.name} <<<<<<\n") logger.info(f"run step end: {step.name} <<<<<<\n")
return step_data.export return step_data.export
def __parse_config(self, config: TConfig): def __parse_config(self, config: TConfig) -> NoReturn:
config.variables.update(self.__session_variables) config.variables.update(self.__session_variables)
config.variables = parse_variables_mapping( config.variables = parse_variables_mapping(
config.variables, self.__project_meta.functions config.variables, self.__project_meta.functions
@@ -344,7 +367,7 @@ class HttpRunner(object):
config.base_url, config.variables, self.__project_meta.functions config.base_url, config.variables, self.__project_meta.functions
) )
def run_testcase(self, testcase: TestCase): def run_testcase(self, testcase: TestCase) -> "HttpRunner":
"""run specified testcase """run specified testcase
Examples: Examples:
@@ -437,7 +460,7 @@ class HttpRunner(object):
step_datas=self.__step_datas, step_datas=self.__step_datas,
) )
def test_start(self): def test_start(self) -> "HttpRunner":
"""main entrance, discovered by pytest""" """main entrance, discovered by pytest"""
self.__project_meta = self.__project_meta or load_project_meta(self.config.path) self.__project_meta = self.__project_meta or load_project_meta(self.config.path)
self.__case_id = self.__case_id or str(uuid.uuid4()) self.__case_id = self.__case_id or str(uuid.uuid4())
+2 -2
View File
@@ -46,14 +46,14 @@ class TConfig(BaseModel):
class TRequest(BaseModel): class TRequest(BaseModel):
"""requests.Request model""" """requests.Request model"""
method: MethodEnum = MethodEnum.GET method: MethodEnum
url: Url url: Url
params: Dict[Text, Text] = {} params: Dict[Text, Text] = {}
headers: Headers = {} headers: Headers = {}
req_json: Dict = Field({}, alias="json") req_json: Dict = Field({}, alias="json")
data: Union[Text, Dict[Text, Any]] = "" data: Union[Text, Dict[Text, Any]] = ""
cookies: Cookies = {} cookies: Cookies = {}
timeout: int = 120 timeout: float = 120
allow_redirects: bool = True allow_redirects: bool = True
verify: Verify = False verify: Verify = False
upload: Dict = {} # used for upload files upload: Dict = {} # used for upload files