摘抄:今天给大家分享一个简单的python脚本,使用python进行http的接口测试,脚本很简单,逻辑是:读取excel写好的测试用例,然后根据excel中的用例内容进行调用,判断预期结果中的返回值是否和返回报文中的值一致,如果不一致则根据用例标题把bug提交到bug管理系统,这里使用的bug管理系统是bugfree。

实现步骤:

1、读取excel,保存测试用例中的内容;

2、根据excel中的请求url和参数拼接请求报文,调用接口,并保存返回报文;

3、读取返回报文,和预期结果对比,不一致的往bugfree数据库中写入一条bug,并且把请求报文、返回报文和测试结果写到测试用例的excel中。

http接口最常用的两种请求方式,POST和GET两种方法,请求都是类似下面例子的url。

例子:http://127.0.0.1:8080/rest/login?oper_no=marry&id=10

需要用的到几个模块,requests、xlrd(读取excel)、xlutils(写excel)、MySQLdb(连接数据库)这四个模块都是第三方模块,需要自己单独安装,用到的一些python中的方法和内置函数也都做了说明,本文使用的python版本是python2.7。

首先先写好excel的用例模板,需要有的字段 项目、用例id、接口名称、用例描述、请求方式、url请求地址、请求参数(多个的参数话用;分号隔开)、结果验证(多个的参数话用;分号隔开)、请求报文、返回报文、测试人员、测试结果

整体代码如下,注释加的很详细了,有不明白的可以给我留言

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

# -*- coding:utf-8 -*-

importrequests,xlrd,MySQLdb,time,sys

#导入需要用到的模块

fromxlutils importcopy

#从xlutils模块中导入copy这个函数

defreadExcel(file_path):

'''

读取excel测试用例的函数

:param file_path:传入一个excel文件,或者文件的绝对路径

:return:返回这个excel第一个sheet页中的所有测试用例的list

'''

try:

book=xlrd.open_workbook(file_path)#打开excel

exceptException,e:

#如果路径不在或者excel不正确,返回报错信息

print'路径不在或者excel不正确',e

returne

else:

sheet=book.sheet_by_index(0)#取第一个sheet页

rows=sheet.nrows#取这个sheet页的所有行数

case_list=[]#保存每一条case

foriinrange(rows):

ifi!=0:

#把每一条测试用例添加到case_list中

case_list.append(sheet.row_values(i))

#调用接口测试的函数,把存所有case的list和excel的路径传进去,因为后面还需要把返回报文和测试结果写到excel中,

#所以需要传入excel测试用例的路径,interfaceTest函数在下面有定义

interfaceTest(case_list,file_path)

definterfaceTest(case_list,file_path):

res_flags=[]

#存测试结果的list

request_urls=[]

#存请求报文的list

responses=[]

#存返回报文的list

forcase incase_list:

'''

先遍历excel中每一条case的值,然后根据对应的索引取到case中每个字段的值

'''

try:

'''

这里捕捉一下异常,如果excel格式不正确的话,就返回异常

'''

#项目,提bug的时候可以根据项目来提

product=case[0]

#用例id,提bug的时候用

case_id=case[1]

#接口名称,也是提bug的时候用

interface_name=case[2]

#用例描述

case_detail=case[3]

#请求方式

method=case[4]

#请求url

url=case[5]

#入参

param=case[6]

#预期结果

res_check=case[7]

#测试人员

tester=case[10]

exceptException,e:

return'测试用例格式不正确!%s'%e

ifparam=='':

'''

如果请求参数是空的话,请求报文就是url,然后把请求报文存到请求报文list中

'''

new_url=url#请求报文

request_urls.append(new_url)

else:

'''

如果请求参数不为空的话,请求报文就是url+?+参数,格式和下面一样

http://127.0.0.1:8080/rest/login?oper_no=marry&id=100,然后把请求报文存到请求报文list中

'''

new_url=url+'?'+urlParam(param)#请求报文

'''

excel里面的如果有多个入参的话,参数是用;隔开,a=1;b=2这样的,请求的时候多个参数要用&连接,

要把;替换成&,所以调用了urlParam这个函数,把参数中的;替换成&,函数在下面定义的

'''

request_urls.append(new_url)

ifmethod.upper()=='GET':

'''

如果是get请求就调用requests模块的get方法,.text是获取返回报文,保存返回报文,

把返回报文存到返回报文的list中

'''

printnew_url

results=requests.get(new_url).text

printresults

