梳理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之接口自动化测试框架的更多相关文章

  1. python版接口自动化测试框架源码完整版(requests + unittest)

    python版接口自动化测试框架:https://gitee.com/UncleYong/my_rf [框架目录结构介绍] bin: 可执行文件,程序入口 conf: 配置文件 core: 核心文件 ...

  2. python+requests接口自动化测试框架实例详解

    python+requests接口自动化测试框架实例详解   转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...

  3. 【接口自动化】Python+Requests接口自动化测试框架搭建【一】

    公司项目启用新框架,前后端分离,所以接口测试成为测试工作中不可缺失的一个环节,现在将从0开始搭建接口自动化测试框架的路程,一步步记录下来. 开发语言我们采用Python+第三方库Requests,测试 ...

  4. python 做接口自动化测试框架设计

    1,明确什么叫自动化测试,什么叫接口自动化测试,如何设计接口测试用例,已登录为例 自动化测试:解放人力来自动完成规定的测试. 自动化测试分层模型:UI层,不论WEB端还是移动端,都是基于页面元素的识别 ...

  5. Python Api接口自动化测试框架 excel篇

    工作原理: 测试用例在excel上编辑,使用第三方库xlrd,读取表格sheet和内容,sheetName对应模块名,Jenkins集成服务发现服务moduleName查找对应表单,运用第三方库req ...

  6. 【接口自动化】Python+Requests接口自动化测试框架搭建【三】

    经过上两篇文章的讲解,我们已经完成接口自动化的基础框架,现在开始根据实际项目丰满起来. 在PyCharm中新建项目,项目工程结构如下: config:配置文件夹,可以将一些全局变量放于配置文件中,方便 ...

  7. python+requests接口自动化测试框架实例详解教程

    1.首先,我们先来理一下思路. 正常的接口测试流程是什么? 脑海里的反应是不是这样的: 确定测试接口的工具 —> 配置需要的接口参数 —> 进行测试 —> 检查测试结果(有的需要数据 ...

  8. 基于Python的接口自动化测试框架

    项目背景 公司内部的软件采用B/S架构,目的是进行实验室的数据存储.分析.管理. 大部分是数据的增删改查,但是由于还在开发阶段,所以UI的变化非常快,难以针对UI进行自动化测试,那样会消耗大量的精力与 ...

  9. 从0到1告诉你搭建完整Python+requests接口自动化测试框架!

    前言 很多小伙伴不知道什么是框架?框架有哪些东西? 一步步从需求分析到报告生成告诉你如何搭自动化建框架. 学完unittest后这里基本上可以搭建一个简易的项目框架了,我们可以用一条run_main. ...

随机推荐

  1. 开源PLM软件Aras详解七 在Aras的Method中如何引用外部DLL

    在实际的项目中,Aras内部的方法可能并不能完全满足我们,比如Office的组件,就必须引入,那么在Aras内部的Method中,我们如何引入外部Dll文件 首先,我们新建一个Dll文件,简单的Dem ...

  2. PAT A1001-A1004

    题集通道:https://pintia.cn/problem-sets/994805342720868352/problems/type/7 A1001 :  A+B Format (20 point ...

  3. 使用labelImg制作自己的数据集(VOC2007格式)用于Faster-RCNN训练

    https://blog.csdn.net/u011956147/article/details/53239325 https://blog.csdn.net/u011574296/article/d ...

  4. python numpy和矩阵

    2.numpy数据选取 lst=[[1, 2, 3], [4, 5, 6]] np.array(lst)[:-1] Out[32]: array([[1, 2, 3]]) np.array(lst)[ ...

  5. Linux-线程引入

    1.使用进程技术的优势 (1).CPU分时复用,单核心CPU可以实现宏观上的并行 (2).实现多任务系统需求(多任务的系统是客观的) 2.进程技术的劣势 (1).进程间切换开销大 (2).进程间通信麻 ...

  6. NOIP 骗分技巧

    目录 第1章 绪论 第2章 从无解出发 \hookrightarrow↪ 2.1 无解情况 \hookrightarrow↪ 2.2 样例——白送的分数 第3章 “艰苦朴素永不忘” \hookrigh ...

  7. 3.react 基础 - JSX 语法

    1.最基础的 JSX 语法 普通javaScript中 引入 标签 let html = '<h1>hello</h1>'; jsx语法 let JSX_html = < ...

  8. Java if、switch语句,break,case,类型转换、常量、赋值比较、标识符(2)

    if语句: /* if else 结构 简写格式: 变量 = (条件表达式)?表达式1:表达式2: 三元运算符: 好处:可以简化if else代码. 弊端:因为是一个运算符,所以运算完必须要有一个结果 ...

  9. CMake变量(提供信息的变量)

    目录 CMAKE_VERSION CMAKE_MAJOR_VERSION CMAKE_MINOR_VERSION CMAKE_PATCH_VERSION CMAKE_TWEAK_VERSION CMA ...

  10. 基于Token的身份验证

    最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强, ...