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. ...
随机推荐
- GFlags 处理内存越界、野指针问题研究
从官方文档可以看到,从gflags的GUI上,我们是无法判断他打开的是full page heap verification 还是Standard page heap verification, 所以 ...
- leetcode算法题121-123 --78 --python版本
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 实例输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能 ...
- centos7.4 测试CPU压力--命令搞定
直接输入命令CPU消耗增加: cat /dev/urandom | gzip - > /dev/null 停止: 直接Ctrl+c结束
- one_day_one_linuxCmd---sz命令
<坚持每天学习一个 linux 命令,今天我们来学习 sz && rz 命令> 前言:我们一般通过 ssh 客户端来进行远程登录和管理的,windows主机使用 ssh 登 ...
- UML-领域模型的精化
拙劣的分类和错误的概括是混乱生活的祸根.--H.G.Wells的总结 1.is-a原则 子类定义的成员变量.方法与超类必须一致.即:不能多,也不能少. 子类是“一种”超类.CreditPayment是 ...
- Swagger注解及参数细节的正确书写。
今天新开了一个api文件,结果怎么搞也在swagger里显示不出来,浪费半天后,去问老员工了. 一般有俩原因, 1.idea缓存,重启idea即可. 2.注解和参数上的修饰有问题,或者请求method ...
- MySQL--基础SQL--DCL
DCL语句主要是DBA用来管理系统中的对象权限时使用,一般的开发人员很少使用. 1.创建一个数据库用户在z1,具有对sakila数据库中所有表的SELECT/INSERT权限: GRANT SELEC ...
- 树上问题&图论模板整理
去除过水的模板,包括但不限于dijkstra(甚至堆优化都被过滤了).SPFA.kruskal.拓扑排序等. 欧拉回路:http://uoj.ac/problem/117 #include<bi ...
- Java之线程通信的方法
/** * 线程通信的例子:使用两个线程打印 1-100.线程1, 线程2 交替打印 * * 涉及到的三个方法: * wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器. * no ...
- python字典常用方法
字典(Dictionary) 字典是一个无序.可变和有索引的集合.在 Python 中,字典用花括号编写,拥有键和值. 实例 创建并打印字典: thisdict = { "brand&quo ...