python进行接口自动化测试

news2024/11/17 13:35:40

一、接口自动化测试的流程

1、需求分析

1、1请求(url,方法、数据)

2、挑选需要做自动化测试的接口

3、设计自动化测试用例

4、搭建自动化测试环境

5、设计自动化执行框架(报告、参数化、 用例执行框架)

6、编写代码

7、执行用例(unittest、pytest)

8、生成测试报告(htmltextrunner\allure)

二、用例设计

2、1单接口

模板:id,模块,接口名称,请求url,用例名称,请求方法,请求参数类型,请求参数,预期结果,实际结果,备注

注意:单接口颗粒度放的比较小(以测试数据为颗粒度)

2、2多接口

模板:id,模块,接口名称,请求url,用例名称,请求方法,请求参数类型,请求参数,预期结果,实际结果,备注

注意:多个接口颗粒度为每个接口为基础,每个接口内所设计的数据可以通过参数化来解决。

三、自动化目录结构

1、配置层(common)

1

2

3

4

5

6

7

8

9

import os

def filePath(fileDir='',fileName=''):

    '''

    :param fileDir: 目录

    :param fileName: 文件的名称

    :return:

    '''

    return os.path.join(

        os.path.dirname(os.path.dirname(__file__)), fileDir, fileName)

2、用例执行业务层(testcase)


import pytest,json,allure
from util.apiutil import Request
from util.yamlutil import OperationYaml
from util.excelutil import OperationExcel,ExcelVarles

obj = Request()
objYaml = OperationYaml()
objExcel = OperationExcel()
data_key = ExcelVarles

class TestExcel:
    # request封装
    def run_api(self, url, method, params=None, headers=None, cookies=None):
        if str(method).lower() == "get":
            res = obj.get(url, params=params, headers=headers, cookies=cookies)
        elif str(method).lower() == "post":
            res = obj.post(url, json=params, headers=headers, cookies=cookies)
        return res

    # 运行前置用例
    def run_pre(self, pre_case):
        url = objYaml.readbaseyaml()["test_url"] + pre_case[data_key.url]
        method = pre_case[data_key.method]
        params = eval(pre_case[data_key.params])
        headers = pre_case[data_key.headers]
        header = self.json_parse(headers)
        cookies = pre_case[data_key.cookies]
        res = self.run_api(url, method, params, header)
        print("前置用例执行:%s" % res)
        return res
    @pytest.mark.parametrize('datas',objExcel.runs())
    # 运行测试用例
    def test_login(self,datas):
        url = objYaml.readbaseyaml()["test_url"] + datas[data_key.url]
        print(url)
        case_id = datas[data_key.case_id]
        case_model = datas[data_key.case_model]
        case_name = datas[data_key.case_name]
        pre_exec = datas[data_key.pre_exec]
        method = datas[data_key.method]
        params = eval(datas[data_key.params])
        expect_result = datas[data_key.expect_result]
        headers = datas[data_key.headers]
        cookies = datas[data_key.cookies]
        code = datas[data_key.code]
        db_verify = datas[data_key.db_verify]
        if pre_exec:
            pass
            pre_case = objExcel.case_prev(pre_exec)
            print("前置条件信息为:%s" % pre_case)
            pre_res = self.run_pre(pre_case)
            headers = self.get_correlation(headers,pre_res)
        header = self.json_parse(headers)
        res = self.run_api(url, method, params, header, cookies)
        print("测试用例执行:%s" % res)
        assert expect_result in str(res["body"]["message"])
        assert code == int(res["code"])

        # 对allure报告进行配置
        # allure
        # sheet名称  feature 一级标签
        # allure.dynamic.feature(sheet_name)
        # 模块  story 二级标签
        allure.dynamic.story(case_model)
        # 用例ID+接口名称  title
        allure.dynamic.title(case_id + case_name)
        # 请求URL  请求类型 期望结果 实际结果描述
        desc = "<font color='red'>请求URL: </font> {}<Br/>" \
               "<font color='red'>请求类型: </font>{}<Br/>" \
               "<font color='red'>期望结果: </font>{}<Br/>" \
               "<font color='red'>实际结果: </font>{}".format(url, method, expect_result, res)
        allure.dynamic.description(desc)

    def json_parse(self,data):  # 格式化字符,转换json
        # if headers:
        #     header = json.loads(headers)
        # else:
        #     header = headers
        return json.loads(data) if data else data

    # token参数关联替换
    def get_correlation(self,header,pre_res):
        # 验证是否有关联
        headers_para = objExcel.params_find(header)
        if len(headers_para):
        # 有关联,执行前置用例,获取结果
            headers_data = pre_res["body"]["data"]["token"][headers_para[0]]
            # 结果替换
            headers = objExcel.res_sub(header, headers_data)
        return headers

