项目背景:

  XXXX银行项目采用的是B/S架构,主要是为了解决银行业务中的柜员、凭证、现金、账务等来自存款、贷款、会计模块的管理。

手工弊端:

1.项目业务复杂度高,回归测试工作量大
2.单个接口功能比较简单,容易实现自动化集成,且相对UI更稳定,更能达到监控项目质量的目的
3.从前后端分离的角度说,只依赖前端限制并不能满足安全要求

优化方案及工具选择:

Postman:

  功能强大Chrome插件,界面好看响应格式自主选择,缺点支持的协议单一且不能数据分离,比较麻烦的还有不是所有的公司都能上谷歌
SoupUI:

  支持多协议(http\soup\rest等),能实现功能和性能测试的开源接口测试工具,灵活性高可在此基础上开发脚本,缺点上手比较难
Jmeter:

  Java御用的接口压力测试工具,做接口功能测试有点大材小用,缺点不能生成可视化的接口测试报告

综上:手动开发比较合适

框架原理:

采用数据驱动模式,将数据和业务逻辑分离,完成测试用例编写-》测试用例执行-》测试报告发送的目的

测试用例格式编写如下:

代码实现:

注:为了数据脱敏,以百度翻译接口为例

1.读取测试用例数据data.py

  1. # coding=utf-8
  2. import json
  3. import xlrd
  4. import sys
  5. reload(sys)
  6. sys.setdefaultencoding('utf-8')
  7.  
  8. def tableToJson():
  9. source = xlrd.open_workbook(r"C:\Users\HP\Desktop\0608\InterfaceData.xlsx")
  10. table = source.sheet_by_index(0)
  11. list = [] # 字典列表
  12. totalList = [] # json列表
  13. for i in xrange(1,2): #获取第i个表第2行起的值作为用例的参数
  14. keys = table.col_values(1) # 获取第i个表第2列的值
  15. keys.pop(0)
  16. for j in xrange(3, table.ncols):
  17. test_value = table.col_values(j) # 获取第i个表第4列起的值作为用例的参数值
  18. test_value.pop(0)
  19. for k in range(len(test_value)):
  20. s = test_value[k]
  21. # print s
  22. data = dict(zip(keys, test_value)) # 等长两列表转为字典
  23. list.append(data)
  24.  
  25. data = {}
  26. data[table.name] = list
  27. list = []
  28. data_to_json = json.dumps(data, ensure_ascii=False, encoding="gb2312") # 将列表中的unicode转中文
  29. print u"用例数据:", data_to_json
  30. totalList.append(data_to_json)
  31.  
  32. return totalList
  33.  
  34. if __name__ == '__main__':
  35. jsonData = tableToJson()
  36.  
  37. # 写入文件
  38. f = open(r"F:\TestData0618.json", 'w+')
  39. for i in jsonData:
  40. f.write(i)
  41. f.write('\n')
  42. f.close()

运行结果:

2.执行测试用例test.py

  1. #coding=utf-8
  2. import requests
  3. import unittest
  4. import json
  5.  
  6. class MyTest(unittest.TestCase): # 封装测试环境的初始化和还原的类
  7. def setUp(self):
  8. print("start test")
  9.  
  10. def tearDown(self):
  11. print("end test")
  12.  
  13. class Test_transapi(MyTest): # 一个接口封装一个类
  14.  
  15. @staticmethod
  16. def getParams():
  17. Data = open(r"F:\TestData0618.json").read()
  18. temp = eval(Data) #type(Data)为str,type(temp)为dict
  19. data = temp['']
  20. return data
  21.  
  22. def test_transapi(self):
  23. self.url = "http://fanyi.baidu.com/v2transapi"
  24. self.headers = {
  25. 'Host': 'fanyi.baidu.com',
  26. 'Upgrade-Insecure-Requests': '',
  27. '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',
  28. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
  29. 'Accept-Encoding': 'gzip, deflate, sdch, br',
  30. 'Accept-Language': 'zh-CN,zh;q=0.8',
  31. 'Cache-Control': 'max-age=0',
  32. 'Connection': 'keep-alive'}
  33. data = self.getParams()
  34. for i in data:
  35. print i
  36. self.params = i
  37. #print u'参数:',self.params
  38. r = requests.get(url=self.url, params=self.params,headers=self.headers)
  39. #print (r.text)
  40. print (r.status_code)
  41. self.assertEqual(200,r.status_code)
  42.  
  43. if __name__=="__main__":
  44. unittest.main()

