最近了解到大疆有一款开源的测试工具HttpRunner,可以用于自动化测试和性能测试。先下载了源码,结合HttpRunner文档,实战了下自动化测试部分功能。工具编码风格及自动化测试思路都值得借鉴。提供简洁编写自动化用例的方式,用例编写技术要求低、而且简洁易写。
有网络安装:pip install httprunner (pip install -U httprunner,-U表示升级,第一次装不需要-U),会自动安装需要的相应包,比如har2case等。
无网络安装:需要复制requests/PyYAML/Jinja2/har2case/cocorama/colorlog/requests_toolbelt等包(具体见源码setup.py中install_requires项)到python27对应site-packages目录,如果只是拷贝包,无法使用hrun命令,需要下载源码切换到setup.py目录,python setup.py install,安装,即可使用hrun、har2case命令。
使用命令 har2case -V,hrun -V ,或者--version可查看对应版本。
Httprunner 不仅支持Python3 .4+,2.7也可以,可见setup.py中python_requires。
Charles抓包testerhome,右键export请求,存为har格式。
或者Fiddler抓包,导出session,存为HTTPArchive(har)格式文件。
hrun --startproject demo 脚手架功能快速创建项目目录结构,具有测试用例分层机制。
har2case testdemo.har 默认在当前目录生成json文件
har2case testdemo.hartestdemo.yml 生成yaml文件
hrun testdemo.yml 运行yml用例
hrun demo.yml —failfast 失败后不再执行后面步骤。
hrun testcases/testdemo.yml --failfast --log-level debug 运行testcases目录里的testdemo.yml用例,遇到失败用例停止执行,debug模式会在命令框输出更详细信息。
注意:必须在项目目录中debugtalk.py同层目录执行hrun,har2case等命令。
上述命令可以和jenkins结合起来。持续部署。
1、封装底层函数。
2、引入全局变量,import os,os.environ("xxx"),可以引入存在.env文件中的变量。
.env文件:
debugtalk.py:
后面可以使用$Env变量,值为st1。
保存生成的测试报告html文件。
保存全局数据,比如环境、密码等。
保存用例,yaml或者json格式文件。
用例分层机制,保存具体接口调用、传参、校验等方法,供testcases中testcase使用。
测试套件,包含多个测试用例。
- config:
name: testset description
parameters:
- custName: [张一]
- var1-var2-var3: ${P(data/t0.csv)}
- var4-var5: ${func1()}
variables:
- {mobile: "${autoGenMobile()}"}
- {idno: "${autoGenIdNo()}"}
- {db: dbname}
requests:
base_url: http://httpbin-$url_env.api.xxx.cn
headers:
Content-Type: application/x-www-form-urlencoded
EnvParams: $EnvParams
User-Agent: Mozilla/5.0 ……
setup_hooks: ['${hook_print(setup)}']
teardown_hooks: ['${hook_print(teardown)}']
output: [mobile]
- test:
name: 加密手机号
api: encrypt($mobile,MOBI_NO)
extract:
-{encrypt_mobile: content}
- test:
name: /register/xxxx.json
api: xxxx($mobile,$S)
variables:
- {mobile: $mobile}
- {S: '${get_s()}'}
extract:
- {cookies: headers.Set-Cookie}
validate:
- eq: [content.ret,'0']
config是当前用例的全局数据,test是每一个测试步骤,
可以通过$变量名的方式使用任何全局变量,可以通过格式${funcname($xx,$xx)}使用定义在debugtalk.py 的函数。
extract:提取当前测试步骤返回值内容作为全局变量,比如headers.content-type,content.ret等。
validate:校验,eq. 多种形式,见httprunner源码例子。
validate:
- eq: ["status_code",200]
- assert_status_code_is_200: ["status_code"]
- {"check": "content.success","comparator": "eq","expect": false}
- startswith: [content.User-Agent,"python-requests"]
api:用例分层,对单个接口进行封装,减少改动,
- api:
def : xxxx($mobile,$S)
request:
url: http://xx-$url_env.xx.cn/xxx/xxx.json
method: POST
headers:
Cookies: ""
params:
_s: $S
data:
mobile: $mobile
validate:
- eq: ["status_code",200]
api作为第一层,多个api组成的testcase作为第二层,可以作为一个suite,第三层调用suite。
在调用api的testcase config中加一行 def suitename($xx,$xx),此testcace 可以作为testsuite调用。
另一文件中:
setup_hooks:[],teardown_hooks:[],config中:用例执行前后执行的方法;test中 每个测试步骤前后执行的方法。
httprunner不支持函数里嵌函数(函数参数为函数的形式)---可用api实现,api参数为变量,参数可以为函数执行后的值;
函数参数可以是$方式执行或者需要替换的变量;
teststep中局部变量会替换全局config变量;
用例步骤中 times 表示执行次数;
httprunner buit_in.py里有很多自定义函数,相当于debugtalk.py中自定义方法,可以直接使用。
url中可以用变量$变量名:
requests:
base_url:http://httpbin-$url_env.api.xxx.cn
yml文件编写注意事项:字典的冒号要空格,变蓝色才行;列表的-也要空格,见下图:
env中定义的变量,在debugtalk中import os os.environ的方式设为全局变量才能使用。
http_client_session 问题:调用其他url,会保存session,会带入到同一个用例的下一个http请求中;
如果需要新建session,可以在封装的api中,指定headers Cookie:“”为空。
config headers中信息是全局的,测试步骤中如果不指定对应headers项,会使用config中默认值。
parameters中变量的值,多个变量间会用笛卡尔积(两两组合)的方式传参作为一个用例。
csv文件第一行是变量名,第二行开始是数据,${P(xx.csv)}中第一行变量名必须包括要赋值给的变量名。
变量名间用短横线分隔,用函数生成数据时,可对应赋值。但是函数只会执行一次,生成数据,然后用于笛卡尔积组合参数。
- config:
name:"demo"
parameters:
- user_agent: ["iOS/10.1","iOS/10.2","iOS/10.3"]
- user_id: ${P(user_id.csv)}
- username-password: ${get_account(10)}#注意函数返回值格式必须为 - a-b时[{'a':1,'b':1},{'a':2,'b':2}],为了与csv数据格式兼容
测试报告与用例suite执行采用unittest模式。
参考文档:httprunner中文使用手册:https://cn.httprunner.org