目前项目中在使用开源框架HTTPRunner,时间使用过程中会用到生成随机信息的方法,如生成随机姓名、随机手机号、身份证号、姓名、地址等。以下对二次开发的过程进行简要描述。

一、需求

1、需要测试的接口:新建患者

2、使用fiddler抓包如下:

这四个接口的功能分别是:

2——获取姓名拼音简写

3——保存患者信息

4——同步数据

5——获取患者处方

3、接口分析

通过查看接口请求参数,需要参数化的信息如下

2中需要传入患者姓名

3中需要传入患者姓名、性别(1,2)、手机号、年龄(1999-09-21)、身份证号、地址

二、设计

分别创建方法,用来随机生成:姓名、性别、手机号、年龄、身份证号和地址

其中

姓名:中文,长度可定制

性别:1男,2女

手机号:

年龄:日期格式xxxx-xx-xx

身份证号:

地址:中文,长度可定制

三、实战

1、导出接口文件,保存为har格式。savePatient.har

2、将导出的har文件转成json格式

har2case savePatient.har savePatient.json

3、在debugtalk.py中增加如下代码

 import os
import random
import string
import time
import datetime # 常用汉字Unicode编码表
StringBase = '\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6'
StringBase = ''.join(StringBase.split('\\u')) def gen_random_name(*args):
'''
author:liuyujie
生成随机姓名
'''
result = ''
# rangestart, rangeend = 2, 5
for i in range(random.randint(args[0], args[1])):
result += random.choice(StringBase)
return result def gen_random_address():
'''
随机生成地址
'''
address = ''
rangestart, rangeend = 10, 30 # 假设地址在10-30个汉字之间
for i in range(random.randint(rangestart, rangeend)):
address += random.choice(StringBase)
return address def gen_random_sex():
'''
随机生成性别:男1,女2
'''
return random.randint(1, 2) def gen_random_date():
'''
随机生成1971年到今天的日期
'''
start_date = (1971, 1, 1, 0, 0, 0, 0, 0, 0) # 设置开始日期时间元组(1976-01-01 00:00:00)
start = time.mktime(start_date) # 生成开始时间戳
end = int(time.time())
t = random.randint(start, end) # 在开始和结束时间戳中随机取出一个
date_touple = time.localtime(t) # 将时间戳生成时间元组
date = time.strftime("%Y-%m-%d", date_touple) # 将时间元组转成格式化字符串(1976-05-21)
return date def gen_random_telephone():
'''
随机生成手机号
'''
prelist = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", ""]
return random.choice(prelist) + "".join(random.choice("") for i in range(8)) def getdistrictcode():
'''
获取地区码
'''
with open(r'E:\xxx\HttpRunner-master\tests\data\districtcode.txt') as file: # 需要下载districtcode.txt文件
data = file.read()
districtlist = data.split('\n')
for node in districtlist:
# print node
if node[10:11] != ' ':
state = node[10:].strip()
if node[10:11] == ' ' and node[12:13] != ' ':
city = node[12:].strip()
if node[10:11] == ' ' and node[12:13] == ' ':
district = node[14:].strip()
code = node[0:6]
codelist.append({"state": state, "city": city, "district": district, "code": code}) def gen_random_ID():
'''
随机生成身份证号
'''
global codelist
codelist = []
if not codelist:
getdistrictcode()
id = codelist[random.randint(0, len(codelist))]['code'] # 地区项
id = id + str(random.randint(1930, 2013)) # 年份项
da = datetime.date.today() + datetime.timedelta(days=random.randint(1, 366)) # 月份和日期项
id = id + da.strftime('%m%d')
id = id + str(random.randint(100, 300)) # ,顺序号简单处理
i = 0
count = 0
weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 权重项
checkcode = {'': '', '': '', '': 'X', '': '', '': '', '': '', '': '', '': '', '': '', '': '',
'': ''} # 校验码映射
for i in range(0, len(id)):
count = count + int(id[i]) * weight[i]
id = id + checkcode[str(count % 11)] # 算出校验码
return id

其中districtcode.txt需要下载,地址如下https://pan.baidu.com/s/1lTwFmtoXKrumL1XtkGLFcg

4、修改json测试用例,使用debugtalk.py中的方法进行参数化

代码示例

"test": {
"name": "/patient/clinicPatient/savePatientFromPad",
"request": {
"params": {
"detail": "{\"body\":{\"synCode\":\"\",\"content\":{},\"param\":{\"id\":\"9cc01ecefb784f03bfcc5a87c3ad6a71\",\"userName\":\"$name\",\"userShortName\":\"$content\",\"birthday\":${gen_random_date()},\"sex\":${gen_random_sex()},\"phone\":${gen_random_telephone()},\"isDelete\":0,\"illHistory\":\"\",\"allergicHistory\":\"\",\"address\":\"\",\"homeAddress\":${gen_random_address()},\"base_version\":\"\",\"totalArrears\":\"0\",\"clinicId\":\"\",\"doctorId\":\"\",\"idCardNo\":${gen_random_ID()},\"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://xxx/patient/clinicPatient/savePatientFromPad",
"method": "GET"
},
"extract": [
{"patientId": "content.body.param.id"} ],
"validate": [
{
"eq": [
"status_code",
200
]
},
{
"eq": [
"headers.Content-Type",
"text/html;charset=UTF-8"
]
}
]
}
},

5、新建脚本入口文件TestBegin.py

