基于Python接口自动化测试框架(初级篇)附源码

  引言

  很多人都知道,目前市场上很多自动化测试工具,比如:Jmeter,Postman,TestLink等,还有一些自动化测试平台,那为啥还要开发接口自动化测试框架呢?
相同之处就不说了,先说一下工具的局限性:

1.测试数据不可控:
    接口虽然是对业务逻辑、程序代码的测试,而实际上是对数据的测试,调用接口输入一批数据,通过断言代码验证接口返回的数据,整个过程围绕数据测试。
    如果返回的数据不是固定的,是变化的,那么断言失败,就无法知道是接口程序错误引起的,还是数据变化引起的,所以就需要进行测试数据初始化。
    接口工具没有具备数据初始化的功能,从而无法真正做到接口自动化测试。

举个例子来帮助理解:

比如你要测试一个查询接口,在没有初始化测试数据的情况下,你入参是:id = 1,断言是: assert name = ‘测试’, 这个断言是你预先知道接口会返回什么。调用接口时候,接口返回结果是name = ‘测试’,断言成功,因为你知道数据库有一条id=1的数据。

哪天这条id=1的数据被人删除,但是你维护的接口测试框架还在跑,并没有更新测试数据,结果断言失败,你上去debug,最后发现是测试数据的问题,这个过程是费时又费劲的,

如果做了测试数据初始化的功能,完全是可以避免的。

因为入参和出参都是固定的,是按自己需要初始化好的,不用担心数据变化引发断言失败,那么只关心接口程序代码的问题了。

2.无法测试加密接口
    公司项目中,大部分接口是不供外部调用,会使用用户认证、签名、加密等手段,提供接口的安全性。而一般的测试工具无法做到模拟和生成这些加密算法。

3.扩展能力不足
    工具始终是工具,有一定的局限性,无法生成自定义测试报告,无法定制化发送邮件,持续集成和定时任务。

4.对业务的支持程度
    工具对业务支持程序相对比较低,无法根据不同业务定制化开发,而自动化测试框架可以做到这点,对业务支持比较灵活。

  框架设计思路

1.大致处理流程:

2.接口自动化测试框架处理过程:

  • 首先编写一份测试数据初始化的脚本,维护一批测试数据到数据库,并且每次初始化前,清空原来的数据,这样保证数据是最新和唯一的(避免重复)。
  • 调用被测系统的接口,传入参数,这个请求参数是字典,并且数据与数据库数据(数据是初始化时插入)中一致。
  • 系统接口会根据入参,向测试数据库查询。
  • 查询结果组装成一定格式(dict、json)的数据,返回给测试框架。
  • 测试框架断言接口返回的数据,并生成测试结果(测试报告)。

  框架结构

框架介绍:

各个目录的作用:

  1. common/: 报告、日志等公共模块存放文件夹
  2. config/: 文件路径、配置信息存放
  3. db_init/: 测试数据初始化处理程序
  4. logs/: 生成日志文件
  5. pies/: 饼图存放
  6. report/: 测试报告存放
  7. testcase/: 用于编写测试用例
  8. run_main.py 执行测试集的主程序

主程序运行文件run_main.py:

# -*- coding: utf-8 -*-
‘‘‘
@author: liudinglong

@software: pycharm

@file:  run_main.py

@time: 2020/2/23 0023 13:46

‘‘‘

import time ,sys
# 引用模块路径
sys.path.append(‘./testcase‘)
sys.path.append(‘./db_fixture‘)
from common.HTMLTestRunner3 import HTMLTestRunner
from unittest import defaultTestLoader
from db_init import data_init

# 指定测试用例为当前文件夹下的 interface 目录
test_dir = ‘./testcase‘
# 自动获取interface 目录下的测试用例
testsuit = defaultTestLoader.discover(test_dir,pattern=‘*test.py‘)

if __name__ == ‘__main__‘:
    # 初始化接口测试数据
    data_init.init_data()
    # 获取当前时间
    now = time.strftime("%Y-%m-%d %H_%M_%S")
    # 定制报告名称
    filename = ‘./report/‘ + now + ‘_result.html‘
    # 向报告写入测试结果数据
    fp = open(filename, ‘wb‘)
    runner = HTMLTestRunner(stream=fp,
                            title=‘接口自动化测试报告‘,
                            description=‘运行环境:环境:windows 10 浏览器:chrome 语言: Python3‘)
    # 运行测试集
    runner.run(testsuit)
    # 关闭报告文件
    fp.close()

