接口自动化---简单的数据驱动框架ATP(基于excel)
数据驱动测试:根据数据进行测试。将用例写入excel文件,用代码读取文件中的数据,从而实现自动化测试。
自动化框架实现步骤:
1、获取用例
2、调用接口
3、校验结果
4、发送测试报告
5、异常处理
6、日志
一、首先准备好用例
在excel文件中用例写好,格式如下:数据一定要填写正确。
二、编写框架结构
ATP框架结构搭建:lib目录下放一些处理操作,logs目录下存放日志文件,cof文件夹放一些配置文件,bin文件夹作为启动文件,cases目录下放我们准备好的用例
注意:文件目录建好以后,必须先把ATP整个目录sources root操作下。这样才可以跨文件夹引用模块进行使用
按照这些文件结构,填写代码内容。
三、填充代码
1、setting.py
将需要的配置信息写入setting.py文件中
import os
# print(os.path.dirname(os.path.abspath(__file__)))#当前文件的父路径:D:\python\yao_code\day10\testatp\conf
#为了以后方便用到其他目录下的数据,所以要取其他目录的绝对路径。因为其他目录也都在testatp下,所以先获取到testatp
#先用abspath,获取到的绝对路径中,路径符都是\,如果不用abspath,直接获取dirname,路径符是/ BASE_PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#当前文件的父级conf的父级testatp
LOG_PATH=os.path.join(BASE_PATH,'logs','atp.log')
LOG_LEVEL='debug'
#logs文件夹的绝对路径。用base_path与logs拼接方法得到。因为join方法可以自动识别系统路径分隔符。不论在linux还是windows下都可以用系统自己的路径符拼接 CASE_PATH=os.path.join(BASE_PATH,'cases')#原理同logs绝对路径拼接方法,用例存放的路径 #邮箱的相关参数
MAIL_HOST='smtp.qq.com'
MAIL_USER='111111@qq.com'#邮箱
MAIL_PASSWORD='fdfsfasfasfd'#邮箱的授权码,注意,不是密码
TO='23323233@qq.com'#收件人邮箱,多个的话用['','']
2、lib目录下的log.py:用来封装写日志操作
#这里可以用nnlog模块,该模块已经对logging类进行过封装了
import nnlog
from conf import setting
atp_log=nnlog.Logger(setting.LOG_PATH,level=setting.LOG_LEVEL)#日志的保存路径和日志级别都在setting.py配置文件中配置好的,直接饮用
3、lib目录下的sendmail.py:封装发送邮件操作
import yagmail
from conf import setting
from lib.log import atp_log
def sendmail(title,content,attrs=None):
try:
m=yagmail.SMTP(host=setting.MAIL_HOST,user=setting.MAIL_USER,password=setting.MAIL_PASSWORD,smtp_ssl=True)#邮箱信息也在setting.py中配置
m.send(to=setting.TO,
subject=title,
contents=content,
attachments=attrs)
except Exception as e:
atp_log.error('邮件发送失败')
4、lib目录下的common.py:封装工具类,将相关操作函数写在这里面:获取excel中的用例,访问接口获取结果,检查结果,将测试结果写入excel
import xlrd,requests
from xlutils import copy
from lib.log import atp_log
class OpCase():
def get_cases(self,filepath):
cases=[]#保存用例
print('filepath:%s'%filepath)
if filepath.endswith('.xls') or filepath.endswith('xlsx'):
try:
book=xlrd.open_workbook(filepath)#打开文件
sheet=book.sheet_by_index(0)#获取第一个sheet表
nrows=sheet.nrows#获取表格行数(带标题,所以是比用例条数多一)
for i in range(1,nrows):#从第2行循环读用例
row_data=sheet.row_values(i)#获取每行的数据,返回一个list
cases.append(row_data[4:8])#获取4,5,6,7列的数据放入cases:url,method,data,check
atp_log.info('共有%s条用例'%len(cases))
self.filepath=filepath#这样,下面的函数就也可以用filepath
# print(cases)
except Exception as e:
atp_log.error('文件打开失败:%s'%e)
else:
atp_log.error('用例格式不合法,需要xls或xlsx:%s'%filepath)
return cases
def my_request(self,url,data,method):
method=method.upper()#统一请求方法为大写 data=self.data_to_dic(data)
print('data处理成字典后-------------%s'%data)
try: if method=='GET':
res=requests.get(url,params=data).text
elif method=='POST':
res=requests.post(url,data).text
# print(res)
else:
atp_log.warning('该请求方式暂不支持')
res='该请求方式暂不支持'
except Exception as e:
atp_log.error('接口不通url:%s\n 错误信息:%s'%e)
res='接口不通' return res def data_to_dic(self,data):#data格式是a=1,b=2
print(data)
data=data.split(',')#[a=1,b=2]
res={}#用来保存转换后的请求数据
for d in data:#d的值:a=1
k,v=d.split('=')
res[k]=v
print('res------------------%s'%res)
return res def check(self,res,check):
# print('------------'+res)
# print(check)
res=res.replace('": ','=').replace('": ','=')
for c in check.split(','):
if c not in res:
atp_log.error('失败,预期结果:%s,实际结果:%s'%(c,res))
return '失败'
return '成功' def write_to_excel(self,cases_res):#cases_res格式[[接口返回数据,成功],[接口返回数据,失败]]
book=xlrd.open_workbook(self.filepath)
newbook=copy.copy(book)
sheet=newbook.get_sheet(0)
row=1
for case_res in cases_res:
sheet.write(row,8,case_res[0])#第8列是实际结果
sheet.write(row,9,case_res[1])#第9列事测试结果
row+=1
newbook.save(self.filepath.replace('xlsx','xls'))
5、bin目录下的start.py:启动程序
# #如果不在python运行,用命令方式运行,那么首先运行的是这个start文件。这时候文件目录都还不在环境变量中,所以要先把当前文件包加入环境变量 import os,sys
BASE_PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取到testatp
sys.path.insert(0,BASE_PATH)#将testatp加入环境变量 from lib.common import OpCase
from conf import setting
from lib.sendmail import sendmail
class CaseRun():
def run(self):
op=OpCase()
res_list=[]#用来存放实际结果和测试结果。写入excel #遍历获取用例文件
for t in os.listdir(setting.CASE_PATH):
abs_path=os.path.join(setting.CASE_PATH,t)#获取到用例文件的绝对路径
case_list=op.get_cases(abs_path)#获取到所有用例,是个二维数组
# print(case_list)
fail_count=0
pass_count=0
for case in case_list: #循环每条用例
url,method,data,check=case#获取到用例对应的数据
res = op.my_request(url,data,method) # 请求数据,返回实际结果
status=op.check(res,check)
print('status............%s,res...............%s'%(status,res))
res_list.append([res,status])
if status=='失败':
fail_count+=1
else:
pass_count+=1
# print('res_list:%s'%res_list)
op.write_to_excel(res_list)
msg='本次一共运行了%s条用例,失败%s条,成功%s条'%(len(res_list),fail_count,fail_count) sendmail('测试结果',msg,abs_path) # print(os.listdir(setting.CASE_PATH))
# print(BASE_PATH)
CaseRun().run()
四、运行start.py文件,会发送测试报告到邮箱。
接口自动化---简单的数据驱动框架ATP(基于excel)的更多相关文章
- 【python接口自动化】- DDT数据驱动测试
简单介绍 DDT(Date Driver Test),所谓数据驱动测试,简单来说就是由数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变.通过使用数据驱动测试的方法,可以在需要验证多组数据 ...
- HttpRunner 接口自动化简单实践
1.安装 1.1 命令行pip直接安装就好 1.2 验证安装 命令行输入hrun -V,返回项目版本信息则表明安装成功 2.新建测试项目 这里我用直接通过框架的脚手架工具命令生成目录结构 如:hrun ...
- 【python接口自动化】初识unittest框架
本文将介绍单元测试的基础版及使用unittest框架的单元测试. 完成以下需求的代码编写,并实现单元测试 账号正确,密码正确,返回{"msg":"账号密码正确,登录成功& ...
- RobotFrameWork环境搭建(基于HTTP协议的接口自动化)
1. 前言 接着上一篇<RobotFramework框架系统课程介绍>,本篇主要介绍一下在基于RobotFramework框架开展接口自动化前,前期的环境如何搭建,正所谓”工欲善其事,必先 ...
- 关于接口自动化的那些事 - 基于 Python
网络请求模拟小技巧 在学习了一段时间的Python语言后,咱也大概对Python的语法和逻辑有了一定的积累,接下来,可以为接口自动化测试开始尝试做一些比较简单的准备工作啦~跟着我一起来来来~ 扩展库r ...
- java接口自动化(三) - 手工接口测试到自动化框架设计之鸟枪换炮
1.简介 上一篇宏哥介绍完了接口用例设计,那么这一章节,宏哥就趁热打铁介绍一下,接口测试工具.然后小伙伴们或者童鞋们就可以用接口测试工具按照设计好的测试用例开始执行用例进行接口手动测试了.关于手动测试 ...
- Python+Pytest+Allure+Git+Jenkins接口自动化框架
Python+Pytest+Allure+Git+Jenkins接口自动化框架 一.接口基础 接口测试是对系统和组件之间的接口进行测试,主要是效验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系. ...
- 基于RestAssured实现接口自动化
RestAssured是一款强大的接口自动化框架, 旨在使用方便的DSL,简化的接口自动化. 下面是基于RestAssured扩展的一个简单框架示例, 先看看用例的风格: package testca ...
- Jmeter+Ant+Jenkins接口自动化框架
最近应公司要求,搭建一套接口自动化环境.看到通知邮件,没有多想就确定了Jmeter路线.可能有些人会 说,为啥不用python,相对而言高大上一些.因为公司内部现在项目有用到Jmeter,正好可以结合 ...
随机推荐
- 高级搜索树-伸展树(Splay Tree)
目录 局部性 双层伸展 查找操作 插入操作 删除操作 性能分析 完整源码 与AVL树一样,伸展树(Splay Tree)也是平衡二叉搜索树的一致,伸展树无需时刻都严格保持整棵树的平衡,也不需要对基本的 ...
- 某大型企业ospf面试题分析(含路由策略和路由过滤,及双点双向重发布)
面试问题背景 本面试题来自国内最大通信技术公司之一,央企,有很多金融网项目. 了解行业的同学,一定知道事哪个企业. 上面试问题(取自百哥收集整理的面试总结大全,关注百哥CSDN或知乎,不定期分享名企面 ...
- 解决pgAdmin4启动失败方法
1. 问题现象 有时pgadmin 4启动仅显示启动界面, 或者 点击图标一直都没反应,启动界面用鼠标点击下就消失了, 然后过很长时间就保错: the application server could ...
- centos go 安装 使用
#goland 确保能ping通百度[root@z my_project]# vi /etc/resolv.conf# Generated by NetworkManagersearch locald ...
- Scala中的isInstanceOf和asInstanceOf区别
判断对象是否属于某个给定的类,可以用isInstanceOf方法:用asInstanceOf方法将引用转换为子类的引用. obj.isInstanceOf[T]就如同Java的obj instance ...
- JavaScript学习系列博客_25_JavaScript 数组(Array)
数组 - 数组也是一个对象,是一个用来存储数据的对象,和Object类似,但是它的存储效率比普通对象要高. - 数组中保存的内容我们称为元素 - 数组使用索引(index)来操作元素 - 索引指由0开 ...
- MySQL经典练习题及答案,常用SQL语句练习50题
表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id ...
- 第4篇scrum冲刺(5.24)
一.站立会议 1.照片 2.工作安排 成员 昨天已完成的工作 今天的工作安排 困难 陈芝敏 完成云开发配置,初始化数据库: 线下模块(还剩下获取词的数据库) 倒计时模块的初加载还是有点慢 冯晓凤 ...
- Java中抽象类和接口的介绍及二者间的区别
接口(Interface)和抽象类(Abstract Class)是支持抽象类定义的两种机制. 一.抽象类 在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称 ...
- IDEA下Maven项目搭建踩坑记----3.最长的bug,最简单的错误。同一类中,部分函数的@AutoWired注入的对象失效
这个错误绝对是我写到现在为止最傻X的一个错误,先上图 问题: 出了一个特别长的错误,大致的意思就是mapper.xml文件注入Dao层的时候失败. 解决: 查看一下错误的位置→ 找到Dao层 找到错误 ...