if __name__ == '__main__':
    pytest.main(["-s", "-v", "test_single_api.py"])

3、数据驱动(data)

存放excel,yaml文件

4、测试报告(report)

5、工具层(第三方工具包)apiutil.py


import requests

class Request():
    def requests_api(self,url, json=None, headers=None, cookies=None, params=None, data=None,method="get"):
        if method == "get":
            r = requests.get(url=url,headers=headers,cookies=cookies,params=params,data=data)
        elif method == "post":
            r = requests.post(url=url,json=json,headers=headers,cookies=cookies)
        elif method == "put":
            r = requests.put(url=url,headers=headers,cookies=cookies,params=params)
        elif method == "delete":
            r =requests.delete(url=url,headers=headers,cookies=cookies,params=params)
        code = r.status_code
        try:
            body = r.json()
        except Exception as e:
            body = r.text
        res = dict()
        res["code"] = code
        res["body"] = body
        return res
    def get(self,url,**kwargs):
        return self.requests_api(url, method="get", **kwargs)
    def post(self,url,**kwargs):
        return self.requests_api(url, method="post", **kwargs)
    def put(self,url,**kwargs):
        return self.requests_api(url, method="put", **kwargs)
    def delete(self,url,**kwargs):
        return self.requests_api(url, method="delete", **kwargs)

excelutil.py


import xlrd
from common.basepath import *
import json
import re

p_data = '\${(.*)}\$'
class ExcelVarles:
    case_id = "用例ID"
    case_model = "模块"
    case_name = "接口名称"
    url = "请求URL"
    pre_exec = "前置条件"
    method = "请求类型"
    params_type = "请求参数类型"
    params = "请求参数"
    expect_result = "预期结果"
    actual_result = "实际结果"
    beizhu = "备注"
    is_run = "是否运行"
    headers = "headers"
    cookies = "cookies"
    code = "status_code"
    db_verify = "数据库验证"

class OperationExcel:
    @property
    def getExcelDatas(self):
        datas = list()
        book = xlrd.open_workbook(filePath('data', 'api.xlsx'))
        getsheet = book.sheet_by_index(0)
        title = getsheet.row_values(0)
        for row in range(1,getsheet.nrows):
            row_values=getsheet.row_values(row)
            datas.append(dict(zip(title,row_values)))
        return datas

    def runs(self):
        # 获取到可执行的测试用例
        run_list=[]
        for item in self.getExcelDatas:
            isRun=item[ExcelVarles.is_run]
            if isRun == 'y':
                run_list.append(item)
            else:
                pass
        return run_list

    def params(self):
        '''对请求参数为空做处理'''
        params_list=[]
        for item in self.runs():
            params=item[ExcelVarles.params]
            if len(str(params).strip())==0:
                pass
            elif len(str(params).strip())>=0:
                params=json.loads(params)

    def case_prev(self,casePrev):
        # 据前置测试条件找到关联的前置测试用例
        for item in self.getExcelDatas:
            if casePrev in item.values():
                return item
        return None

    def res_find(self,data, pattern_data=p_data):  # 查询
        # pattern = re.compile('\${(.*)}\$')
        pattern = re.compile(pattern_data)
        re_res = pattern.findall(data)
        return re_res

    def res_sub(self,data, replace, pattern_data=p_data):  # 替换
        pattern = re.compile(pattern_data)
        re_res = pattern.findall(data)
        if re_res:
            return re.sub(pattern_data, replace, data)
        return re_res

    def params_find(self,headers):  # 验证请求中是否有${}$需要结果关联
        if "${" in headers:
            headers = self.res_find(headers)
        return headers

yamlutil.py


import  yaml
from common.basepath import filePath