测试数据初始化data_init.py:

# -*- coding: utf-8 -*-
‘‘‘
@author: liudinglong

@software: pycharm

@file:  data_init.py

@time: 2020/2/23 0023 13:37

‘‘‘

import sys, time,datetime
sys.path.append(‘../db_init‘)
try:
    from mysql_conn import DB
except ImportError:
    from .mysql_conn import DB

# 定义过去时间,time.localtime(time.time())格式化时间戳为本地时间
past_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()-100000))

# 定义将来时间
future_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()+10000))

# 获取当前时间
now_time = datetime.datetime.now().strftime(‘%Y-%m-%d %H:%M:%S‘)

# create data
datas = {
    ‘django_web_event‘:[
        {‘id‘:1,‘name‘:‘红米Pro发布会‘,‘`limit`‘:2000,‘status‘:1,‘address‘:‘北京会展中心‘,‘start_time‘:future_time},
        {‘id‘:2,‘name‘:‘可参加人数为0‘,‘`limit`‘:0,‘status‘:1,‘address‘:‘北京会展中心‘,‘start_time‘:future_time},
        {‘id‘:3,‘name‘:‘当前状态为0关闭‘,‘`limit`‘:2000,‘status‘:0,‘address‘:‘北京会展中心‘,‘start_time‘:future_time},
        {‘id‘:4,‘name‘:‘发布会已结束‘,‘`limit`‘:2000,‘status‘:1,‘address‘:‘北京会展中心‘,‘start_time‘:past_time},
        {‘id‘:5,‘name‘:‘小米5发布会‘,‘`limit`‘:2000,‘status‘:1,‘address‘:‘北京国家会议中心‘,‘start_time‘:future_time},
    ],
    ‘django_web_guest‘:[
        {‘id‘:1,‘realname‘:‘alen‘,‘phone‘:13511001100,‘email‘:‘[email protected]‘,‘sign‘:0,‘event_id‘:1},
        {‘id‘:2,‘realname‘:‘has sign‘,‘phone‘:13511001101,‘email‘:‘[email protected]‘,‘sign‘:1,‘event_id‘:1},
        {‘id‘:3,‘realname‘:‘tom‘,‘phone‘:13511001102,‘email‘:‘[email protected]‘,‘sign‘:0,‘event_id‘:5},
    ],
}

# Inster table datas
def init_data():
    DB().init_data(datas)

if __name__ == ‘__main__‘:
    init_data()

  运行程序

运行结果:

......FFFFFF.................
Time Elapsed: 0:00:00.208256

 

测试日志:

测试报告:

 有错误不要害怕,看看报错信息,再修改一下,运行后:

  总结

  在测试之前,要准备测试环境,如果是正式环境的接口,有条件的话,建议独立创建测试数据库,避免对正式数据造成影响。可以在本地创建或在正式库服务器是上创建db,本套仅作为项目测试环境使用。
   在数据库初始化时,连接测试环境的数据库,将自己需要的测试数据初始化进去,每次程序执行的时候,都初始化一遍,这样的作用防止数据与正式数据冲突,并且防止测试数据重复和累积在数据库中。

  源码获取

源码已经托管gitee,获取方式:加入测试开发交流QQ群:696400122
微信公众号:全栈测试开发日记,
CSDN地址:https://blog.csdn.net/liudinglong1989/article/details/104457379

原文地址:https://www.cnblogs.com/liudinglong/p/12350109.html

时间: 2024-10-25 21:42:33

基于Python接口自动化测试框架(初级篇)附源码的相关文章

Python接口自动化测试框架实战 从设计到开发

第1章 课程介绍(不要错过)本章主要讲解课程的详细安排.课程学习要求.课程面向用户等,让大家很直观的对课程有整体认知! 第2章 接口测试工具Fiddler的运用本章重点讲解如何抓app\web的http\https请求包.如何模拟请求数据.过滤规则及修改响应数据.如何解决无法抓包问题        以及fiddler接口测试,让大家能应用好工具! 第3章 Requests常见方法实战运用本章重点讲解 get\post请求测试.接口测试中结果处理.上传\下载文件接口测试.请求中header及coo

基于Windows Socket的安全通信(C++实现,附源码)

