python之接口自动化测试框架
梳理python+unittest接口自动化测试框架的思路:
1.确定目录:
cases:存放测试用例的py文件;config:存放一些数据库,环境地址等固定不变的信息;
core:核心的文件,
cases:测试用例test_cj.py,代码如下:
import unittest
import os
import jsonpath
from core.my_requests import MyRequest
from conf.setting import default_host
from core.tools import mysql
from core.tools import r as redis
class Cj(unittest.TestCase):
username='autotest_lyh78910'#自动化测试注册的用户
password='aA123456'#类变量
def test_reg(self):#post请求,请求参数为username,pwd,cpwd.
'''注册接口'''
url='/api/user/user_reg'
new_url=os.path.join(default_host,url)
data={'username':self.username,'pwd':self.password,'cpwd':self.password}
r=MyRequest()
result=r.post(new_url,data)#result是个字典
self.assertEqual(1,result.get('status'),msg='注册接口不通 %s'%result.get('sql_file'))
#判断请求接口是否通,1表示成功,0,2都是失败,接口不通,这条语句下面的都不会执行
error_code=result.get('sql_file').get('error_code')
self.assertEqual(0,error_code,msg="注册失败!%s"result.get('sql_file'))
sql='select * from app_myuser where username="%s;'%self.username
sql_res=mysql.execute_one(sql)#数据库查询结果
self.assertIsNotNone(sql_res)#若数据库表里有新注册的用户名,说明注册成功。判断这个结果是否为空
def login(self):#post请求
'''登录'''
url='/api/user/login'
new_url=os.path.join(default_host,url)
data={'username':self.username,'passwd':self.password}
r=MyRequest()
result=r.post(new_url,data)
self.assertEqual(1,result.get('status'),msg='登录接口不通!%s'%result.get('sql_file'))
sign=get_real_value('sign',result)#从返回值里面取到sign值
self.assertIsNotNone(sign,msg='登录失败!%s'result)#校验sign是否为空
userid=get_real_value('userId',result)从返回值里面取到userId值
return userid,sign
def choujiang(self):#get请求
'''抽奖'''
url=default_host+'/api/product/choice'
userid, sign = self.login()#调用函数,直接拿到函数的两个返回值
data={'userid':userid,'sign':sign}
r=MyRequest(url,data)
result=r.get()
self.assertEqual(1,result.get('status'),msg='抽奖接口不通!%s'%result.get('sql_file'))
redis_key='choujiang:%s'%self.username
count=redis.get(redis_key)#抽奖次数,redis里面key值是字符串
self.assertEqual('',count,msg='抽奖次数错误%s'result)
sql='select count(*) as cishu from app_record where user_id=%s;'%userid
cishu=mysql.execute_one(sql).get('cishu') #本来fetchall()返回的是list,但指定了dict
# #{'cishu':1}
self.assertEqual(1,cishu,msg='抽奖记录没有落到数据库里面!')
def test_choujiang(self):#抽奖流程
'''抽奖流程测试'''
self.reg()
self.choujiang() def tearDownClass(cls):#类里面的所有测试用例执行完之后,都会执行它
'''注册数据清除'''
sql='delete * from app_myuser where username="%s";'%cls.username
mysql.execute_one(sql)
key='choujiang:%s'%cls.username
redis.delete(key)
print("测试数据清理完成!")
测试用例里写按接口参数发送请求,判断结果,判断结果用断言essertEqual(a,b),essertIsNotNone()判断,还有接口流程
my_request.py 定义一个类MyRequest,里面有post()和get()方法,发送请求后,返回响应数据res={"status":0,"data":res.json()},代码如下:
import requests
import nnlog
import os
from conf.setting import LOG_PATH
class MyRequest:
log_file_name = os.path.join(LOG_PATH,'MyRequest.log')#日子文件名
time_out = 10 #请求超时时间
def __init__(self,url,data=None,headers=None,file=None):
self.url = url
self.data = data
self.headers = headers
self.file = file
def post(self):
try:
req = requests.post(self.url,data=self.data,headers=self.headers,
files=self.file,timeout=self.time_out)
except Exception as e:
res = {"status":0,"sql_file":e.args} #0代表请求失败
else:
try:
res = {"status":1,"sql_file":req.json()} #1代表返回的json
except Exception as e:
res = {"status":2,"sql_file":req.text} #2代表返回不是json
log_str = 'url: %s 请求方式:post sql_file:%s ,返回数据:%s'%(self.url,self.data,res)
self.write_log(log_str)
return res def get(self):
try:
req = requests.get(self.url,params=self.data,headers=self.headers,timeout=self.time_out)
except Exception as e:
res = {"status":0,"sql_file":req.args} #0代表请求失败
else:
try:
res = {"status":1,"sql_file":req.json()} #1代表返回的json except Exception as e:
res = {"staus":2,"sql_file":req.text} #2代表返回不是json
log_str = 'url: %s get请求 sql_file:%s ,返回数据:%s'%(self.url,self.data,res)
self.write_log(log_str)
return res @classmethod
def write_log(cls,content):
log = nnlog.Logger(cls.log_file_name)
log.debug(content)
发送请求后,执行用例前,先备份数据库mysqldump -uroot -p12345 -Pxxxx -hxxx.xxx.xxx.xxx >xxx/a.sql,自动化测试执行后,把原数据库名称改掉:
rename database main to main_20190220,再创建原数据库main,把备份的数据恢复进去。mysql -uroot -p123456 -Pxxx -hxxxxx <xxxx/a.sql
op_data.py文件主要写数据库的备份和恢复。
bin:start.py文件,主要写运行测试的过程
import unittest
import datatime
from BeautifulReport import BeautifulReport
def run_case():
sql_file=bak_db()#备份数据库
suite=unittest.Testsuite()#创建测试集合
cases=unittest.defualltTestloader.discover(Case_path,'test*.py')#找到所有测试用例
for case in cases:
suite.addTest(case)#把每个测试用例加到测试集合中
report=BeautifulReport.BeautifulReport(suite)#运行测试集合,产生报告
report_path=make_today_dir()#创建报告的今天的目录
file_name='report_%s.html'%datatime.datatime.now().strftime('%H%M%S)#报告文件
report.report(filename=file_name,description="接口测试“,log_path=path)#产生报告
abs_path=os.path.join(report_path,file_name)#报告的路径
send_mail(content,abs_path)#发送邮件
恢复数据库
python之接口自动化测试框架的更多相关文章
- python版接口自动化测试框架源码完整版(requests + unittest)
python版接口自动化测试框架:https://gitee.com/UncleYong/my_rf [框架目录结构介绍] bin: 可执行文件,程序入口 conf: 配置文件 core: 核心文件 ...
- python+requests接口自动化测试框架实例详解
python+requests接口自动化测试框架实例详解 转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...
- 【接口自动化】Python+Requests接口自动化测试框架搭建【一】
公司项目启用新框架,前后端分离,所以接口测试成为测试工作中不可缺失的一个环节,现在将从0开始搭建接口自动化测试框架的路程,一步步记录下来. 开发语言我们采用Python+第三方库Requests,测试 ...
- python 做接口自动化测试框架设计
1,明确什么叫自动化测试,什么叫接口自动化测试,如何设计接口测试用例,已登录为例 自动化测试:解放人力来自动完成规定的测试. 自动化测试分层模型:UI层,不论WEB端还是移动端,都是基于页面元素的识别 ...
- Python Api接口自动化测试框架 excel篇
工作原理: 测试用例在excel上编辑,使用第三方库xlrd,读取表格sheet和内容,sheetName对应模块名,Jenkins集成服务发现服务moduleName查找对应表单,运用第三方库req ...
- 【接口自动化】Python+Requests接口自动化测试框架搭建【三】
经过上两篇文章的讲解,我们已经完成接口自动化的基础框架,现在开始根据实际项目丰满起来. 在PyCharm中新建项目,项目工程结构如下: config:配置文件夹,可以将一些全局变量放于配置文件中,方便 ...
- python+requests接口自动化测试框架实例详解教程
1.首先,我们先来理一下思路. 正常的接口测试流程是什么? 脑海里的反应是不是这样的: 确定测试接口的工具 —> 配置需要的接口参数 —> 进行测试 —> 检查测试结果(有的需要数据 ...
- 基于Python的接口自动化测试框架
项目背景 公司内部的软件采用B/S架构,目的是进行实验室的数据存储.分析.管理. 大部分是数据的增删改查,但是由于还在开发阶段,所以UI的变化非常快,难以针对UI进行自动化测试,那样会消耗大量的精力与 ...
- 从0到1告诉你搭建完整Python+requests接口自动化测试框架!
前言 很多小伙伴不知道什么是框架?框架有哪些东西? 一步步从需求分析到报告生成告诉你如何搭自动化建框架. 学完unittest后这里基本上可以搭建一个简易的项目框架了,我们可以用一条run_main. ...
随机推荐
- 2020牛客寒假算法基础集训营4 H坐火车
题目描述 牛牛是一名喜欢旅游的同学,在来到渡渡鸟王国时,坐上了颜色多样的火车. 牛牛同学在车上,车上有 n 个车厢,每一个车厢有一种颜色. 他想知道对于每一个正整数 $ x \in [1,\ n] $ ...
- ROS的Target Platforms
问题 今天编译VIORB遇到了以下错误: 查到的资料 ubuntu18安装的二进制ros包需要特定版本的库函数 ros官方文档 文档pdf 参考回答 参考回答pdf
- UVA 11375 高精度Bign类
求火柴的组成的数字最多能组成多少种数字,典型的递推问题 但是因为结果巨大,要用高精度运算 一开始手写高精度,不仅挫的要死,最后还WA了. 最后学了一下白书上面的bign类,相当方便啊. #includ ...
- 干货 | 把Flutter扩展到微信小程序端的探索
Google Flutter是一个非常优秀的跨端框架,不仅可以运行在Android. iOS平台,而且可以支持Web和桌面应用.在国内小程序是非常重要的技术平台,我们也一直思考能否把Flutter扩展 ...
- 从编程实现角度学习Faster R-CNN(附极简实现)
https://www.jianshu.com/p/9da1f0756813 从编程实现角度学习Faster R-CNN(附极简实现) GoDeep 关注 2018.03.11 15:51* 字数 5 ...
- Kali桥接模式下配置动态ip
以管理员身份运行虚拟机 打开 控制面板-->网络和Internet-->更改适配器 在虚拟机处桥接到这个WLAN2 点击 编辑-->编辑虚拟网卡 没有网卡就点上图的添加网络作为桥接网 ...
- 基于JSP+Servlet新闻发布系统 源码
开发环境: Windows操作系统开发工具: Eclipse+Jdk+Tomcat+MYSQL数据库 运行效果图:
- php list的用法
<?php $my_array = array("Dog","Cat","Horse"); list($a, $b, $c) = $m ...
- JavaSE--【JAVA】unicode为12288字符
转载:http://blog.csdn.net/zfpigpig/article/details/8186470 今天做一个导入数据功能时发现一个问题,就是一个unicode为12288的字符显示为空 ...
- linux查看显卡
查看 nvidia 显卡 $ lspci | grep -i nvidia 02:00.0 3D controller: nVidia Corporation Device 1023 (rev a1) ...