代码如下

 from httprunner import HttpRunner

 kwargs = {
"failfast": False,
# "dot_env_path": "/path/to/.env"
}
runner = HttpRunner(**kwargs) runner.run("E:\\xxx\\HttpRunner-master\\tests\\testcases\\savePatient.json")
runner.gen_html_report()
runner.gen_html_report(html_report_name="reportTest",
html_report_template=r"E:\xxx\HttpRunner-master\httprunner\templates\default_report_template.html")

运行结果如下

/myinfo/pinyin4j/converterToFirstSpell
.
/patient/clinicPatient/savePatientFromPad /sync/synchronizeData/synchronizeData
..
/workbench/prescription/findPrescriptionByPatient
.
----------------------------------------------------------------------
Ran 4 tests in 0.285s OK

测试报告如下

在fiddler查看结果

在系统验证结果

一、接口测试——HTTPRunner二次开发之参数化一的更多相关文章

  1. 深入理解基于selenium的二次开发

    对于做web端自动化测试的人来说,可能接触selenium比QTP还要多,但是我们在做基于selenium的二次开发的时候,经常会说到二次开发是为了易于维护,很多人可能不懂得维护的价值是什么,和到底要 ...

  2. SolidWorks二次开发的研究

    三维机械设计软件SolidWorks是一套基于Windows的CAD/CAE/CAM/PDM桌面集成系统,是由美国SolidWorks公司在总结和继承大型机械CAD软件的基础上,在Windows环境下 ...

  3. 基于VB语言对SolidWorks参数化设计的二次开发

    0 引言 随着数字信息化进程的快速推进,如今三维CAD技术在越来越多的企业当中得到运用.为了降低在设计生产中的成本,缩短设计周期,增强企业竞争力,三维参数化技术随之应声,它凭借更贴近现代概念的设计以及 ...

  4. abaqus二次开发概述

    说明 abaqus二次开发概述 导语 用户子程序特点 abaqus用户程序接口与调用方式 abaqus用户子程序分类 常用用户子程序介绍 Refence 说明 本系列文章本人基本没有原创贡献,都是在学 ...

  5. ANSYS-MFC二次开发

    目录 1. 开发流程 2. 开发代码 1. 开发流程 ANSYS-MFC二次开发的思路其实是特别简单的,通常MFC主要是设计界面,然后从MFC界面中读取要设计的参数,然后根据这些设置了的参数生成APD ...

  6. Navisworks API 简单二次开发 (自定义工具条)

    在Navisworks软件运行的时候界面右侧有个工具条.比较方便.但是在二次开发的时候我不知道在Api那里调用.如果有网友知道请告诉我.谢谢. 我用就自己设置一个工具.界面比较丑!没有美工. 代码: ...

  7. [连载]《C#通讯(串口和网络)框架的设计与实现》- 12.二次开发及应用

    目       录 第十二章     二次开发及应用... 2 12.1        项目配制... 3 12.2        引用相关组件... 4 12.3        构建主程序... 5 ...

  8. OBS-Studio二次开发记录

    OBS-Studio 是一款跨平台的,开源的视频直播客户端软件. 公司需要对他进行二次开发,开发的目的是使用它的录屏功能. 开发的要求是:定制全新的界面,所见即所得,window系统兼容要好. 开发步 ...

  9. 小猪cms微信二次开发之怎样分页

    $db=D('Classify'); $zid=$db->where(array('id'=>$this->_GET('fid'),'token'=>$this->tok ...

随机推荐

  1. 深刻理解render 和 redirect_to

    深刻理解render 和 redirect_to http://www.blogjava.net/fl1429/archive/2009/03/12/259403.html 由于最近老是在表单提交后出 ...

  2. ListView多选和单选模式重新整理

    超简单的单选和多选ListView 在开发过程中,我们经常会使用ListView去呈现列表数据,比如商品列表,通话记录,联系人列表等等,在一些情况下,我们还需要去选择其中的一些列表数据进行编辑.以前, ...

  3. javah生成带有包名的头文件

    无包名情况 多数的demo都是基于这种条件,假设在目录jni/下有一个包含native方法的文件Hello.class.进入jni/目录,直接执行javah Hello,就可以在jni/目录下生成文件 ...

  4. uboot中添加自定义命令

    uboot中可以通过修改源程序来添加自定义命令,进一步扩展uboot的功能. 我想在uboot下添加一条新的命令(名为varcpy),用来拷贝uboot中的环境变量. 修改方式如下: 创建新文件com ...

  5. c语言学习的第13天1

    #include <stdio.h> int main(void) { int a[5]={1,2,3,4,5}; printf("%#x, %#x\n",a,& ...

  6. laravel基础课程---8、laravel响应和视图(响应是什么)

    laravel基础课程---8.laravel响应和视图(响应是什么) 一.总结 一句话总结: 就是向请求返回的响应数据(一般为html(视图),当然也可以是变量值):所有的路由及控制器必须返回某个类 ...

  7. 重新拾取:ASP.NET Core WebApi 使用Swagger支持授权认证

    园子里已经有很多.NET Core 集成Swagger的文章,但对于使用授权的介绍蛮少的. public static class SwaggerServiceExtensions { public ...

  8. listen 66

    Frog Species Found in Big Apple Scientists discover new species all the time—on the order of 15,000 ...

  9. oracle Instant Client install

    Installation See the Instant Client Home Page for more information. Installation of ZIP files: 1. Do ...

  10. <C++>友元与虚函数的组合

    为类重载<<与>>这两个运算符时,重载函数必须为该类的友元函数. 当友元不能被继承,故不能当作虚函数,无法使用多态. 可以用以下结构实现友元与虚函数的组合. class bas ...