先了解一下Socket的相关函数原型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 //加载套接字库 int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData); //释放套接字库资源 int PASCAL FAR WSACleanup(void); //创建套接字 SOCKET PASCAL FAR socket (int af,int type,int pr

基于Python的datetime模块和time模块源码阅读分析

目录 1 前言  2 datetime.pyi源码分步解析 2.1 头部定义源码分析 2.2 tzinfo类源码分析 2.3 date类源码分析 2.4 time类源码分析 2.5 timedelta类源码分析 2.6 datetime类源码分析 2.7 格式化字符串 3 time模块time.pyi源码解析 1 前言 最近工作需求上对于datetime模块中的方法调用比较多,有时还要返回指定的格式,以及大小比较等情况.发现使用Python自带的datetime模块可以很好地实现相关需求,但是对

Appium基于Python APP自动化测试框架 -- PO

关于对自动化测试框架PO的认识详见之前我写的博客:http://www.cnblogs.com/hanxiaobei/p/6755329.html 本篇主要是说appium自动化测试如何有PO的设计思想来实现. PO模型的目录结构: 其中,main.py为框架的主入口,test_creat.py调用creat_page.py,creat_page.py调用base_page.py. PO代码示例: main.py 1 import unittest 2 import HTMLTestRunner

python接口自动化测试框架

环境:python3 + unittest + requests Excel管理测试用例, HTMLTestRunner生成测试报告 测试完成后邮件发送测试报告 jsonpath方式做预期结果数据处理,后期多样化处理 后期扩展,CI持续集成 发送邮件效果: 整体结构: common模块 class IsInstance: def get_instance(self, value, check): flag = None if isinstance(value, str): if check ==

Python开源软件大全(内附源码)

写个web服务,可以用python:写个服务器脚本,可以用python:写个桌面客户端,可以用python:做机器学习数据挖掘,也可以用python--用处这么多,你是不是也想看看Python开源软件大全都有哪些内容? 1.CheungSSH 它是一款中国人自主研发的Linux运维自动化管理服务器软件,简单,不需要特定的语法,不需要学习,即使不懂得Linux的人也能操作.功能完备,命令执行.文件传输.批量部署程序.服务器资产信息收集.计划任务.开放的API等主要功能.最主要的是,使用免费. 下载

分享《深度学习入门:基于Python的理论与实现》+PDF+源码+斋藤康毅+陆宇杰

下载:https://pan.baidu.com/s/1FYcvG1tB__ooitilMpJC7w 更多资料分享:http://blog.51cto.com/14087171 <深度学习入门:基于Python的理论与实现>高清中文版PDF+源代码 高清中文版PDF,314页,带目录标签,可复制粘贴,高清晰.配套源代码. 深度学习真正意义上的入门书,深入浅出地剖析了深度学习的原理和相关技术.书中使用Python3,尽量不依赖外部库或工具,从基本的数学知识出发,带领读者从零创建一个经典的深度学习

python 接口自动化测试--框架整改(五)

代码结构: 目标架构: 1.用例分析器,自动根据接口的参数,类型生成测试用例 2.数据分析器,自动维护接口参数数据,动态数据自动生成,返回结果自动查询判断 3.核心调用引擎,分SOAP和HTTP两种,调用用例,返回接口调用的结果 4.报告输出,统计用例通过率,错误日志,数据库持久化,持续集成 目前实现功能: 核心调用引擎,数据分析器(demo) 1.用例结构(更新) excel分两个sheet,sheet1中存放用例,结构如下 sheet2中存放测试环境host,接口wsdl地址,接口方法间的映

AI新时代-大神教你使用python+Opencv完成人脸解锁(附源码)

好吧,伙计们,我回来了.说我拖更不写文章的可以过来用你的小拳拳狠命地捶我胸口.... 那么今天我们来讲关于使用python+opencv+face++来实现人脸验证及人脸解锁.代码量同样不多,你可以将这些代码运用在其它一些智能领域,如智能家居,进门的时候判断你是谁,也可以加入机器学习判断来的人是客人还是熟人.在讲之前我们会先适当的拓扑一下关于人脸识别的知识点.OK废话少说下面开始正是话题. 解锁原理: 原理呢,其实很简单,没有那么复杂难懂(当然除了官方语言之外).我们先来通俗的说一下利用Face