class OperationYaml:
    def readYaml(self,fileDir='data',fileName='login.yaml'):     ### 获取login测试用例
        with open(filePath(fileDir=fileDir, fileName=fileName),'r',encoding='utf-8') as f:
            return list(yaml.safe_load_all(f))

    def readbaseyaml(self,fileDir='data',fileName='base.yaml'):
        with open(filePath(fileDir=fileDir, fileName=fileName), 'r', encoding='utf-8') as f:
            return yaml.safe_load(f)

    def readgoodsyaml(self,fileDir='data',fileName='goods.yaml'):    ### 获取商品测试用例
        with open(filePath(fileDir=fileDir, fileName=fileName), 'r', encoding='utf-8') as f:
            return list(yaml.safe_load_all(f))

6、运行入口层(运行测试用例,并生成报告)

2023超详细的Python接口自动化测试进阶教程合集,真实模拟企业项目实战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1066722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工程派工单,建筑工程派工单

工程派工单是指建设项目管理人员或工程维修人员发出的文件&#xff0c;用于标明工人或维修人员在建设项目或设备中处理或维修问题的任务。派工单包括建设项目的实际维护任务、所需材料、工具等信息&#xff0c;以及具体的执行人员和完成时间。工程派工单是保证建设项目顺利开展…

用《斗破苍穹》的视角打开C#3 标签与反射(人物创建与斗技使用)

随着剧情的发展&#xff0c;主线人物登场得越来越多&#xff0c;时不时跳出一个大佬&#xff0c;对我张牙舞爪地攻击。眼花缭乱的斗技让我不厌其烦&#xff0c;一个不小心&#xff0c;我就记不清楚在哪里遇上过什么人&#xff0c;他会什么斗技了。这时候&#xff0c;我就特别希…

Centos中清除因程序异常终止,导致的残留的Cache/buff_drop_caches命令---linux工作笔记063

我这里因为nifi程序背压设置的不合理,导致,内存和CPU消耗过高,系统崩溃,但是重启NIFI以后,发现 对应的执行top命令,看到,系统的buff/cache 依然没有减少,说明内存被浪费了,残留在这里没有被回收. 用这个办法执行这个命令; linux会自动触发清理,但是只有在内存不够用的时候才会…

计算机竞赛 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python

文章目录 1 简介2 传统机器视觉的手势检测2.1 轮廓检测法2.2 算法结果2.3 整体代码实现2.3.1 算法流程 3 深度学习方法做手势识别3.1 经典的卷积神经网络3.2 YOLO系列3.3 SSD3.4 实现步骤3.4.1 数据集3.4.2 图像预处理3.4.3 构建卷积神经网络结构3.4.4 实验训练过程及结果 3.5 …

沈阳陪诊系统|沈阳陪诊系统开发|沈阳陪诊系统功能和优势

在现代医疗服务中&#xff0c;陪诊系统服务正变得越来越重要。这项创新的服务提供了一种全新的方式&#xff0c;帮助患者在医院就诊时获得更好的照顾和支持。无论是面对复杂的医学流程还是需要心理支持&#xff0c;陪诊系统服务都能够为患者提供方便、专业的帮助。陪诊系统服务…

自学SLAM(3)---保姆教程教你如何使用摄像头运行ORB-SLAM2

前言 上一篇文章我讲述了如何使用自己的视频运行ORB-SLAM2 链接如下&#xff1a; 链接: 上一篇&#xff0c;环境搭建及使用自己的视频运行ORB-SLAM2 没有搭建环境的朋友看上面我的链接哦&#xff0c;里面有超详细的环境搭建&#xff0c;一步一步来保姆级别的哦 那么本篇&#…

【mysql 大表清理】磁盘占用太多,清理无效大表

在使用MySQL数据库时&#xff0c;有时候由于数据量增加或者磁盘空间限制&#xff0c;会导致数据库磁盘空间不足的问题。这会影响到数据库的正常运行&#xff0c;需要及时清理磁盘空间来解决问题。本文将介绍如何清理MySQL数据库的磁盘空间&#xff0c;并给出示例以帮助读者更好…

wget出现无法建立SSL连接的问题

出现这个问题的原因&#xff0c;这是因为wget在使用https协议的时候&#xff0c;默认会去验证网站的证书&#xff0c;而这个证书验证经常会失败&#xff0c;加上"--no-check-certificate"选项&#xff0c;就能排除掉这个错误

MongoEngine 简介安装、连接、数据类型及其参数详解

文章目录 前言一、MongoEngine 简介二、MongoEngine的安装与连接1. 安装MongoEngine2. 连接到MongoDB3. 定义数据模型 三、MongoEngine模型介绍1. 常见数据类型2. 数据类型参数 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方…