responses.append(results)

'''

获取到返回报文之后需要根据预期结果去判断测试是否通过,调用查看结果方法

把返回报文和预期结果传进去,判断是否通过,readRes方法在下面定义了。

'''

res=readRes(results,res_check)

else:

'''

如果不是get请求,也就是post请求,就调用requests模块的post方法,.text是获取返回报文,

保存返回报文,把返回报文存到返回报文的list中

'''

results=requests.post(new_url).text

responses.append(results)

'''

获取到返回报文之后需要根据预期结果去判断测试是否通过,调用查看结果方法

把返回报文和预期结果传进去,判断是否通过,readRes方法会返回测试结果,如果返回pass就

说明测试通过了,readRes方法在下面定义了。

'''

res=readRes(results,res_check)

if'pass'inres:

'''

判断测试结果,然后把通过或者失败插入到测试结果的list中

'''

res_flags.append('pass')

else:

res_flags.append('fail')

'''

如果不通过的话,就调用写bug的方法,把case_id、接口名称、请求报文、返回报文和预期结果传进去

writeBug方法在下面定义了,具体实现是先连接数据库,然后拼sql,插入到bug表中

'''

writeBug(case_id,interface_name,new_url,results,res_check)

'''

全部用例执行完之后,会调用copy_excel方法,把测试结果写到excel中,

每一条用例的请求报文、返回报文、测试结果,这三个每个我在上面都定义了一个list

来存每一条用例执行的结果,把源excel用例的路径和三个list传进去调用即可,copy_excel方

法在下面定义了,也加了注释

'''

copy_excel(file_path,res_flags,request_urls,responses)

defreadRes(res,res_check):

'''

:param res: 返回报文

:param res_check: 预期结果

:return: 通过或者不通过,不通过的话会把哪个参数和预期不一致返回

'''

'''

返回报文的例子是这样的{"id":"J_775682","p":275.00,"m":"458.00"}

excel预期结果中的格式是xx=11;xx=22这样的,所以要把返回报文改成xx=22这样的格式

所以用到字符串替换,把返回报文中的":"和":替换成=,返回报文就变成

{"id=J_775682","p=275.00,"m=458.00"},这样就和预期结果一样了,当然也可以用python自带的

json模块来解析json串,但是有的返回的不是标准的json格式,处理起来比较麻烦,这里我就用字符串的方法了

'''

res=res.replace('":"',"=").replace('":',"=")

'''

res_check是excel中的预期结果,是xx=11;xx=22这样的

所以用split分割字符串,split是python内置函数,切割字符串,变成一个list

['xx=1','xx=2']这样的,然后遍历这个list,判断list中的每个元素是否存在这个list中,

如果每个元素都在返回报文中的话,就说明和预期结果一致

上面我们已经把返回报文变成{"id=J_775682","p=275.00,"m=458.00"}

'''

res_check=res_check.split(';')

forsinres_check:

'''

遍历预期结果的list,如果在返回报文中,什么都不做,pass代表什么也不做,全部都存在的话,就返回pass

如果不在的话,就返回错误信息和不一致的字段,因为res_check是从excel里面读出来的

字符Unicode类型的的,python的字符串是str类型的,所以要用str方法强制类型转换,转换成string类型的

'''

ifsinres:

pass

else:

return'错误,返回参数和预期结果不一致'+str(s)

return'pass'

defurlParam(param):

'''

参数转换,把参数转换为'xx=11&xx=2这样'

'''

returnparam.replace(';','&')

defcopy_excel(file_path,res_flags,request_urls,responses):

'''

:param file_path: 测试用例的路径

:param res_flags: 测试结果的list

:param request_urls: 请求报文的list

:param responses: 返回报文的list

:return:

'''

'''

这个函数的作用是写excel,把请求报文、返回报文和测试结果写到测试用例的excel中

因为xlrd模块只能读excel,不能写,所以用xlutils这个模块,但是python中没有一个模块能

直接操作已经写好的excel,所以只能用xlutils模块中的copy方法,copy一个新的excel,才能操作

'''

#打开原来的excel,获取到这个book对象

book=xlrd.open_workbook(file_path)

#复制一个new_book

new_book=copy.copy(book)

#然后获取到这个复制的excel的第一个sheet页

sheet=new_book.get_sheet(0)

i=1

forrequest_url,response,flag inzip(request_urls,responses,res_flags):

