HTTPRunner实践二——数据驱动
基于文档http://cn.httprunner.org/advanced/data-driven/

场景一:用例集+独立参数+参数列表
1、原始用例文件savePatient_01.yml
- config:
name: 患者管理-新增患者
request:
base_url: 'http://192.168.14.76:8080'
headers:
User-Agent: null
variables: []
- test:
name: /myinfo/pinyin4j/converterToFirstSpell
request:
method: GET
params:
detail: '{"body":{"synCode":"","content":{},"param":{"name":"施耐庵"},"code":{}},"header":{"v":"v_pc_1.0.3.24","doctorMainId":"ff80808162bc9a2f0162f1c2322627ab","clinicId":"8a9a9c745f9b87c3015fdcc1e36b4271","type":"4","imei":"661D-6DF1-B196-3DFE-DE7D-3A01-3AA1-471F","userToken":"20180803105231387f8ueqor"}}'
url: http://192.168.14.76:8080/myinfo/pinyin4j/converterToFirstSpell
validate:
- eq:
- status_code
- 200
- eq:
- headers.Content-Type
- text/html;charset=UTF-8
2、分析
需要参数化的数据,患者姓名name,如上红色加粗部分。
步骤
1、在config模块中,将需要参数化的数据name,配置为全局参数,并使用列表赋值。
parameters:
- name: ["杜甫", "曹雪芹", "施耐庵"]
2、在test请求中引用name的地方,使用参数替换${name}
params:
detail: '{"body":{"synCode":"","content":{},"param":{"name":"$name"},"code":{}},"header":{"v":"v_pc_1.0.3.24","doctorMainId":"ff80808162bc9a2f0162f1c2322627ab","clinicId":"8a9a9c745f9b87c3015fdcc1e36b4271","type":"4","imei":"661D-6DF1-B196-3DFE-DE7D-3A01-3AA1-471F","userToken":"20180803105231387f8ueqor"}}'
url: http://192.168.14.76:8080/myinfo/pinyin4j/converterToFirstSpell
3、断言中如有需要验证name的地方,也进行替换
validate:
- eq:
- status_code
- 200
- eq:
- content.body.code
- ""
- eq:
- content.body.param.name
- $name
全部代码实例:
- config:
name: 患者管理-新增患者
request:
base_url: 'http://192.168.14.76:8080'
headers:
User-Agent: null
variables: []
parameters:
- name: ["杜甫", "曹雪芹", "施耐庵"]
- test:
name: /myinfo/pinyin4j/converterToFirstSpell
request:
method: GET
params:
detail: '{"body":{"synCode":"","content":{},"param":{"name":"$name"},"code":{}},"header":{"v":"v_pc_1.0.3.24","doctorMainId":"ff80808162bc9a2f0162f1c2322627ab","clinicId":"8a9a9c745f9b87c3015fdcc1e36b4271","type":"4","imei":"661D-6DF1-B196-3DFE-DE7D-3A01-3AA1-471F","userToken":"20180803105231387f8ueqor"}}'
url: http://192.168.14.76:8080/myinfo/pinyin4j/converterToFirstSpell
validate:
- eq:
- status_code
- 200
- eq:
- content.body.code
- ""
- eq:
- content.body.param.name
- $name
4、运行代码,查看结果
场景二、用例集+关联参数+参数列表
1、找到需要参数化的信息
姓名-缩写-出生日期-性别
2、config中配置参数
parameters:
- userName-userShortName-birthday-sex:
- ["李白","LB","1988-09-09",1]
- ["白居易","BJY","1978-05-09",1]
- ["杜牧","DM","1998-03-09",1]
3、替换参数
request:
method: GET
params:
detail: '{"body":{"synCode":"","content":{},"param":{"id":"9cc01ecefb784f03bfcc5a87c3ad6a71","userName":"$userName","userShortName":"$userShortName","birthday":"$birthday","sex":$sex,"phone":"18911572511","isDelete":0,"illHistory":"","allergicHistory":"","address":"","homeAddress":"","base_version":"","totalArrears":"0","clinicId":"","doctorId":"","idCardNo":"","agency":"","folk":"","validitytime":"","fingerPrint":"0","deviceType":"0","diagnose":"","patientSource":""},"code":{}},"header":{"v":"v_pc_1.0.3.24","doctorMainId":"ff80808162bc9a2f0162f1c2322627ab","clinicId":"8a9a9c745f9b87c3015fdcc1e36b4271","type":"4","imei":"661D-6DF1-B196-3DFE-DE7D-3A01-3AA1-471F","userToken":"20180803105231387f8ueqor"}}'
url: http://192.168.14.76:8080/patient/clinicPatient/savePatientFromPad
4、优化断言
validate:
- eq:
- status_code
- 200
- eq:
- content.body.code
- ""
- eq:
- content.body.param.userName
- $userName
完整代码
- config:
name: 患者管理-新增患者
parameters:
- userName-userShortName-birthday-sex:
- ["李白","LB","1988-09-09",1]
- ["白居易","BJY","1978-05-09",1]
- ["杜牧","DM","1998-03-09",1]
request:
base_url: 'http://192.168.14.76:8080'
headers:
User-Agent: null
variables: [] - test:
name: /patient/clinicPatient/savePatientFromPad
request:
method: GET
params:
detail: '{"body":{"synCode":"","content":{},"param":{"id":"9cc01ecefb784f03bfcc5a87c3ad6a71","userName":"$userName","userShortName":"$userShortName","birthday":"$birthday","sex":$sex,"phone":"18911572511","isDelete":0,"illHistory":"","allergicHistory":"","address":"","homeAddress":"","base_version":"","totalArrears":"0","clinicId":"","doctorId":"","idCardNo":"","agency":"","folk":"","validitytime":"","fingerPrint":"0","deviceType":"0","diagnose":"","patientSource":""},"code":{}},"header":{"v":"v_pc_1.0.3.24","doctorMainId":"ff80808162bc9a2f0162f1c2322627ab","clinicId":"8a9a9c745f9b87c3015fdcc1e36b4271","type":"4","imei":"661D-6DF1-B196-3DFE-DE7D-3A01-3AA1-471F","userToken":"20180803105231387f8ueqor"}}'
url: http://192.168.14.76:8080/patient/clinicPatient/savePatientFromPad
validate:
- eq:
- status_code
- 200
- eq:
- content.body.code
- ""
- eq:
- content.body.param.userName
- $userName
5、运行查看结果
场景三、用例集+关联参数+CSV文件
1、特别注意:
对于 CSV 数据文件,需要遵循如下几项约定的规则:
- 文件需放置在与测试用例文件相同的目录中;
- CSV 文件中的第一行必须为参数名称,从第二行开始为参数值,每个(组)值占一行;
- 若同一个 CSV 文件中具有多个参数,则参数名称和数值的间隔符需实用英文逗号。
- 文件中如何含有中文,需要保存为UTF-8格式
2、步骤
1)新建CSV文件,命名为patientInfo.csv,编码方式UTF-8
userName,userShortName,birthday,sex
莫言,MY,2011-01-09,1
吴佩慈,WPC,1996-09-08,2
2) 在config模块中,配置参数
parameters:
- userName-userShortName-birthday-sex: ${P(patientInfo.csv)}
3)在test模块中,替换参数
request:
method: GET
params:
detail: '{"body":{"synCode":"","content":{},"param":{"id":"9cc01ecefb784f03bfcc5a87c3ad6a71","userName":"$userName","userShortName":"$userShortName","birthday":"$birthday","sex":$sex,"phone":"18911572511","isDelete":0,"illHistory":"","allergicHistory":"","address":"","homeAddress":"","base_version":"","totalArrears":"0","clinicId":"","doctorId":"","idCardNo":"","agency":"","folk":"","validitytime":"","fingerPrint":"0","deviceType":"0","diagnose":"","patientSource":""},"code":{}},"header":{"v":"v_pc_1.0.3.24","doctorMainId":"ff80808162bc9a2f0162f1c2322627ab","clinicId":"8a9a9c745f9b87c3015fdcc1e36b4271","type":"4","imei":"661D-6DF1-B196-3DFE-DE7D-3A01-3AA1-471F","userToken":"20180803105231387f8ueqor"}}'
url: http://192.168.14.76:8080/patient/clinicPatient/savePatientFromPad
4)运行代码,查看结果
完整代码实例
- config:
name: 患者管理-新增患者
parameters:
- userName-userShortName-birthday-sex: ${P(patientInfo.csv)} request:
base_url: 'http://192.168.14.76:8080'
headers:
User-Agent: null
variables: [] - test:
name: /patient/clinicPatient/savePatientFromPad
request:
method: GET
params:
detail: '{"body":{"synCode":"","content":{},"param":{"id":"9cc01ecefb784f03bfcc5a87c3ad6a71","userName":"$userName","userShortName":"$userShortName","birthday":"$birthday","sex":$sex,"phone":"18911572511","isDelete":0,"illHistory":"","allergicHistory":"","address":"","homeAddress":"","base_version":"","totalArrears":"0","clinicId":"","doctorId":"","idCardNo":"","agency":"","folk":"","validitytime":"","fingerPrint":"0","deviceType":"0","diagnose":"","patientSource":""},"code":{}},"header":{"v":"v_pc_1.0.3.24","doctorMainId":"ff80808162bc9a2f0162f1c2322627ab","clinicId":"8a9a9c745f9b87c3015fdcc1e36b4271","type":"4","imei":"661D-6DF1-B196-3DFE-DE7D-3A01-3AA1-471F","userToken":"20180803105231387f8ueqor"}}'
url: http://192.168.14.76:8080/patient/clinicPatient/savePatientFromPad
validate:
- eq:
- status_code
- 200
- eq:
- content.body.code
- ""
- eq:
- content.body.param.userName
- $userName
场景四、用例+关联参数+CSV文件
将场景三中,config中的参数配置,移到到test模块即可

