python编写接⼝⾃动化脚本_简单的Pythonhttp接⼝⾃动化脚
本
#-*- coding:utf-8 -*-
importrequests, xlrd, pymysql, time, sys#导⼊需要⽤到的模块
from xlutils importcopy#从xlutils模块中导⼊copy这个函数
defreadExcel(file_path):'''读取excel测试⽤例的函数
:param file_path:传⼊⼀个excel⽂件,或者⽂件的绝对路径
:return:返回这个excel第⼀个sheet页中的所有测试⽤例的list'''
try:
book= xlrd.open_workbook(file_path)#打开excel
exceptException as e:#如果路径不在或者excel不正确,返回报错信息
print ('路径不在或者excel不正确',e)returneelse:
sheet= book.sheet_by_index(0)#取第⼀个sheet页
rows= ws#取这个sheet页的所有⾏数
case_list = []#保存每⼀条case
for i inrange(rows):if i !=0:#把每⼀条测试⽤例添加到case_list中
case_list.w_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
for case 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]#测试⼈员
python解析json文件
tester = case[10]exceptException as e:return '测试⽤例格式不正确!%s'%eif param== '':'''如果请求参数是空的话,请求报⽂就是url,然后把请求报⽂存到请求报⽂list中'''new_url= url#请求报⽂
request_urls.append(new_url)else:'''如果请求参数不为空的话,请求报⽂就是url+?+参数,格式和下⾯⼀样
'''excel⾥⾯的如果有多个⼊参的话,参数是⽤;隔开,a=1;b=2这样的,请求的时候多个参数要⽤&连接,
要把;替换成&,所以调⽤了urlParam这个函数,把参数中的;替换成&,函数在下⾯定义的'''request_urls.append(new_url)if
method.upper() == 'GET':'''如果是get请求就调⽤requests模块的get⽅法,.text是获取返回报⽂,保存返回报⽂,
把返回报⽂存到返回报⽂的list中'''
print(new_url)
(new_url).textprint(results)
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)'''获取到返回报⽂之后需要根据预期结果去判断测试是否通过,调⽤查看结果⽅法
js富文本编辑器插件把返回报⽂和预期结果传进去,判断是否通过,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=
所以⽤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(';')for s inres_check:'''遍历预期结果的list,如果在返回报⽂中,什么都不做,pass代表什么也不做,全部都存在的话,就返回pass
如果不在的话,就返回错误信息和不⼀致的字段,因为res_check是从excel⾥⾯读出来的
字符Unicode类型的的,python的字符串是str类型的,所以要⽤str⽅法强制类型转换,转换成string类型的'''
if s inres:pass
else:return '错误,返回参数和预期结果不⼀致'+str(s)return 'pass'oracle触发器错误日志
defurlParam(param):'''参数转换,把参数转换为'xx=11&xx=2这样''''
place(';','&')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,才能操作'''
socket编程书籍推荐 知乎
#打开原来的excel,获取到这个book对象
book =xlrd.open_workbook(file_path)#复制⼀个new_book
new_book =py(book)#然后获取到这个复制的excel的第⼀个sheet页
sheet =_sheet(0)
file not foundi= 1
for request_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= de('utf-8')
interface_name= de('utf-8')
res_check= de('utf-8')
response= de('utf-8')
request= de('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 = t(user='root',passwd='123456',db='bugfree',port=3306,host='127.0.0.1',charset='utf8')#
建⽴游标
cursor =coon.cursor()#执⾏sql
coonmit()#关闭游标
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 as e:print ('Please enter a correct testcase! \n e.x: python gkk.py test_case.xls')else: readExcel(filename)print ('Done!')
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论