'''

同时遍历请求报文、返回报文和测试结果这3个大的list

然后把每一条case执行结果写到excel中,zip函数可以将多个list放在一起遍历

因为第一行是表头,所以从第二行开始写,也就是索引位1的位置,i代表行

所以i赋值为1,然后每写一条,然后i+1, i+=1同等于i=i+1

请求报文、返回报文、测试结果分别在excel的8、9、11列,列是固定的,所以就给写死了

后面跟上要写的值,因为excel用的是Unicode字符编码,所以前面带个u表示用Unicode编码

否则会有乱码

'''

sheet.write(i,8,u'%s'%request_url)

sheet.write(i,9,u'%s'%response)

sheet.write(i,11,u'%s'%flag)

i+=1

#写完之后在当前目录下(可以自己指定一个目录)保存一个以当前时间命名的测试结果,time.strftime()是格式化日期

new_book.save('%s_测试结果.xls'%time.strftime('%Y%m%d%H%M%S'))

defwriteBug(bug_id,interface_name,request,response,res_check):

'''

这个函数用来连接数据库,往bugfree数据中插入bug,拼sql,执行sql即可

:param bug_id: bug序号

:param interface_name: 接口名称

:param request: 请求报文

:param response: 返回报文

:param res_check: 预期结果

:return:

'''

bug_id=bug_id.encode('utf-8')

interface_name=interface_name.encode('utf-8')

res_check=res_check.encode('utf-8')

response=response.encode('utf-8')

request=request.encode('utf-8')

'''

因为上面几个字符串是从excel里面读出来的都是Unicode字符集编码的,

python的字符串上面指定了utf-8编码的,所以要把它的字符集改成utf-8,才能把sql拼起来

encode方法可以指定字符集

'''

#取当前时间,作为提bug的时间

now=time.strftime("%Y-%m-%d %H:%M:%S")

#bug标题用bug编号加上接口名称然后加上_结果和预期不符,可以自己随便定义要什么样的bug标题

bug_title=bug_id+'_'+interface_name+'_结果和预期不符'

#复现步骤就是请求报文+预期结果+返回报文

step='[请求报文]
'+request+'
'+'[预期结果]
'+res_check+'
'+'
'+'[响应报文]
'+'
'+response

#拼sql,这里面的项目id,创建人,严重程度,指派给谁,都在sql里面写死,使用的时候可以根据项目和接口

# 来判断提bug的严重程度和提交给谁

sql="INSERT INTO `bf_bug_info` (`created_at`, `created_by`, `updated_at`, `updated_by`, `bug_status`, `assign_to`, `title`, `mail_to`, `repeat_step`, `lock_version`, `resolved_at`, `resolved_by`, `closed_at`, `closed_by`, `related_bug`, `related_case`, `related_result`, "\

"`productmodule_id`, `modified_by`, `solution`, `duplicate_id`, `product_id`, "\

"`reopen_count`, `priority`, `severity`) VALUES ('%s', '1', '%s', '1', 'Active', '1', '%s', '系统管理员', '%s', '1', NULL , NULL, NULL, NULL, '', '', '', NULL, "\

"'1', NULL, NULL, '1', '0', '1', '1');"%(now,now,bug_title,step)

#建立连接,使用MMySQLdb模块的connect方法连接mysql,传入账号、密码、数据库、端口、ip和字符集

coon=MySQLdb.connect(user='root',passwd='123456',db='bugfree',port=3306,host='127.0.0.1',charset='utf8')

#建立游标

cursor=coon.cursor()

#执行sql

cursor.execute(sql)

#提交

coon.commit()

#关闭游标

cursor.close()

#关闭连接

coon.close()

if__name__=='__main__':

'''

然后进行调用,调用的时候需要传入一个excel,调用方式是 python test.py test_case.xls

sys.argv[1]的意思是取传入的第二个参数,也就是索引是1的,

第一个是这个python文件的文件名,如果不传入参数运行的话,会提示错误,如果正确的话,

会调用读excel的程序,执行用例,运行完成后,会打印Done

'''

try:

filename=sys.argv[1]

exceptIndexError,e:

print'Please enter a correct testcase! \n e.x: python gkk.py test_case.xls'

else:

readExcel(filename)

print'Done!

