HttpRunner v3.x支持pytest,YAML和JSON三种测试用例格式。强烈建议以pytest格式而不是以前的YAML/JSON格式编写和维护测试用例。
格式关系如下图所示:
记录并生成测试用例
如果SUT(被测系统)准备就绪,最有效的方法是先捕获HTTP流量,然后使用HAR文件生成测试用例。
请参阅 记录并生成测试用例
获取更多详细信息。然后基于生成的pytest测试用例,您可以根
据需要进行一些调整,因此您需要了解测试用例格式的详细信息。
连锁会话
HttpRunner v3.x最令人敬畏的功能之一是chain call
,您无需记住任何测试用例格式的详细信息,并且在IDE中编写测试用例时就可以智能完成。
测试用例结构
每个测试用例都是HttpRunner
的子类,并且必须具有config
和teststeps
两个类属性。
config
配置测试用例级别的设置,每个测试用例都应该有一个 config
部分。其中包括base_url
,verify
,variables
,export
。
-
name(required)
指定测试用例名称。这将显示在执行日志和测试报告中。
-
base_url(optional)
指定被测系统的通用模式和主机部分,例如https://postman-echo.com。如果base_url指定,则teststep中的url只能设置相对路径部分。如果要在不同的SUT环境之间切换,这将特别有用。
-
variables(optional)
指定测试用例的公共变量。每个测试步骤都可以引用未在步骤变量中设置的配置变量。换句话说,步骤变量比配置变量具有更高的优先级。
-
verify(optional)
指定是否验证服务器的TLS证书。如果我们想记录测试用例执行的HTTP流量,这将特别有用。因为如果没有设置verify或将其设置为True,则会发生SSLError。
SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1076)'))
-
export(optional)
指定导出的测试用例会话变量。将每个测试用例视为一个黑盒,config的 variables 是输入部分,而config的 export是输出部分。
特别是,当一个测试用例在另一个测试用例的步骤中被引用,并且将被提取一些会话变量以在随后的测试步骤中使用时,则提取的会话变量应在配置export部分中进行配置。
teststeps
每个测试用例应具有一个或多个有序的测试步骤(List[Step]),每个步骤对应于一个API请求或另一个测试用例引用调用。
此外,variables(变量) / extract(提取) / validate(验证) / hooks机制支持,可制作十分复杂的测试方案。
注意:为了简化起见,不推荐使用HttpRunner v2.x中的API概念。您可以将API视为只有一个请求步骤的测试用例。
RunRequest(name)
RunRequest
在一个步骤中用于向API发出请求,并对响应进行一些提取或验证。
name
参数用于指定测试步骤名称,该名称将显示在执行日志和测试报告中。
-
.with_variables
指定测试步骤变量。每个步骤的变量都是独立的,因此,如果要在多个步骤中共享变量,
则应在配置变量中定义变量。此外,步骤变量将覆盖配置变量中具有相同名称的变量。 -
.method(url)
指定HTTP方法和被测系统的URL。这些对应于method和url参数requests.request
。
如果在config中设置了base_url,则url只能设置相对路径部分。例如:post("/index") -
.with_params
指定请求网址的查询字符串。与requests.request
中的params参数相对应。 -
.with_headers
指定HTTP的请求头。与requests.request
中的headers参数相对应。 -
.with_cookies
指定HTTP请求cookie。与requests.request
中的cookies参数相对应。 -
.with_data
指定HTTP请求正文。与requests.request
中的data参数相对应。 -
.with_json
指定HTTP请求正文是json格式。与requests.request
中的json参数相对应。 -
extract
.WITH_JMESPATH
使用jmespath提取JSON响应主体。with_jmespath(jmes_path: Text, var_name: Text)
- jmes_path:jmespath表达式,有关更多详细信息,请参考《JMESPath教程》
- var_name:存储提取值的变量名,可以在后续测试步骤中引用它。
-
validate
.ASSERT_XXX
使用jmespath提取JSON响应主体并使用期望值进行验证。assert_XXX(jmes_path: Text, expected_value: Any, message: Text = "")
- jmes_path:jmespath表达式,有关更多详细信息,请参考《JMESPath教程》
- expected_value:指定的期望值,变量或函数引用也可以在此处使用。
- message(可选):用于指示断言错误原因。
RunTestCase(name)
RunTestCase
在一个步骤中用于引用另一个测试用例调用。
name
参数用于指定测试步骤名称,该名称将显示在执行日志和测试报告中。
-
.with_variables
与RunRequest
中的.with_variables
相同。 -
.call
引用指定的测试用例类 -
.export
从引用的测试用例中导出指定会话变量名称,可以在后续的测试步骤中引用导出的变量。
示例1
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
class TestCaseRequestWithFunctions(HttpRunner):
config = (
Config("request methods testcase with functions")
.variables(
**{
"foo1": "config_bar1",
"foo2": "config_bar2",
"expect_foo1": "config_bar1",
"expect_foo2": "config_bar2",
}
)
.base_url("https://postman-echo.com")
.verify(False)
.export(*["foo3"])
)
teststeps = [
Step(
RunRequest("get with params")
.with_variables(
**{"foo1": "bar11", "foo2": "bar21", "sum_v": "${sum_two(1, 2)}"}
)
.get("/get")
.with_params(**{"foo1": "$foo1", "foo2": "$foo2", "sum_v": "$sum_v"})
.with_headers(**{"User-Agent": "HttpRunner/${get_httprunner_version()}"})
.extract()
.with_jmespath("body.args.foo2", "foo3")
.validate()
.assert_equal("status_code", 200)
.assert_equal("body.args.foo1", "bar11")
.assert_equal("body.args.sum_v", "3")
.assert_equal("body.args.foo2", "bar21")
),
Step(
RunRequest("post form data")
.with_variables(**{"foo2": "bar23"})
.post("/post")
.with_headers(
**{
"User-Agent": "HttpRunner/${get_httprunner_version()}",
"Content-Type": "application/x-www-form-urlencoded",
}
)
.with_data("foo1=$foo1&foo2=$foo2&foo3=$foo3")
.validate()
.assert_equal("status_code", 200)
.assert_equal("body.form.foo1", "$expect_foo1")
.assert_equal("body.form.foo2", "bar23")
.assert_equal("body.form.foo3", "bar21")
),
]
if __name__ == "__main__":
TestCaseRequestWithFunctions().test_start()
示例2
import os
import sys
sys.path.insert(0, os.getcwd())
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
from examples.postman_echo.request_methods.request_with_functions_test import (
TestCaseRequestWithFunctions as RequestWithFunctions,
)
class TestCaseRequestWithTestcaseReference(HttpRunner):
config = (
Config("request methods testcase: reference testcase")
.variables(
**{
"foo1": "testsuite_config_bar1",
"expect_foo1": "testsuite_config_bar1",
"expect_foo2": "config_bar2",
}
)
.base_url("https://postman-echo.com")
.verify(False)
)
teststeps = [
Step(
RunTestCase("request with functions")
.with_variables(
**{"foo1": "testcase_ref_bar1", "expect_foo1": "testcase_ref_bar1"}
)
.call(RequestWithFunctions)
.export(*["foo3"])
),
Step(
RunRequest("post form data")
.with_variables(**{"foo1": "bar1"})
.post("/post")
.with_headers(
**{
"User-Agent": "HttpRunner/${get_httprunner_version()}",
"Content-Type": "application/x-www-form-urlencoded",
}
)
.with_data("foo1=$foo1&foo2=$foo3")
.validate()
.assert_equal("status_code", 200)
.assert_equal("body.form.foo1", "bar1")
.assert_equal("body.form.foo2", "bar21")
),
]
if __name__ == "__main__":
TestCaseRequestWithTestcaseReference().test_start()