简陋版:基于python的自动化测试框架开发
项目背景:
XXXX银行项目采用的是B/S架构,主要是为了解决银行业务中的柜员、凭证、现金、账务等来自存款、贷款、会计模块的管理。
手工弊端:
1.项目业务复杂度高,回归测试工作量大
2.单个接口功能比较简单,容易实现自动化集成,且相对UI更稳定,更能达到监控项目质量的目的
3.从前后端分离的角度说,只依赖前端限制并不能满足安全要求
优化方案及工具选择:
功能强大Chrome插件,界面好看响应格式自主选择,缺点支持的协议单一且不能数据分离,比较麻烦的还有不是所有的公司都能上谷歌
SoupUI:
支持多协议(http\soup\rest等),能实现功能和性能测试的开源接口测试工具,灵活性高可在此基础上开发脚本,缺点上手比较难
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:\Users\HP\Desktop\0608\InterfaceData.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('\n')
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['']
return data def test_transapi(self):
self.url = "http://fanyi.baidu.com/v2transapi"
self.headers = {
'Host': 'fanyi.baidu.com',
'Upgrade-Insecure-Requests': '',
'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:\Users\HP\Desktop\0608'
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:\Users\HP\Desktop\0608\2017-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.邮件中文附件名称乱码
简陋版:基于python的自动化测试框架开发的更多相关文章
- 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码
引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...
- 基于Python接口自动化测试框架(初级篇)附源码
引言 很多人都知道,目前市场上很多自动化测试工具,比如:Jmeter,Postman,TestLink等,还有一些自动化测试平台,那为啥还要开发接口自动化测试框架呢?相同之处就不说了,先说一下工具的局 ...
- 基于python的自动化测试框架搭建
滴~ 今日打卡! 好多天没来打卡了.博主最近一直在把碎片化知识转化为知识体系的过程中挣扎.Python语言.selenium.unittest框架.HTMLTestRunner框架都有所了解,也写 ...
- Selenium基于Python web自动化测试框架 -- PO
关于selenium测试框架首先想到的就是PO模型,简单说下PO模型 PO模型的概念和理解: PO就是一个设计思想,将代码以页面为单位进行组织,针对这个页面上的所有信息.相关操作都放到一个类中,从而使 ...
- 基于python的互联网软件测试开发(自动化测试)-全集合
基于python的互联网软件测试开发(自动化测试)-全集合 1 关键字 为了便于搜索引擎收录本文,特别将本文的关键字给强调一下: python,互联网,自动化测试,测试开发,接口测试,服务测试,a ...
- 学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码
在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> ...
- Python接口自动化测试框架实战 从设计到开发
第1章 课程介绍(不要错过)本章主要讲解课程的详细安排.课程学习要求.课程面向用户等,让大家很直观的对课程有整体认知! 第2章 接口测试工具Fiddler的运用本章重点讲解如何抓app\web的htt ...
- 基于Python的WEB接口开发与自动化测试 pdf(内含书签)
基于Python的WEB接口开发与自动化测试 目录 目 录O V目 录章 Python 学习必知 ................................................... ...
- Python BDD自动化测试框架初探
1. 什么是BDD BDD全称Behavior Driven Development,译作"行为驱动开发",是基于TDD (Test Driven Development 测试驱动 ...
随机推荐
- IPv6系列-初学者的10个常见困扰
本文是<IPv6系列>文章的第二篇<常见困扰>,紧接<入门指南>,用于解答IPv6的10个常见困扰. 小慢哥的原创文章,欢迎转载 目录 ▪ 本文缘由 ▪ 困扰1. ...
- 前端面试:问到GET和POST两种区别
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. "标准答案"(本标准答案参考自w3schools): GET在浏览器回退时是无害的,而P ...
- ROS-TF-监听
前言:监听第一只海龟的位置,然后让第二只海龟跟随第一只海龟. 通过监听tf,我们可以避免繁琐的旋转矩阵的计算,而直接获取我们需要的相关信息. 一.新建cpp文件 新建turtle_tf_listene ...
- mac下配置nginx
nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器,下面我们来了解下nginx的用法. 安装nginx 使用brew安装nginx brew install ...
- 自学Python八 爬虫大坑之网页乱码
Bug有时候破坏的你的兴致,阻挠了保持到现在的渴望.可是,自己又非常明白,它是一种激励,是注定要被你踩在脚下的垫脚石! python2.7中最头疼的可能莫过于编码问题了,尤其还是在window环境下, ...
- ListView中动态显示隐藏HeaderView和FooterView
ListView中动态显示和隐藏Header&Footer 解决思路: 直接设置HeaderView和FooterView.setVisibility(View.GONE)无效, 布局仍然存在 ...
- 查找索引/ie滤镜/动态背景/属性attr和prop
1. 查找索引 查找当前元素在指定范围内的索引序号,示例: $('.right_newestState_con').find('em').index($(this)); 2. ie滤镜 利用ie的私有 ...
- HIVE 命令记录
HIVE 命令记录 设置hive运行的队列 hive> set mapreduce.job.queuename=ven12; 打印列名 hive> set hive.cli.print.h ...
- 解决:惠普HP LaserJet Pro M126a MFP 驱动 安装失败,及其它同类打印机失败问题
注意:如果在 Windows XP 系统下安装出错,请先安装WindowsXP KB971276-v3补丁后再安装装驱动. 下载地址:http://www.dyjqd.com/soft/KB97127 ...
- halcon 模板匹配 -- 转化 vector_angle_to_rigid
********************************模板匹配 ********************create_shape_model创建模板,这个函数有许多参数,其中金字塔的级数由N ...