场景五、用例集+关联参数+自定义函数生成列表
特别注意:需要注意的是,在自定义函数中,生成的参数列表必须为 list of dict 的数据结构,该设计主要是为了与 CSV 文件的处理机制保持一致。
1、在 debugtalk.py 中定义函数 get_patient_info,可生成指定数量的参数列表。
def get_patient_info(num):
patients = []
for index in range(1, num+1):
patients.append(
{"userName": gen_random_name(), "sex": gen_random_sex(),"birthday":gen_random_date()},
) return patients
其中:gen_random_name()、gen_random_sex()、gen_random_date()是上面定义的方法
那么在 YAML/JSON 的 parameters 中就可以调用自定义函数生成指定数量的参数列表。
parameters:
- userName-sex-birthday-sex: ${get_patient_info(3)}
HTTPRunner实践二——数据驱动的更多相关文章
- HTTPRunner实践二——参数化之生成UUID
接口测试中,需要使用到UUID,用来生成唯一ID. 1.什么是UUID UUID是128位的全局唯一标识符,通常由32字节的字符串表示.它可以保证时间和空间的唯一性,也称为GUID,全称为:UUID ...
- ASP.NET MVC5 网站开发实践(二) Member区域–管理列表、回复及删除
本来想接着上次把这篇写完的,没想到后来工作的一些事落下了,放假了赶紧补上. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NET MVC5 网站开发实践(一) - 项目框架 ASP ...
- ASP.NET MVC5 网站开发实践(二) Member区域–我的咨询列表及添加咨询
上次把咨询的架构搭好了,现在分两次来完成咨询:1.用户部分,2管理部分.这次实现用户部分,包含两个功能,查看我的咨询和进行咨询. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NE ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 咨询管理的架构
咨询.留言.投诉等功能是网站应具备的基本功能,可以加强管理员与用户的交流,在上次完成文章部分后,这次开始做Member区域的咨询功能(留言.投诉都是咨询).咨询跟文章非常相似,而且内容更少.更简单. ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 修改及删除文章
上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据. 目录: ASP.N ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 全部文章列表
显示文章列表分两块,管理员可以显示全部文章列表,一般用户只显示自己的文章列表.文章列表的显示采用easyui-datagrid.后台需要与之对应的action返回json类型数据 目录 ASP.N ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章
上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 文章管理架构
上次把member的用户部分完成,现在开始做文章管理部分.文章部分根据涉及显示现实文章列表,发布文章,修改文章,删除文章等功能.最终的实现目标是使用权限来控制用户是否能进行相应操作,管理员权限的会显示 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(3)修改资料、修改密码
在上一篇博客中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录IP,这次补上.今天做修改资料和修改密码,TryUpdateModel是新用到的东西. 目录: AS ...
随机推荐
- 线性结构2 一元多项式的乘法与加法运算 【STL】
02-线性结构2 一元多项式的乘法与加法运算(20 分) 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和 ...
- eslint 配合 git (husky)
为了保证每次提交的 git 代码是正确的,为此我们可以使用 eslint 配合 git hook, 在进行git commit 的时候验证eslint规范 如果 eslint 验证不通过,则不能提交. ...
- 多线程(三) iOS中的锁
锁的类别:互斥锁,递归锁,条件锁,自旋锁等 锁的实现方式:NSLock,NSRecursiveLock, NSConditionLock,@synchronized,GCD的信号量等 下面说一下常用的 ...
- BZOJ 1650 [Usaco2006 Dec]River Hopscotch 跳石子:二分
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1650 题意: 数轴上有n个石子,第i个石头的坐标为Di,现在要从0跳到L,每次条都从一个石 ...
- RQNOJ 140 分配时间:dp
题目链接:https://www.rqnoj.cn/problem/140 题意: 小王参加的考试是几门科目的试卷放在一起考,一共给t分钟来做. 他现在已经知道第i门科目花k分钟可以拿到w[i][k] ...
- JS事件派发器EventEmitter
原文地址:http://zhangyiheng.com/blog/articles/js_event_mitter.html 需求 随着Browser客户端JS越来越复杂,MVC(Client端)设计 ...
- Apache Flink vs Apache Spark——感觉二者是互相抄袭啊 看谁的好就抄过来 Flink支持在runtime中的有环数据流,这样表示机器学习算法更有效而且更有效率
Apache Flink是什么 Flink是一款新的大数据处理引擎,目标是统一不同来源的数据处理.这个目标看起来和Spark和类似.没错,Flink也在尝试解决 Spark在解决的问题.这两套系统都在 ...
- RabbitMQ消息队列随笔
本文权当各位看官对RabbitMQ的基本概念以及使用场景有了一定的了解,如果你还对它所知甚少或者只是停留在仅仅是听说过,建议你先看看这篇文章,在对RabbitMQ有了基本认识后,我们正式开启我们的Ra ...
- Nginx HTTP Server相关
一.Nginx安装: 采取手动编译安装 对多种重要的选项进行配置 安装前提:常用工具和库,GCC PCRE(Rewrite模块需要) pcre-devel(源码) zlib zlib-devel(源码 ...
- django-crontab 定时执行任务方法
需求 每天请求一封邮件,并读取该邮件 这个其实可以使用linux 自带了crontab实现,但是毕竟是django 开发.想着不知道有没有方法可以从django 中实现. 简单搜索了下,这方面的方法确 ...