除静电离子风棒的工作原理及应用

除静电离子风棒是一种常见的除静电设备&#xff0c;它的工作原理是通过产生大量的负离子来中和物体表面的静电电荷&#xff0c;从而达到除静电的目的。 静电离子风棒内部装有一个电离器&#xff0c;电离器会将空气中的氧气分子或水分子电离成正、负离子。这些带电的离子在空气…

ubuntu疑难杂症

1.ubuntu 使用apt 安装软件时提示出现不能获得lock $ sudo rm /var/lib/dpkg/lock$ sudo dpkg --configure -a$ sudo rm /var/lib/apt/lists/lock

什么是防抖和节流

防抖和节流都是前端开发中常用的优化性能的技术。 一、定义 防抖&#xff1a; 防抖指的是在事件触发后&#xff0c;在规定的时间内若再次触发&#xff0c;则重新计时&#xff0c;直到规定时间内没有再次触发事件&#xff0c;才执行事件处理。这样可以避免在短时间内频繁地触发…

vtk之【vtkPolyData、vtkCell、vtkPoints】

文章目录 一,vtkPolyData、cell、point1) 例子2) vtkPolyData、vtkCell、vtkPoints 二,vtkNew<>与vtkSmartPointer<>的区别:三&#xff0c;补充 一,vtkPolyData、cell、point 1) 例子 /*** vtkNew 是一个类模板* vtkNew<> 是一个简单的 RAII&#xff08;Res…

【ARM CoreLink 系列 5 -- CI-700 控制器介绍 】

文章目录 1.1 什么是 CI-700?1.1.1 关于 CI-7001.1.2 CI-700 特点1.2 全局配置参数1.2.1 寻址能力1.3 组件和配置1.3.1 CI-700 互联的结构1.3.2 Crosspoint(XP)1.3.3 外部接口1.4 组件(Components)1.1 什么是 CI-700? CI-700是一种AMBA 5 CHI互连,具有可定制的网状拓扑结构…

onlyOfice取消上传文件大小的限制

进入docker容器 docker exec -it 容器名ID bash 编辑配置文件 #如果不能编辑,需安装vim apt-get update apt-get install vim #如果不能安装vim&#xff0c;可以在容器外部编辑配置文件后上传至容器&#xff1a; docker cp /home/file/文件 容器id:/etc/onlyoffice/d…

2023/10/7 -- ARM

【程序状态寄存器读写指令】 1.指令码以及格式 mrs:读取CPSR寄存器的值 mrs 目标寄存器 CPSR&#xff1a;读取CPSR的数值保存到目标寄存器中msr:修改CPSR寄存器的数值msr CPSR,第一操作数:将第一操作数的数值保存到CPSR寄存器中//修改CPSR寄存器&#xff0c;也就表示程序的状…

频敏变阻器 BP4G-31511/06350 BP4G-25010/04563 结构简单、操作方便

BP4G系列频敏变阻器&#xff08;以下简称BP4G&#xff09;适用于14-1000KW绕线型异步感应电机作重载偶尔起动用。它具有结构简单、操作方便、维护容易等优点&#xff0c;是一种理想的电动机起动装置 BP4G系列频敏变阻器(以下简称BP4G)适用于14-1000KW绕线型异步感应电机作重载…

川西旅游网系统-前后端分离(前台vue 后台element UI,后端servlet)

前台&#xff1a;tour_forword: 川西旅游网前端----前台 (gitee.com) 后台&#xff1a;tour_back: 川西旅游网-------后台 (gitee.com) 后端 &#xff1a;tour: 川西旅游网------后端 (gitee.com)

点餐小程序实战教程05-用户注册

上一篇我们讲解了用户身份识别的问题&#xff0c;本篇我们讲解一下注册功能以及审核功能。 1 表单容器 注册功能是使用表单容器完成&#xff0c;表单容器会根据数据源的字段来自动的生成页面&#xff0c;从右侧的组件区拖入表单容器 表单容器需要选择我们创建的用户管理的数…

GaussDB技术解读系列:高安全之密态等值

在第14届中国数据库技术大会&#xff08;DTCC2023&#xff09;的GaussDB“五高两易”核心技术&#xff0c;给世界一个更优选择专场&#xff0c;华为GaussDB首席安全架构师郭亮详细解读了GaussDB的高安全之密态等值技术。 本篇为大家分享GaussDB高安全的关键特性&#xff0c;名字…