Httprunner3.x使用详情
一:Httprunner简介
Httprunner是一款面向Http和HTTPS协议的通用测试框架,只需编写维护一份YAML/JSON脚本即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求,是基于关键字驱动的框架,基于Har实现接口录制和用例生成公告。
Httprunner支持python3.5及以上的所有版本,虽然Httprunner暂时保留了对python2.7的兼容支持,但是强烈推荐使用python3.6及以上版本。
二:Httprunner安装
2.1 安装指令
pip install httprunner
2.2检查是否安装成功
查看httprunner版本
hrun -V
3.1.6
显示出版本号,说明安装成功。
你也可以通过输入:hrun -h,查看命令帮助说明。
除此之外,httprunner系统还有4个常用的指令:
- httprunner:核心命令,用于所有函数
- hrun:是httprunner的缩写,功能与httprunner完全相同,用于运行YAML/Json/pytest测试用例
- hmake:是httprunner make的别名,用于将yaml和json测试用例转换成pytest文件
- har2case:辅助工具,可以将HAR格式(HTTP Archive)文件转换成yaml或者json格式的测试用例
三:快速创建Httprunner项目
3.1 快速生成项目
输入httprunner startproject -h查看基本的帮助命令
httprunner startproject -h
创建项目命令
httprunner startporject 项目名称
项目生成完毕,是不是非常的简单
如果你输入的项目名称已经存在,httprunner会给出warning提示。
3.2 项目结构梳理
- har:是用于存放录制导出的.har文件
- reports:存放html测试报告
- testcases:是用于存放测试用例
- .env:项目的全局环境变量的管理文件
- .gitignore:git版本管理文件配置
- debugtaik.py:存储项目中逻辑运算辅助函数,该文件存在时,将作为项目根目录定位标记,其所在目录即被视为项目工程根目录,该文件不存在时,运行测试的所在路径(CWD)将被视为项目工程根目录
四:生成测试用例
使用Google浏览器导出HAR
以https://postman-echo.com/get?test=123为例,我们使用Google浏览器F12(开发者工具导出HAR)
1,使用浏览器打开上面的网址,然后按F12打开浏览器的开发者工具:
2,点击网络(Network),选择下面的全部(All),就可找到当前的请求信息,如果没法发现,请刷新页面,请求就会出现在列表中
3,右击目标请求,选择全部另存为HAR
4.1 har2case转为yml格式文件
har2case 文件名.har -2y
4.2 har2case转为json格式文件
har2case baidu.har -2j
4.3 har2case转为pytest格式文件
#转换为pytest格式文件 har2case 文件名.har
4.4 httprunner make转为pytest格式文件
make 是把 YAML/JSON 测试用例转成 pytest用例, 需指定 yaml 文件路径或文件夹路径
hmake 文件名 #或者 httprunner make 文件名
五:运行测试用例
#运行整个项目的用例,需要在目录的上级路径进行运行 hrun 项目名
hurn + case路径
#指定运行某个路径下的用例,-s可以查看请求的详细信息 hrun ./testcases/test_har.yml -s #运行并生成html报告 hrun ./testcases/test_har.yml --html=report.html #也可以生成pytest的allure报告,需要下载allure-pytest库以及allure插件并配置环境变量,具体可以百度 pip install allure-pytest #步骤一,运行用例生成allure报告内容 hrun ./testcases/test_har.yml --alluredir=./reports/tmp #步骤二,根据收集的内容再生成allure报告html文件 allure generate ./reports/tmp -o allure-report --clean # --clean是为了清空已有的测试报告; -o allure-report 是指定清空测试报告的文件allure-report
5.1运行多个测试用例
hrun 项目名称
#或者
hrun 后面多个case路径,case之间用空格隔开
hrun 项目名称:命令等价于httprunner run 项目名称,其中先进行httprunner make json/yml,会将json/yml文件先转换为pytest文件,之后再执行hrun(httprunner run),如果pytest文件是已经存在的(直接编写的pytest文件,而不是yml或者json),httprunner会直接运行你的pytest脚本,不需要进行转换,官方推荐:直接使用pytest脚本编写。
在tacecases目录下生成了三个py文件,生成的py文件会加上_test后缀,如果yml或者json文件有修改,需要再次http make scriptPath一下,或者直接修改py文件。
还生成了logs日志文件,每一个yml都会对应生成一个日志文件,每一个testcase脚本都会又要给唯一的id,对应了日志文件的文件名。
5.2 运行单个测试用例
5.3 使用pytest命令运行测试用例
pytest 项目名称(前提,已经使用hrun 项目宁名称生成了yml或json对应的pytest文件,否则不生效)
六:测试用例解析以及配置config
import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase from httprunner_demo.testcases.demo_testcase_request_test import ( TestCaseDemoTestcaseRequest as DemoTestcaseRequest, ) class TestCaseDemoTestcaseRef(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(DemoTestcaseRequest) .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__": TestCaseDemoTestcaseRef().test_start()
每个测试用例都是Httprunner的子类,并且必须包含config和teststeps两个属性。
6.1 config属性
配置testcas级别的config,它包含base_url
、name
、verify
、variables
、export
;
- name(必需):testcase的一部分,会显示在测试报告以及运行的日志中;
- base_url((可选):功能路径,url的一部分,比如:http//www.woshipm.com/,如果设置了base_url的话,在testcase中的url中只能设置相对路径。如果需要切换不同的环境的话,该功能是很有用的;
- variables(可选):testcase通用变量,每个step中都可以引用没有在step中设置的变量。换句话说,step中设置的变量的级别比在config中设置的变量级别更高;
- verify(可选):指定是否验证服务器的TLS证书,如果想要记录testcase中的http数据特别有用,如果不设置或者设置为True则会产生SSLError错误
- export(可选):提取testcase的session变量,测试用例是为黑盒,config中的variables是输入部分,export则为输出部分,特别是当一个测试用例在另一个测试用例的步骤中被引用,并且将被提取一些会话变量用于后续测试步骤中,则提取的会话变量应在配置export部分中进行配置。将测试用例的某些变量指定为全局变量。(PS:不配置export,在另一个引用类中进行该类的变量调用时,直接export也是可以的,不过最好还是配置一下)。
6.2 teststeps属性
每一个testcase中包括一个或者多个排序的steps
列表(List[Step]
),每个step
相当于一个api
请求(request
)或者testcase
的引用,step的先后顺序,有step的前后控制,由step所处的位置由上到下执行。此外还支持variables/extract/validate/hooks
机制实现更为复杂的场景。
RunRequest(名称)
RunRequest在一个测试步骤中用于向API发送请求,并为一些响应作出一些提取和验证。
name
RunRequest的参数name作为step的名字,将会在测试报告和运行的日志中显示。
.with_variables()
指定测试步骤中所需的变量,每个测试步骤中的测试变量都是相互独立的。因此,如果要在多个测试步骤中共享变量,则需要在配置变量config中定义变量。此外,步骤变量将会覆盖配置变量中具有相同名称的变量。(PS:参数的传递格式使用**{},同时需要关键字参数解包的方式进行参数传递给.with_variables),参数引用使用“$变量名称”,如果是函数引用使用“${函数名称()}”
method(url)
指定http请求方法的url,它对应于requests.request的方法和URL参数。如果配置中设置了base_url,则此处只能设置相对路径,可选参数为get/post/put/delete/等。
.with_params()
指定request url的参数,相当于requests.request中的params参数的数据
.with_headers()
为请求指定http的请求头,相当于requests.request中的headers参数的数据
.with_cookies()
为请求指定hettp的cookie的值,相当于requests.request中的cookies参数的数据
.with_data()
指定request的http body。相当于requests.request的data参数部分。
.with_json()
指定request的http json。相当于requests.request的json参数部分。
.extract()
使用jmespath提取json 应答数据:
.with_jmespath(jmes_path:Text, var_name:Text)-->jmes_path: jmespath表达式,可以参考https://jmespath.org/tutorial.html做详细了解;var_name: 存储提取值的变量名,该变量可以被后续的steps中直接使用。
注意:由此可见httprunner在提取返回对象时,都是使用关键字.extract(),在提取返回对象有两种方法分别是通过content.key和content.int提取。httprunner里面的content实际上就是request里面的r.content,返回的是一个byte类型。
如果返回的json数据类型,用content.key取出对应的values:
{ "code":0, "msg": "login success!", "username": "test", "token": "b3f7e8e12d23591ea671374dee818c63b1599d4d" }
上面的json数据,可以转成python里面对应的dict类型,extract提取方法:
- content.code 取出code后面对应的值 0
- content.msg 取出msg后面的对应值“login success!”
- content.username 取出username后面的值"test"
- content.token 取出token值
如果返回的是list数据类型,用content.int方式取出对应下标的数据
[{ "age":18, "name":"zhangsan" }, { "age":20, "name":"lisi" }]
上面这种转化成python里面的list对象,可以用content.int 方法取出对应下标的数据,对应的extract提取方法
- content.0 取出第一组数据{"age":18, "name":"zhangsan"}
- content.0.name 取出第一组数据name的对应值 "zhangsan"
- content.1 取出第二组数据{"age":20, "name":"lisi"}
- content.1.age 取出第二组数据age的对应值 20
.validate()
使用jmespath提取json应答数据,并使用.assert_xxx(jmes_path:Text, expected_value:Any)验证期望值。其中jmes_path表示jmespath表达式; expected_value为预期值,变量或者函数表示。如下图:
RunTestCase()
在step中用RuntestCase来调用另一个testcase。
name
参数name是用来表示testcase的名称,会在测试报告和测试运行的日志中显示
.with_variable()
指定测试步骤变量。每个步骤的变量都是独立的,因此,如果要在多个步骤中共享变量,则应在配置变量中定义变量。此外,步骤变量将覆盖配置变量中具有相同名称的变量。
.call()
指定引用测试用例的类,在引用另一个测试用例的step中的参数时,需要先指定引用的测试用例类
.export ()
指定会话变量名称以从引用的测试用例中导出,导出的变量可以在后续的测试步骤step中引用,导出的是step中jmespath提取的变量。export导出后,该变量是全局变量,但是不能在config中进行设置,因为测试类的引用是在step中进行的,而类的初始化是先在config中进行初始化的,然后再在teststeps中初始化,所以参数的传递在step之间进行
七:.env文件介绍
.env文件中可以存放全局变量文件,在config和teststeps中都可以调用
7.1 httprunner脚手架会默认创建.env文件,并将需要设置为环境变量或者是全局变量的数据存放在.env文件中(推荐变量名需要大写)
7.2 使用${ENV(变量名)}调用环境变量
八:debugtalk.py介绍
debugtalk.py和pytest中的conftest.py文件还是有区别的,首先在conftest.py文件中的定义对当前文件同级目录下以及同级目录下的子目录下的脚本生效,而debugtalk.py文件是按照httprunner脚手架默认自动生成的,只对同级testcases目录下的脚本生效,如果需要把testcases目录下脚本细分,并创建新的模块目录,然后在里面添加测试脚本,此时debutalk.py是无法生效的(ps:Httprunner版本3.1.6是同样生效的)
8.1 创建debugtalk.py文件,编写好脚本
8.2 将脚本中的方法引用到其他处,格式"${方法名}",即能实现参数化
执行结果:
九:httprunner的setup和teardown及hook
unittest框架里面有个非常好的概念:前置( setup
)和后置( tearDown
)处理器。
HttpRunner 实际上也是从用的unittest框架,里面也有前置 setup_hooks
和后置 teardown_hooks
的概念。
- setup_hooks: 在整个用例开始执行前触发 hook 函数,主要用于准备工作。
- teardown_hooks: 在整个用例结束执行后触发 hook 函数,主要用于测试后的清理工作。
hook 机制分为两个层级:测试用例层面(testcase)、测试步骤层面(teststep)
9.1 测试步骤层面
#hooks_test.py from httprunner import HttpRunner,Config,RunRequest,Step class TestCaseHooks(HttpRunner): config = ( Config("测试步骤层面执行hook钩子函数") .base_url("${ENV(BASE_URL)}") .verify(False) ) teststeps = [ Step( RunRequest("测试步骤层面执行hook钩子函数") .with_variables( **{"foo1": "bar11", "foo2": "bar21", "sum_v": "${sum_two(3, 2)}"} ) #setup_hooks: 在整个用例开始执行前触发 hook 函数,主要用于准备工作, # 传入参数$request获取请求信息详情 .setup_hook("${setup_hook_prepare_kwargs($request)}") .get("/get") #teardown_hooks: 在整个用例结束执行后触发 hook 函数,主要用于测试后的清理工作 #传入参数$reponse 可以接收到响信息详情 .teardown_hook("${teardown_hook_sleep_N_secs($response,1)}") .with_headers(**{"User-Agent": "HttpRunner/${get_httprunner_version()}"}) .with_params(**{"foo1": "$foo1", "foo2": "$foo2", "sum_v": "$sum_v"}) .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", "5") .assert_equal("$foo3", "bar21") ) ] if __name__ == '__main__': TestCaseHooks().test_start()
#debugtalk.py import time from httprunner import __version__ #可以实现根据请求方法和请求的content-Type,来对请求的 data 进行重新加工 def setup_hook_prepare_kwargs(requesr): ''' :param requesr: 接口的请求信息 :param paramas: 传入是参数 :return: ''' # print(f'参数data:{data}') print(f'发送请求前信息:{requesr}') # 根据接口响应的状态码来进行不同时间的延迟等待。 def teardown_hook_sleep_N_secs(response, n_secs): """ sleep n seconds after request """ print(f'获取响应信息:{response.text}') if response.status_code == 200: time.sleep(0.1) # 修改返回信息 response_data = response.text print(type(response_data)) else: time.sleep(n_secs) # 当我们需要先对响应内容进行处理(例如加解密、参数运算),再进行参数提取(extract)和校验(validate)时尤其有用 # 将响应结果的状态码和 headers 进行了修改,然后再进行了校验。 def alter_response(response): response.status_code = 500 response.headers["Content-Type"] = "html/text" def get_httprunner_version(): return __version__ def sum_two(m, n): return m + n def sleep(n_secs): time.sleep(n_secs)
由以上运行可以看出:
setup_hook:前置函数中传入参数"$request",能获取http的请求详情信息
teardown_hook:后置函数中传入参数"$response",能够获取http的响应信息详情,同时也可以对响应信息重新进行加工
9.2 用例级别的测试前置
from httprunner import HttpRunner,Config,RunRequest,Step class TestCaseBaiduRequest(HttpRunner): def setup(self): print("====运行于测试用例之前=====") def teardown(self): print("====运行于测试用例之后====") config = ( Config('用例级别的测试前置setup和teardown') .base_url("https://www.baidu.com") .verify(False) ) teststeps = [ Step( RunRequest("测试setup和teardown") .get("/") .validate() .assert_equal("status_code",200) ) ] if __name__ == '__main__': TestCaseBaiduRequest().test_start() #执行结果: /Users/testin/PycharmProjects/hrun_scripts/venv/bin/python /Users/testin/PycharmProjects/hrun_scripts/httprunner_demo/testcases/baidu_request_test.py ====运行于测试用例之前===== 2022-04-02 13:41:02.698 | INFO | httprunner.loader:load_dot_env_file:127 - Loading environment variables from /Users/testin/PycharmProjects/hrun_scripts/httprunner_demo/.env 2022-04-02 13:41:02.698 | DEBUG | httprunner.utils:set_os_environ:33 - Set OS environment variable: BASE_URL 2022-04-02 13:41:02.698 | DEBUG | httprunner.utils:set_os_environ:33 - Set OS environment variable: USERNAME 2022-04-02 13:41:02.698 | DEBUG | httprunner.utils:set_os_environ:33 - Set OS environment variable: PASSWORD 2022-04-02 13:41:02.705 | INFO | httprunner.runner:test_start:451 - Start to run testcase: 用例级别的测试前置setup和teardown, TestCase ID: ccac1224-17fa- 2022-04-02 13:41:03.136 | INFO | httprunner.runner:__run_step:304 - run step end: 测试setup和teardown <<<<<< 2022-04-02 13:41:03.137 | INFO | httprunner.runner:test_start:460 - generate testcase log: /Users/testin/PycharmProjects/hrun_scripts/httprunner_demo/logs/ccac1224-17fa-401d-9b92-2e8042c0a082.run.log ====运行于测试用例之后===== Process finished with exit code 0
由运行结果可以看出:
setup:只是在所有测试用例之前运行,而teardown:是在所有的测试用例执行结果后运行
十: 参数化数据驱动
httprunner3.x中的参数化我们需要引入pytest和处理参数化的函数:
import pytest from httprunner import Parameters
源码介绍 Parameters 中的使用方法:
def parse_parameters(parameters: Dict,) -> List[Dict]: """ parse parameters and generate cartesian product. Args: parameters (Dict) parameters: parameter name and value mapping parameter value may be in three types: (1) data list, e.g. ["iOS/10.1", "iOS/10.2", "iOS/10.3"] (2) call built-in parameterize function, "${parameterize(account.csv)}" (3) call custom function in debugtalk.py, "${gen_app_version()}" Returns: list: cartesian product list Examples: >>> parameters = { "user_agent": ["iOS/10.1", "iOS/10.2", "iOS/10.3"], "username-password": "${parameterize(account.csv)}", "app_version": "${gen_app_version()}", } >>> parse_parameters(parameters) """ parsed_parameters_list: List[List[Dict]] = []
10.1第一种是直接获取数据列表的信息
方式一:笛卡尔积组合
class TestCaseList(HttpRunner): config = ( Config("参数化数据驱动-列表类型") .base_url("https://www.baidu.com") .verify(False) ) @pytest.mark.parametrize('param', Parameters({'username': ['admin1', 'admin2'], 'password': [31, 32]})) def test_start(self, param): print(f'参数param={param}') super().test_start(param) teststeps = [ Step( RunRequest("列表类型的数据驱动") .get('/') .with_params( **{ "username":"$username" , "password":"$password" } ) .validate() .assert_equal("status_code",200) ) ] if __name__ == "__main__": TestCaseList().test_start()
执行结果:
============================= test session starts ============================= platform win32 -- Python 3.7.8, pytest-5.4.3, py-1.10.0, pluggy-0.13.1 rootdir: E:\PycharmScripts\API\httprunner_demo\testcases plugins: allure-pytest-2.9.43, assume-2.4.3, forked-1.4.0, html-2.1.1, metadata-1.11.0, xdist-2.5.0collected 4 items 数据驱动list_test.py [100%] ============================== warnings summary =============================== 数据驱动list_test.py::TestCaseList::test_start[param0] 数据驱动list_test.py::TestCaseList::test_start[param1] 数据驱动list_test.py::TestCaseList::test_start[param2] 数据驱动list_test.py::TestCaseList::test_start[param3] C:\Python37\lib\site-packages\urllib3\connectionpool.py:1020: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.baidu.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning, -- Docs: https://docs.pytest.org/en/latest/warnings.html ======================== 4 passed, 4 warnings in 3.89s ========================.参数param={'username': 'admin1', 'password': 31} 2022-04-02 21:39:47.583 | INFO | httprunner.runner:test_start:451 - Start to run testcase: 参数化数据驱动-列表类型, TestCase ID: 970331f1-60e3-44a6-8ac5-a4a7025d7176 2022-04-02 21:39:47.584 | INFO | httprunner.runner:__run_step:292 - run step begin: 列表类型的数据驱动 >>>>>> ================== request details ================== method : GET url : https://www.baidu.com/?username=admin1&password=31 2022-04-02 21:39:48.311 | INFO | httprunner.runner:__run_step:304 - run step end: 列表类型的数据驱动 <<<<<< 2022-04-02 21:39:48.312 | INFO | httprunner.runner:test_start:460 - generate testcase log: E:\PycharmScripts\API\httprunner_demo\logs\970331f1-60e3-44a6-8ac5-a4a7025d7176.run.log .参数param={'username': 'admin1', 'password': 32} 2022-04-02 21:39:48.345 | INFO | httprunner.runner:test_start:451 - Start to run testcase: 参数化数据驱动-列表类型, TestCase ID: 9610def9-ffc4-4245-a122-fb9ed2765a2b 2022-04-02 21:39:48.346 | INFO | httprunner.runner:__run_step:292 - run step begin: 列表类型的数据驱动 >>>>>> httprunner.client:log_print:40 - ================== request details ================== method : GET url : https://www.baidu.com/?username=admin1&password=32 2022-04-02 21:39:48.815 | INFO | httprunner.runner:__run_step:304 - run step end: 列表类型的数据驱动 <<<<<< 2022-04-02 21:39:48.819 | INFO | httprunner.runner:test_start:460 - generate testcase log: E:\PycharmScripts\API\httprunner_demo\logs\9610def9-ffc4-4245-a122-fb9ed2765a2b.run.log .参数param={'username': 'admin2', 'password': 31} 2022-04-02 21:39:48.856 | INFO | httprunner.runner:test_start:451 - Start to run testcase: 参数化数据驱动-列表类型, TestCase ID: 496e0d18-58b4-436f-b3b2-912c2e94f7f2 2022-04-02 21:39:48.857 | INFO | httprunner.runner:__run_step:292 - run step begin: 列表类型的数据驱动 >>>>>> 2022-04-02 21:39:49.779 | DEBUG | httprunner.client:log_print:40 - ================== request details ================== method : GET url : https://www.baidu.com/?username=admin2&password=31
httprunner.runner:__run_step:304 - run step end: 列表类型的数据驱动 <<<<<< 2022-04-02 21:39:49.785 | INFO | httprunner.runner:test_start:460 - generate testcase log: E:\PycharmScripts\API\httprunner_demo\logs\496e0d18-58b4-436f-b3b2-912c2e94f7f2.run.log .参数param={'username': 'admin2', 'password': 32} 2022-04-02 21:39:49.807 | INFO | httprunner.runner:test_start:451 - Start to run testcase: 参数化数据驱动-列表类型, TestCase ID: 275adbf4-eedd-49a4-88ef-20dc4931eca4 2022-04-02 21:39:49.808 | INFO | httprunner.runner:__run_step:292 - run step begin: 列表类型的数据驱动 >>>>>> 2022-04-02 21:39:50.494 | DEBUG | 2022-04-02 21:39:50.496 | DEBUG | httprunner.client:log_print:40 - ================== request details ================== method : GET url : https://www.baidu.com/?username=admin2&password=32
有上面执行结果可知,该测试用例执行了四次 用笛卡尔积组合的话,就是2*2=4种组合执行。
方式二:
from httprunner import HttpRunner,Config,Step,RunRequest import pytest from httprunner import Parameters class TestCaseListOne(HttpRunner): config = ( Config("参数化数据驱动列表类型") .base_url("https://www.baidu.com") .verify(False) ) @pytest.mark.parametrize('param',Parameters({"username":[111,222,333],"password":["admin"]})) def test_start(self,param): super().test_start(param) teststeps = [ Step( RunRequest("列表类型的数据驱动") .get('/') .with_params( **{ "username":"$username", "password":"$password" } ) .validate() .assert_equal('status_code',200) ) ] if __name__ == "__main__": TestCaseListOne().test_start()
执行结果;
由执行结果可以,只执行了三次 应为每次密码是一个,不符合笛卡尔积组合
10.2第二种调用内置parameterize函数读取.csv中的测试数据
username和password就是我们要引用的变量,${parameterize(文件路径)} 就是我们读取的.csv文件的数据源,内置的 parameterize(可简写为P)函数引用 CSV 文件
值得注意的是,通常来说,一个CSV文件中会放多列数值,那么这个时候,各列参数通过“-”连接来读取参数,如:要传postid1、name两列参数,这样写就可以postid1-name: ${P(data/name_password.csv)}csv的路径要使用相对路径,不支持绝对路径不支持\\符号的路径
from httprunner import HttpRunner,Config,Step,RunRequest import pytest from httprunner import Parameters class TestCaseCSV(HttpRunner): config = ( Config("参数化数据驱动CSV类型") .base_url("https://www.baidu.com") .verify(False) ) @pytest.mark.parametrize('param',Parameters({"name-pwd":"${parameterize(data/name_password.csv)}"})) def test_start(self,param): super().test_start(param) teststeps = [ Step( RunRequest("CSV类型的数据驱动") .get('/') .with_params( **{ "username":"$name", "pwd":"$pwd" } ) .validate() .assert_equal('status_code',200) ) ] if __name__ == "__main__": TestCaseCSV().test_start()
第三种是在debugtalk中调用自定义函数
from httprunner import HttpRunner,Config,Step,RunRequest import pytest from httprunner import Parameters class TestCaseDebugtalk(HttpRunner): config = ( Config("参数化数据驱动debugtalk回调") .base_url("https://www.baidu.com") .verify(False) ) @pytest.mark.parametrize('param',Parameters({"username":"${get_username()}"})) def test_start(self,param): super().test_start(param) teststeps = [ Step( RunRequest("debugtalk回调类型的数据驱动") .get('/') .with_params(**{"username":"$username"}) .validate() .assert_equal('status_code',200) ) ] if __name__ == "__main__": TestCaseDebugtalk().test_start()