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. ...
随机推荐
- 开源PLM软件Aras详解七 在Aras的Method中如何引用外部DLL
在实际的项目中,Aras内部的方法可能并不能完全满足我们,比如Office的组件,就必须引入,那么在Aras内部的Method中,我们如何引入外部Dll文件 首先,我们新建一个Dll文件,简单的Dem ...
- PAT A1001-A1004
题集通道:https://pintia.cn/problem-sets/994805342720868352/problems/type/7 A1001 : A+B Format (20 point ...
- 使用labelImg制作自己的数据集(VOC2007格式)用于Faster-RCNN训练
https://blog.csdn.net/u011956147/article/details/53239325 https://blog.csdn.net/u011574296/article/d ...
- python numpy和矩阵
2.numpy数据选取 lst=[[1, 2, 3], [4, 5, 6]] np.array(lst)[:-1] Out[32]: array([[1, 2, 3]]) np.array(lst)[ ...
- Linux-线程引入
1.使用进程技术的优势 (1).CPU分时复用,单核心CPU可以实现宏观上的并行 (2).实现多任务系统需求(多任务的系统是客观的) 2.进程技术的劣势 (1).进程间切换开销大 (2).进程间通信麻 ...
- NOIP 骗分技巧
目录 第1章 绪论 第2章 从无解出发 \hookrightarrow↪ 2.1 无解情况 \hookrightarrow↪ 2.2 样例——白送的分数 第3章 “艰苦朴素永不忘” \hookrigh ...
- 3.react 基础 - JSX 语法
1.最基础的 JSX 语法 普通javaScript中 引入 标签 let html = '<h1>hello</h1>'; jsx语法 let JSX_html = < ...
- Java if、switch语句,break,case,类型转换、常量、赋值比较、标识符(2)
if语句: /* if else 结构 简写格式: 变量 = (条件表达式)?表达式1:表达式2: 三元运算符: 好处:可以简化if else代码. 弊端:因为是一个运算符,所以运算完必须要有一个结果 ...
- CMake变量(提供信息的变量)
目录 CMAKE_VERSION CMAKE_MAJOR_VERSION CMAKE_MINOR_VERSION CMAKE_PATCH_VERSION CMAKE_TWEAK_VERSION CMA ...
- 基于Token的身份验证
最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强, ...