项目背景:
XXXX银行项目采用的是B/S架构,主要是为了解决银行业务中的柜员、凭证、现金、账务等来自存款、贷款、会计模块的管理。
手工弊端:
1.项目业务复杂度高,回归测试工作量大
2.单个接口功能比较简单,容易实现自动化集成,且相对UI更稳定,更能达到监控项目质量的目的
3.从前后端分离的角度说,只依赖前端限制并不能满足安全要求
优化方案及工具选择:
功能强大Chrome插件,界面好看响应格式自主选择,缺点支持的协议单一且不能数据分离,比较麻烦的还有不是所有的公司都能上谷歌
SoupUI:
支持多协议(httpsoup
est等),能实现功能和性能测试的开源接口测试工具,灵活性高可在此基础上开发脚本,缺点上手比较难
Jmeter:
Java御用的接口压力测试工具,做接口功能测试有点大材小用,缺点不能生成可视化的接口测试报告
综上:手动开发比较合适
框架原理:
采用数据驱动模式,将数据和业务逻辑分离,完成测试用例编写-》测试用例执行-》测试报告发送的目的
测试用例格式编写如下:
代码实现:
注:为了数据脱敏,以百度翻译接口为例
1.读取测试用例数据data.py
# coding=utf-8 import json import xlrd import sys reload(sys) sys.setdefaultencoding('utf-8') def tableToJson(): source = xlrd.open_workbook(r"C:UsersHPDesktop 608InterfaceData.xlsx") table = source.sheet_by_index(0) list = [] # 字典列表 totalList = [] # json列表 for i in xrange(1,2): #获取第i个表第2行起的值作为用例的参数 keys = table.col_values(1) # 获取第i个表第2列的值 keys.pop(0) for j in xrange(3, table.ncols): test_value = table.col_values(j) # 获取第i个表第4列起的值作为用例的参数值 test_value.pop(0) for k in range(len(test_value)): s = test_value[k] # print s data = dict(zip(keys, test_value)) # 等长两列表转为字典 list.append(data) data = {} data[table.name] = list list = [] data_to_json = json.dumps(data, ensure_ascii=False, encoding="gb2312") # 将列表中的unicode转中文 print u"用例数据:", data_to_json totalList.append(data_to_json) return totalList if __name__ == '__main__': jsonData = tableToJson() # 写入文件 f = open(r"F:TestData0618.json", 'w+') for i in jsonData: f.write(i) f.write(' ') f.close()
运行结果:
2.执行测试用例test.py
#coding=utf-8 import requests import unittest import json class MyTest(unittest.TestCase): # 封装测试环境的初始化和还原的类 def setUp(self): print("start test") def tearDown(self): print("end test") class Test_transapi(MyTest): # 一个接口封装一个类 @staticmethod def getParams(): Data = open(r"F:TestData0618.json").read() temp = eval(Data) #type(Data)为str,type(temp)为dict data = temp['2100'] return data def test_transapi(self): self.url = "http://fanyi.baidu.com/v2transapi" self.headers = { 'Host': 'fanyi.baidu.com', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, sdch, br', 'Accept-Language': 'zh-CN,zh;q=0.8', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive'} data = self.getParams() for i in data: print i self.params = i #print u'参数:',self.params r = requests.get(url=self.url, params=self.params,headers=self.headers) #print (r.text) print (r.status_code) self.assertEqual(200,r.status_code) if __name__=="__main__": unittest.main()
运行结果:
3.构建测试报告run.py
#coding=utf-8 from HTMLTestRunner import HTMLTestRunner import time import unittest #定义测试用例的目录为当前目录 test_dir = r'C:UsersHPDesktop 608' discover = unittest.defaultTestLoader.discover(test_dir,pattern = 'test*.py') if __name__=="__main__": #按照一定的格式获取当前的时间 now = time.strftime("%Y-%m-%d %H-%M-%S") #定义报告存放路径 filename =test_dir + '/' + now + 'test_result.html' fp = open(filename,"wb") #定义测试报告 runner = HTMLTestRunner(stream = fp, title = u"2100接口测试报告", description = u"测试用例执行情况:") #运行测试 runner.run(discover) fp.close() #关闭报告文件
运行结果:
4.发送测试报告send.py
#coding=utf-8 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart def SendMail(subject,msg,to_addrs,from_addr,smtp_addr,password): ''' @subject:邮件主题 @msg:邮件内容 @to_addrs:收信人的邮箱地址 @from_addr:发信人的邮箱地址 @smtp_addr:smtp服务地址,可以在邮箱看,比如163邮箱为smtp.163.com @password:发信人的邮箱密码 ''' mail_msg = MIMEMultipart() #创建一个带附件实例 #构造附件test.docx att1 = MIMEText(open(r'C:UsersHPDesktop 6082017-06-18 22-33-24test_result.html','rb').read(), 'base64', 'gb2312') att1["Content-Type"] = 'application/octet-stream' att1.add_header('Content-Disposition', 'attachment', filename=u'测试报告.html'.encode('gbk')) mail_msg.attach(att1) #构建MIMEText纯文本内容 txt = MIMEText(msg,'plain', 'utf-8') mail_msg.attach(txt) mail_msg['Subject'] = subject mail_msg['From'] =from_addr mail_msg['To'] = ','.join(to_addrs) try: s = smtplib.SMTP() s.connect(smtp_addr) #连接smtp服务器 s.login(from_addr,password) #登录邮箱 s.sendmail(from_addr, to_addrs, mail_msg.as_string()) #发送邮件 s.quit() print "success" except Exception,e: print str(e) if __name__ == '__main__': from_addr = "XXX" smtp_addr = "XXX" to_addrs = ["XXX"] subject = "send test" password = "XXX" msg = "hello,this is just a send test" SendMail(subject,msg,to_addrs,from_addr,smtp_addr,password)
运行结果:
5.定时执行测试用例
问题和挑战:
1.接口文档更新不及时,导致用例数据可能与实际需要的有所出入。推荐使用SwaggerUI工具管理接口测试文档
2.大部分用例执行之前为了安全需要保证已登录,简单的将cookie加入请求头不管用,用session
3.测试报告用的是通用版(一个脚本一条记录),所有现状将一个接口下所有用例都写在一个脚本里只会有一条记录
4.邮件中文附件名称乱码