小编是在去年开始了解并使用httprunner进行接口自动化测试,httprunner是一个开源框架,使用yaml、json文件编写测试用例,进行接口测试。
今年Httprunner已经更新至2.X版本,这次更新进行了很大的变动,因为团队年初决定做自己的接口自动化框架,小编也没有再继续进行学习使用了,再此对于Httprunner 1.X版本进行一次分享(1.X版本仍可使用,2.X版本对于层次理念上进行了大的调整,但是看官方文档对于基础的使用还是没有变化的,可以作为2.X版本使用的一个了解)
Httprunner对于requests模块、locust模块进行了良好的封装使用,但是因此个人也觉得受到了很多限制,这也是团队决定做自己的接口测试框架的原因
官方文档 https://cn.httprunner.org/
一、安装
安装Httprunner
- 使用pip安装
pip3 install httprunner==1.5.15
- 或者easy_install安装
easy_install httprunner
- 安装校验
hrun -V
har2case -V
安装locust用于性能测试
使用pip安装
pip3 install locustio
安装PyCharm
因为Httprunner的是使用python编写的,所以就安装了编辑器(大家可以根据自己的喜好安装编辑器)
- 将其移动到想要安装的目录,然后解压
tar xvfz pycharm-community-2017.3.2.tgz
- 启动编辑器
cd xxxxx安装目录/bin;
./pycharm.sh
- 汉化PyCharm
sudo apt-get install git 安装git用于克隆汉化包
git clone https://github.com/ewen0930/PyCharm-Chinese 克隆汉化包
cd xxxx(具体的下载目录)/PyCharm-Chinese
bash package.cmd 设置bash环境
sudo cp resources_zh.jar xxxxxx(pycharm具体安装的目录)/lib 之后重启pycharm
二、构建项目
- 建议直接使用脚手架
hrun --startproject apitest(实际的项目名称)
注意修改脚手架生成的时testsuite为suite
- 默认项目架构
-api
----根据具体项目拆分文件夹
-suite(脚手架生成的时testsuite需要改为suite)
----根据具体项目拆分文件夹
-testcase
----根据具体项目拆分文件夹
-.env
-debugtalk.py
三、项目架构介绍
- 层次介绍
* api层(httprunner的基本层次):放置所有的api,并将其参数化。根据不同的项目-模块分层保存
* 数据层:所有需要访问业务数据库的方法文件
* 报告层(httprunner的基本层次):测试报告存放位置
* 方法层:httprunner的所有方法需要在根目录的debugtalk.py文件,为了便于维护简化debugtalk文件,只做一层方法引用(根据需要适当增加处理),所有方法存放于方法层
* suite层(httprunner的基本层次):对于某些可固定的流程用例,做成套件
* 测试用例层(httprunner的基本层次):通过api、suite、传参等其他处理组合成测试用例,用于最终执行
- 结构如下:
xxxx(项目名称)
|-- api ## 该文件夹存放所有接口使用的方法
`-- common ## 该文件夹存放所有基础通用方法
`-- data ## 该文件夹存放所有需要的测试数据(对应的导入方法),测试数据生成的脚本
`-- create_data ##数据生成器,通过随机数、任意选择等当时生成用例所需的数据
`-- mysql ##数据库方法,对于测试过程中需要‘增删改查’数据库的操作
`-- docs ## 该文件夹存放所有的文件、图片等文件
`-- reports ## 该文件夹存放自动生成的测试报告
`-- testsuite ## 该文件夹存放所有测试模块
`-- testcases ## 该文件夹存放所有测试用例
`-- .env ## 该文件写所有的环境配置数据
`-- debugtalk.py ## 该文件定义所有api、测试模块、测试用例用到的方法
`-- requirements.txt ## 该文件记录所有需要用的框架(以便更换环境一键安装)
四、具体编写方法
小编推荐直接查看官网,讲解非常清楚 https://cn.httprunner.org/
五、具体编写注意(小编踩过的坑)
1、分层
该框架分为api(接口)、suite(模块)、test(测试步骤)、config(测试用例)
api->suite->test->config
api->test->config
由于分层结构,所以影响hook机制的使用
- 当api中使用hook,则suite、test中将不再可以使用hook(使用也是无效的,运行时不会跑这一块代码)
- 当suite使用hook,则test中将不再可以使用hook(使用也是无效的,运行时不会跑这一块代码)
- 一个测试用例中,最后一个步骤已经使用hook机制,config处的teardown_hooks基本也是无效的(目前邮件可用)
- 所以api处尽量不使用hook。将hook机制用于测试步骤、用例中
2、参数
- 如果在config中使用parameters引入数据,则取值必须时数组形式[{“a”,“b”,“c”}]
- 如果在config中使用variables引入数据,则直接取值"a"
- 如果在test中使用variables引入数据,则直接取值"a"
- 数组类型
config中使用parameters(全局参数),需要将数据转化为数组类型 - int类型
test中的json实际使用中,参数为int类型时,需要将数据转化为int类型 - string类型
config、test中使用variables(全局变量),需要将数据转化为string类型
python中通过函数传入的非数字,默认string类型
python中通过函数传入的数字,默认是int类型
利用函数引用数据
在debugtalk.py中使用函数取相应的值
注意:由于上一个脚本获取到的是字符串类型,如果有些参数是整数类型,取值时需要将字符串转化为需要的类型;
同时注意:如果接口参数中“”传输的字符,不需要转化即使是数字。接口参数中不加“”的类型,使用int()方法转化即可。
此处的转化主要取绝于测试步骤有没有加”“,另:如果某参数用于url,不需要将其转化类型,字符串类型即可,框架会自动识别
def get_loan_days():
return [{"loan_days": int(new_mysql.GetMysqlData(loan_days}]
- 在测试用例config部分添加引入,并在具体测试步骤中引用具体数据
- config:
parameters:
- loan_days: ${get_loan_days()}
- 具体步骤中引用
$loan_days
3、引用
api、suite引用
- 由于引用均使用的是def方法,所以api、suite都是可以使用参数方法的使用场景:某一接口用于两种类型的操作。可以将类型写为参数。在测试步骤中引用xxx(xx)即可
- api中使用参数化方式,某些值选择有函数传入时,注意参数命名一定要与方法中的任何字段不同(并且字段中不能包含参数名)例:api中有1个字段为is_first,参数化时命名绝不能使用is、first
方法引用
该框架所有测试步骤、用例中使用的方法均需要再debugtalk文件中声明
所以方法引用规则:
具体的方法要单独一个文件来编写
在debugtalk文件中声明(推荐只做声明,或嵌套参数传出方法)
4、运行
由于报告会自动生成,所以需要cd到项目内部,再hrun xxx.yml。这样报告会显示在项目内的报告文件夹中,否则会自动创建一个文件夹存储
六、样例
api.yml
- api:
def: api_aa_bb_POST()
name: xxxx
request:
headers: {"Content-Type":"application/json"}
url: $gwhost/xxxx/xxxx/xxxx
method: POST
json:
{
"phone":"$phone"
}
validate:
- eq: ["ok", true]
- eq: ["reason", OK]
suite.yml
- config:
def: suite_bb_cc()
name: xxxx
- test:
name: xxxx
api: api_xxxx_xxxx_POST()
case.yml
- config:
name: xxxxxxxxx
parameters:
- phone: ${get_p2g_smoke_main_test_data(phone)}
- password: ${get_p2g_smoke_main_test_data(password)}
- test:
name: xxxxx
api: api_aa_bb_POST()
- test:
name: xxxxx
suite: suite_bb_cc()
- test:
name: xxxxx
variables:
- order_no: ${get_approval_applications_from_customer_id_order_no(SMS, $phone)}
api: api_management_peso2goUpdateAuditingResult()
setup_hooks:
- ${get_approval_applications_from_order_no_application_status($order_no)}
teardown_hooks:
- ${hook_sleep(60)}
- ${get_core_loans_from_order_no_repay_status($order_no)}