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. ...
随机推荐
- 基于图灵api的Python机器人
一.注册图灵机器人 先注册并登录图灵机器人官网: 点击创建机器人 复制机器人的key 二.搭建Python机器人 Python版本:3.6 注意替换第三行代码的apikey import reques ...
- 最短路问题--Floyd 畅通工程续
畅通工程续 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很 ...
- 在java中如何根据手机号查询号码归属地
1.maven项目中配置 <dependency><groupId>com.googlecode.libphonenumber</groupId><artif ...
- Java中常用的API(四)——其他
前面说三篇文章分别介绍了Object.String.字符缓冲类的API,接下来我们简要介绍一下其他常用的API. 1.System System类用于获取各种系统信息,最为常用的是: System.o ...
- python 用 pycharm 光速下载各种包
https://blog.csdn.net/z1178517021/article/details/80200999 就是这么简单
- Jmeter接口测试之案例实战
Jmeter是apacheg公司基于Java开发的一款开源的压力测试工具,安装Jmeter之前先安装Jdk,具体JDK安装和环境变量配置自行百度.这里不概述. 1.添加线程组 测试计划->添加- ...
- 熟练使用WebApi开发
在建立WebApi框架的时候,要想自己的业务需求是什么.例如PC端(前端),APP端都要使用的同一接口,就得考虑Webapi来提供接口支持了.最近公司刚好让我整合一下公司的接口项目(有WebServi ...
- JS事件高级
1. 注册事件(绑定事件) 1.1注册事件概述 1.2 addEventListener 事件监听方式 1.3 attachEvent 事件监听方式 1.4 注册事件兼容性解决方案 2. 删除事件(解 ...
- Mac下Rblas配置
Mac 下加速 R做矩阵计算, 感觉比没有R open 快, 但数量级上差不多了. 安装R open时,提示 X11相关的组件缺失,不想再额外安装,怕污染系统文件. cd /Library/Frame ...
- 33)new和delete关键字
---------------------------------------------------------------------------------------------------- ...