运行结果:

3.构建测试报告run.py

  1. #coding=utf-8
  2. from HTMLTestRunner import HTMLTestRunner
  3. import time
  4. import unittest
  5.  
  6. #定义测试用例的目录为当前目录
  7. test_dir = r'C:\Users\HP\Desktop\0608'
  8. discover = unittest.defaultTestLoader.discover(test_dir,pattern = 'test*.py')
  9.  
  10. if __name__=="__main__":
  11.  
  12. #按照一定的格式获取当前的时间
  13. now = time.strftime("%Y-%m-%d %H-%M-%S")
  14.  
  15. #定义报告存放路径
  16. filename =test_dir + '/' + now + 'test_result.html'
  17.  
  18. fp = open(filename,"wb")
  19. #定义测试报告
  20. runner = HTMLTestRunner(stream = fp,
  21. title = u"2100接口测试报告",
  22. description = u"测试用例执行情况:")
  23. #运行测试
  24. runner.run(discover)
  25. fp.close() #关闭报告文件

运行结果:

4.发送测试报告send.py

  1. #coding=utf-8
  2.  
  3. import smtplib
  4. from email.mime.text import MIMEText
  5. from email.mime.multipart import MIMEMultipart
  6.  
  7. def SendMail(subject,msg,to_addrs,from_addr,smtp_addr,password):
  8. '''
  9. @subject:邮件主题
  10. @msg:邮件内容
  11. @to_addrs:收信人的邮箱地址
  12. @from_addr:发信人的邮箱地址
  13. @smtp_addr:smtp服务地址,可以在邮箱看,比如163邮箱为smtp.163.com
  14. @password:发信人的邮箱密码
  15. '''
  16. mail_msg = MIMEMultipart() #创建一个带附件实例
  17.  
  18. #构造附件test.docx
  19. att1 = MIMEText(open(r'C:\Users\HP\Desktop\0608\2017-06-18 22-33-24test_result.html','rb').read(), 'base64', 'gb2312')
  20. att1["Content-Type"] = 'application/octet-stream'
  21. att1.add_header('Content-Disposition', 'attachment', filename=u'测试报告.html'.encode('gbk'))
  22. mail_msg.attach(att1)
  23. #构建MIMEText纯文本内容
  24. txt = MIMEText(msg,'plain', 'utf-8')
  25. mail_msg.attach(txt)
  26.  
  27. mail_msg['Subject'] = subject
  28. mail_msg['From'] =from_addr
  29. mail_msg['To'] = ','.join(to_addrs)
  30. try:
  31. s = smtplib.SMTP()
  32. s.connect(smtp_addr) #连接smtp服务器
  33. s.login(from_addr,password) #登录邮箱
  34. s.sendmail(from_addr, to_addrs, mail_msg.as_string()) #发送邮件
  35. s.quit()
  36. print "success"
  37. except Exception,e:
  38. print str(e)
  39.  
  40. if __name__ == '__main__':
  41. from_addr = "XXX"
  42. smtp_addr = "XXX"
  43. to_addrs = ["XXX"]
  44. subject = "send test"
  45. password = "XXX"
  46. msg = "hello,this is just a send test"
  47. SendMail(subject,msg,to_addrs,from_addr,smtp_addr,password)

运行结果:

5.定时执行测试用例

详见Jenkins安装与使用

问题和挑战:

1.接口文档更新不及时,导致用例数据可能与实际需要的有所出入。推荐使用SwaggerUI工具管理接口测试文档

2.大部分用例执行之前为了安全需要保证已登录,简单的将cookie加入请求头不管用,用session

3.测试报告用的是通用版(一个脚本一条记录),所有现状将一个接口下所有用例都写在一个脚本里只会有一条记录

4.邮件中文附件名称乱码