python编写接口自动化脚本_简单的python http接口自动化脚本相关推荐

  1. python程序框架的描述_简单介绍Python下自己编写web框架的一些要点

    在正式开始Web开发前,我们需要编写一个Web框架. 为什么不选择一个现成的Web框架而是自己从头开发呢?我们来考察一下现有的流行的Web框架: Django:一站式开发框架,但不利于定制化: web ...

  2. [转载] python中的且语句_简单探讨python中的语句和语法

    参考链接: 在Python中解包:并行分配之外 python程序结构 python"一切皆对象",这是接触python听到最多的总结了.在python中最基层的单位应该就是对象了, ...

  3. python函数分几种_简单了解Python中的几种函数

    python是支持多种范型的语言,可以进行所谓函数式编程,其突出体现在有这么几个函数: filter.map.reduce.lambda.yield lambda lambda函数的使用方法:在lam ...

  4. python字符串前面加上序号_简单了解python字符串前面加r,u的含义

    这篇文章主要介绍了简单了解python字符串前面加r,u的含义,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 u/U:表示unicode字符串 不是 ...

  5. python人脸识别系统下载_简单的Python人脸识别系统

    案例一 导入图片 思路: 1.导入库 2.加载图片 3.创建窗口 4.显示图片 5.暂停窗口 6.关闭窗口 # 1.导入库 import cv2 # 2.加载图片 img = cv2.imread(' ...

  6. python协同过滤调用包_简单的python协同过滤程序实例代码

    本文研究的主要是python协同过滤程序的相关内容,具体介绍如下. 关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看 ...

  7. 用python编写程序判断奇偶_如何用python判断奇偶数

    问题分析:用Python编写一个程序,判断输入的数字是奇数还是偶数,并相应的输出信息,要判断一个数为奇数还是偶数,依据的是它被2除后的余数.因此可以用"%"运算符来计算并判断. 代 ...

  8. python闭包的应用场景_简单谈谈Python中的闭包

    Python中的闭包 前几天又有人留言,关于其中一个闭包和re.sub的使用不太清楚.我在脚本之家搜索了下,发现没有写过闭包相关的东西,所以决定总结一下,完善Python的内容. 1. 闭包的概念 首 ...

  9. python类和对象课件_简单解释Python的类和对象

    前言: 对象是模拟真实世界,把数据和程序进行封装 . 对象 = 属性+ 方法 我们需要用类来创造一个对象,就像我们要用图纸来造房子一样.在Python中函数名是以小写字母开头 ,类名是以大写字母开头. ...

最新文章

  1. 回归分析中的“回归”
  2. Magento2插件
  3. 只能数字或小数 只能有一个小数点并且第一位不能为小数点,还有小数点后面限制两位
  4. 北京交通大学2018计算机硕士录取公示,2017年北京交通大学研究生录取名单!!!...
  5. 善用php-fpm的慢执行日志slow log,分析php性能问题
  6. c语言函数的使用步骤,c语言打开文件函数使用方法
  7. Nature Milestones | 近20年人类癌症研究领域14项里程碑式进展!
  8. [短评] 关于顺丰快递大战阿里菜鸟物流事件的一点吐槽
  9. 写python代码案例_keras topN显示,自编写代码案例
  10. 市场对php的需求分析,PHP 留言板功能需求分析
  11. 【转】Windows下部署Appium教程(Android App自动化测试框架搭建)
  12. 最新版腾讯防水墙(二代)识别
  13. 5.3 react路由组件
  14. timus 1741. Communication Fiend URAL 解题报告 DP+读题
  15. vpu测试_联发科P30支持的VPU是什么?不知道就别说你懂科技了
  16. Android高仿微信图片多选功能
  17. 磨金石教育分享||想转行学习插画,应该怎么做,需要什么基础?
  18. 由于找不到vcruntime140_1.dll无法继续执行代码,vcruntime140_1.dll丢失如何修复
  19. 卡塔兰数(Catlan)
  20. Dell戴尔服务器添加新硬盘认不到解决方法

热门文章

  1. 征服大前端视频教程第一季(jQuery、HTML5、CSS3、Node.js)
  2. 洛谷——P1680 奇怪的分组
  3. 机器学习分类算法综述
  4. Backbone事件管理——Backbone.Events模块API结构
  5. 利用钩子技术控制进程创建(附源代码)
  6. ESFramework网络通信框架介绍之(5)――消息分派器IMessageDispatcher
  7. Docker(十八)基于python3.5 以apline 为系统的python 环境
  8. 如何隐藏scroll-Y纵向滚动条,并不影响内容滚动的方法
  9. MySQL Replication主从复制环境下修改主库IP
  10. 将摄像头拍摄图像或者本地图片设置为头像的方法