feat: describe testcase in chain-call style

This commit is contained in:
debugtalk
2020-06-03 16:50:53 +08:00
parent edf17c5508
commit e7aca43470
5 changed files with 189 additions and 81 deletions
@@ -1,88 +1,77 @@
# NOTICE: Generated By HttpRunner. DO NOT EDIT! # NOTICE: Generated By HttpRunner. DO NOT EDIT!
# FROM: examples/postman_echo/request_methods/request_with_functions.yml # FROM: examples/postman_echo/request_methods/request_with_functions.yml
from httprunner import HttpRunner, TConfig, TStep from httprunner import HttpRunner, Config, Step, Request
class TestCaseRequestWithFunctions(HttpRunner): class TestCaseRequestWithFunctions(HttpRunner):
config = TConfig( config = (
**{ Config("request methods testcase with functions")
"name": "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()
) )
teststeps = [ teststeps = [
TStep( Step("get with params")
**{ .set_variables(foo1="bar1", foo2="session_bar2", sum_v="${sum_two(1, 2)}")
"name": "get with params", .run_request(
"variables": { Request()
"foo1": "bar1", .set_method("GET")
"foo2": "session_bar2", .set_url("/get")
"sum_v": "${sum_two(1, 2)}", .set_params(foo1="$foo1", foo2="$foo2", sum_v="$sum_v")
}, .set_headers(**{"User-Agent": "HttpRunner/${get_httprunner_version()}"})
"request": { )
"method": "GET", .extract("session_foo2", "body.args.foo2")
"url": "/get", .assert_equal("status_code", 200)
"params": {"foo1": "$foo1", "foo2": "$foo2", "sum_v": "$sum_v"}, .assert_equal("body.args.foo1", "session_bar1")
"headers": {"User-Agent": "HttpRunner/${get_httprunner_version()}"}, .assert_equal("body.args.sum_v", "3")
}, .assert_equal("body.args.foo2", "session_bar2")
"extract": {"session_foo2": "body.args.foo2"}, .init(),
"validate": [ Step("post raw text")
{"eq": ["status_code", 200]}, .set_variables(foo1="hello world", foo3="$session_foo2")
{"eq": ["body.args.foo1", "session_bar1"]}, .run_request(
{"eq": ["body.args.sum_v", "3"]}, Request()
{"eq": ["body.args.foo2", "session_bar2"]}, .set_method("POST")
], .set_url("/post")
} .set_headers(
), **{
TStep( "User-Agent": "HttpRunner/${get_httprunner_version()}",
**{ "Content-Type": "text/plain",
"name": "post raw text", }
"variables": {"foo1": "hello world", "foo3": "$session_foo2"}, )
"request": { .set_data(
"method": "POST", "This is expected to be sent back as part of response body: $foo1-$foo3."
"url": "/post", )
"headers": { )
"User-Agent": "HttpRunner/${get_httprunner_version()}", .assert_equal("status_code", 200)
"Content-Type": "text/plain", .assert_equal(
}, "body.data",
"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: session_bar1-session_bar2.",
}, )
"validate": [ .init(),
{"eq": ["status_code", 200]}, Step("post form data")
{ .set_variables(**{"foo1": "bar1", "foo2": "bar2"})
"eq": [ .run_request(
"body.data", Request()
"This is expected to be sent back as part of response body: session_bar1-session_bar2.", .set_method("POST")
] .set_url("/post")
}, .set_headers(
], **{
} "User-Agent": "HttpRunner/${get_httprunner_version()}",
), "Content-Type": "application/x-www-form-urlencoded",
TStep( }
**{ )
"name": "post form data", .set_data("foo1=$foo1&foo2=$foo2")
"variables": {"foo1": "bar1", "foo2": "bar2"}, )
"request": { .assert_equal("status_code", 200)
"method": "POST", .assert_equal("body.form.foo1", "session_bar1")
"url": "/post", .assert_equal("body.form.foo2", "bar2")
"headers": { .init(),
"User-Agent": "HttpRunner/${get_httprunner_version()}",
"Content-Type": "application/x-www-form-urlencoded",
},
"data": "foo1=$foo1&foo2=$foo2",
},
"validate": [
{"eq": ["status_code", 200]},
{"eq": ["body.form.foo1", "session_bar1"]},
{"eq": ["body.form.foo2", "bar2"]},
],
}
),
] ]
+5 -2
View File
@@ -1,7 +1,7 @@
__version__ = "3.0.6" __version__ = "3.0.7"
__description__ = "One-stop solution for HTTP(S) testing." __description__ = "One-stop solution for HTTP(S) testing."
from httprunner.runner import HttpRunner from httprunner.runner import HttpRunner, Config, Step, Request
from httprunner.schema import TConfig, TStep from httprunner.schema import TConfig, TStep
__all__ = [ __all__ = [
@@ -10,4 +10,7 @@ __all__ = [
"HttpRunner", "HttpRunner",
"TConfig", "TConfig",
"TStep", "TStep",
"Config",
"Step",
"Request",
] ]
+116
View File
@@ -30,9 +30,125 @@ from httprunner.schema import (
TestCaseInOut, TestCaseInOut,
ProjectMeta, ProjectMeta,
TestCase, TestCase,
TRequest,
) )
class Config(object):
def __init__(self, name):
self.__name = name
self.__variables = {}
self.__base_url = ""
self.__verify = False
self.__path = ""
def set_variables(self, **variables):
self.__variables.update(variables)
return self
def set_base_url(self, base_url):
self.__base_url = base_url
return self
def set_verify(self, verify):
self.__verify = verify
return self
def set_path(self, path):
self.__path = path
return self
def init(self):
return TConfig(
name=self.__name,
base_url=self.__base_url,
verify=self.__verify,
variables=self.__variables,
path=self.__path,
)
class Request(object):
def __init__(self):
self.__method = "GET"
self.__url = ""
self.__params = {}
self.__headers = {}
self.__data = ""
def set_method(self, method):
self.__method = method
return self
def set_url(self, url):
self.__url = url
return self
def set_params(self, **params):
self.__params.update(params)
return self
def set_headers(self, **headers):
self.__headers.update(headers)
return self
def set_data(self, data):
self.__data = data
return self
def perform(self):
"""build TRequest object with configs"""
return TRequest(
method=self.__method,
url=self.__url,
params=self.__params,
headers=self.__headers,
data=self.__data,
)
class Step(object):
def __init__(self, name):
self.__name = name
self.__variables = {}
self.__request = None
self.__extract = {}
self.__validators = []
def set_variables(self, **variables):
self.__variables.update(variables)
return self
def extract(self, var_name, jmes_path):
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()
return self
def init(self):
return TStep(
name=self.__name,
variables=self.__variables,
request=self.__request,
extract=self.__extract,
validate=self.__validators,
)
class HttpRunner(object): class HttpRunner(object):
config: TConfig config: TConfig
teststeps: List[TStep] teststeps: List[TStep]
+2 -2
View File
@@ -45,7 +45,7 @@ class TConfig(BaseModel):
path: Text = None path: Text = None
class Request(BaseModel): class TRequest(BaseModel):
"""requests.Request model""" """requests.Request model"""
method: MethodEnum = MethodEnum.GET method: MethodEnum = MethodEnum.GET
@@ -63,7 +63,7 @@ class Request(BaseModel):
class TStep(BaseModel): class TStep(BaseModel):
name: Name name: Name
request: Request = None request: TRequest = None
testcase: Union[Text, Callable] = "" testcase: Union[Text, Callable] = ""
variables: VariablesMapping = {} variables: VariablesMapping = {}
setup_hooks: Hook = [] setup_hooks: Hook = []
+1 -1
View File
@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "httprunner" name = "httprunner"
version = "3.0.6" version = "3.0.7"
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"