简陋版:基于python的自动化测试框架开发的更多相关文章

  1. 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码

    引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...

  2. 基于Python接口自动化测试框架(初级篇)附源码

    引言 很多人都知道,目前市场上很多自动化测试工具,比如:Jmeter,Postman,TestLink等,还有一些自动化测试平台,那为啥还要开发接口自动化测试框架呢?相同之处就不说了,先说一下工具的局 ...

  3. 基于python的自动化测试框架搭建

    滴~ 今日打卡!   好多天没来打卡了.博主最近一直在把碎片化知识转化为知识体系的过程中挣扎.Python语言.selenium.unittest框架.HTMLTestRunner框架都有所了解,也写 ...

  4. Selenium基于Python web自动化测试框架 -- PO

    关于selenium测试框架首先想到的就是PO模型,简单说下PO模型 PO模型的概念和理解: PO就是一个设计思想,将代码以页面为单位进行组织,针对这个页面上的所有信息.相关操作都放到一个类中,从而使 ...

  5. 基于python的互联网软件测试开发(自动化测试)-全集合

    基于python的互联网软件测试开发(自动化测试)-全集合 1   关键字 为了便于搜索引擎收录本文,特别将本文的关键字给强调一下: python,互联网,自动化测试,测试开发,接口测试,服务测试,a ...

  6. 学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码

    在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> ...

  7. Python接口自动化测试框架实战 从设计到开发

    第1章 课程介绍(不要错过)本章主要讲解课程的详细安排.课程学习要求.课程面向用户等,让大家很直观的对课程有整体认知! 第2章 接口测试工具Fiddler的运用本章重点讲解如何抓app\web的htt ...

  8. 基于Python的WEB接口开发与自动化测试 pdf(内含书签)

    基于Python的WEB接口开发与自动化测试 目录 目 录O V目 录章 Python 学习必知 ................................................... ...

  9. Python BDD自动化测试框架初探

    1. 什么是BDD BDD全称Behavior Driven Development,译作"行为驱动开发",是基于TDD (Test Driven Development 测试驱动 ...

随机推荐

  1. LeetCode Weekly Contest 28

    1. 551. Student Attendance Record I 2. 552. Student Attendance Record II hihocode原题,https://hihocode ...

  2. css中background-origin属性的使用

    background-origin用来规定元素背景图像的相对定位位置,它有三个属性值: 1.border-box border-box表示元素背景图像相对于border区域开始定位. 代码如下: &l ...

  3. OPPO R9sPlus MIFlash线刷TWRP Recovery ROOT详细教程

    教程转载来自 残芯此生不换  OPPO R9sPlus 目前最简单的刷Recovery root 方法,强烈推荐 新机想要刷第三方卡刷包的最简单过程是:           手机关机-->下载M ...

  4. ★Java语法(四)——————————运算符

    使用除法“/”  ,要特别注意数据类型的问题.若被除数和除数都是整形,且被除数不能被除数整除时,这时输出的结果为整数,(即整形数/整形数=整形数),这是因为整形变量无法保存小数点后面的数据所致,要特别 ...

  5. Electron结合React开发环境遇到的问题

    链接 将create-react-app与electron集成在了一个项目中.但是在React中无法使用electron 当在React中使用require('electron')时就会报TypeEr ...

  6. 【VB】api实现窗口最小化

    Const WM_SYSCOMMAND = &H112 Const SC_MINIMIZE = &HF020& SendMessage hWnd, WM_SYSCOMMAND, ...

  7. 去除安卓apk中的广告

    一般来说,安卓应用很多免费的apk都是有广告的.尽管我们要坚持尊重开发者,帮帮他们点击广告赚钱来可持续发展,但是有的时候,很多游戏中游戏实在是太影响感觉了,当找不到汉化破解版本的时候,也许需要亲自把它 ...

  8. webapi部署到IIS 404错误

    环境:win2008r2+IIS 解决方案: 添加一个映射 可执行文件地址(根据系统决定64位可32位): C:\Windows\Microsoft.NET\Framework64\v4.0.3031 ...

  9. HDU_5833_高斯消元

    参考自:http://www.cnblogs.com/flipped/p/5771492.html 自己做的时候不知道如何求种数.看了题解,感觉思路灰常巧妙.同时也感觉这是一道好题. 精髓在于转化为线 ...

  10. Linux文件压缩命令笔记

    1.gzip/gunzip gzip/gunzip:主要是进行单个文件的压缩和解压缩的命令. 示例:gzip hello.txt #执行压缩hello.txt ls hello.txt.gz #查看文 ...