接口自动化测试思路和实战(3):测试库框架

news2024/10/7 8:29:32

目录

测试库框架

步骤1、在common文件夹下新建common_api_info.py文件,把所有的api接口做个封装

步骤2、修改common_function.py文件

步骤3、修改test_get_access_token_api.py文件

步骤4、修改test_create_user_tag_api.py文件代码;

步骤5、再执行run_api_tests.py文件,执行所有用例;


测试库框架

  与模块化测试脚本框架很类似,并且具有同样的优点。不同的是测试库框架把待测应用程序分解为过程和函数而不是脚本(而测试脚本中只是包含调用函数的用例即可)。这个框架需要创建描述模块、片断以及待测应用程序的功能库文件。

场景: 在模块化框架中,我们发现常用的获取 token过程由于调用频繁,经常改动导致不好维护,所以做成一个函数进行调用,而其它所有的接口都可能会进行变更;

比如: 用例如下:

获取token---创建标签。

获取token---创建标签---删除刚创建的标签

获取token---创建标签---查询标签进行查询

下面通过测试库框架修改代码,改动的比较大,建议把上方写的项目重新复制一份,做个备份

步骤1、在common文件夹下新建common_api_info.py文件,把所有的api接口做个封装

方法封装,类封装都可以

 编写代码:

# encoding: utf-8
# @author: Jeffrey
# @file: common_api_info.py
# @time: 2022/7/26 22:05
# @desc: 测试库封装

import json

#该模块存放所有的接口定义及接口信息
class CommonApiInfo:

    def __init__(self,session,hosts):
        self.session = session
        self.hosts = hosts

    def get_access_token_api(self,grant_type,appid,secret):
        """获取token接口信息"""
        url_params = {"grant_type": grant_type,
                      "appid": appid,
                      "secret": secret}
        response = self.session.get(url="https://%s/cgi-bin/token" % self.hosts,
                                    params=url_params)
        return response

    def create_user_tag_info(self,token_value,tag_name):
        '''创建标签接口信息'''
        url_params = {"access_token": token_value}
        tag_info = { "tag": { "name": tag_name } }
        
        tag_str = json.dumps(tag_info, ensure_ascii=False)
        response = self.session.post(url="https://%s/cgi-bin/tags/create" % self.hosts,
                                     params = url_params,
                                     data=tag_str.encode('utf-8'))
        return response

    # 修改标签接口信息
    # 查询标签接口信息

步骤2、修改common_function.py文件

 编写代码:

# encoding: utf-8
# @author: Jeffrey
# @file: common_function.py
# @time: 2022/7/26 21:01
# @desc: 模块化框架
import jsonpath
from common.common_api_info import CommonApiInfo

def get_access_token_value(session_obj,hosts):
    """获取access_token的值"""
    response = CommonApiInfo(session_obj,hosts).get_access_token_api('client_credential',
                                                          'wxf14419077f707856',
                                                          '92a113bd4b5ffdc72144740dc7123c99')
    # 获取响应json中的access_token的值
    token_value = jsonpath.jsonpath(response.json(), "$.access_token")[0]
    return token_value

步骤3、修改test_get_access_token_api.py文件

 编写代码:

# encoding: utf-8
# @author: Jeffrey
# @file: test_get_access_token_api.py
# @time: 2022/7/24 18:08
# @desc:

# 导入模块顺序:内置模块、第三方模块、自定义模块
import unittest
import requests
import jsonpath
from common import local_config
from common.common_api_info import CommonApiInfo

class TestGetAccessTokenApi(unittest.TestCase):

    def setUp(self) -> None:
        self.session = requests.session()
        self.hosts = local_config.HOSTS
    def tearDown(self) -> None:
        self.session.close()

    def test_case_01(self):
        '''[api_case_01] 测试获取access_token能否正常调用'''

        response = CommonApiInfo(self.session,self.hosts).get_access_token_api(
            'client_credential','wxf14419077f707856','92a113bd4b5ffdc72144740dc7123c99'
        )
        # 获取响应json中的access_token的值
        actual_result = jsonpath.jsonpath(response.json(), "$.access_token")


        self.assertTrue(actual_result, "api_case_01 执行失败")  #非空,非0 都返回True为真

    def test_case_02(self):
        '''[api_case_02] 测试获取access_token接口在appid错误时,能否正常处理错误'''

        response = CommonApiInfo(self.session,self.hosts).get_access_token_api(
            'client_credential','wxf14419077f707','92a113bd4b5ffdc72144740dc7123c99'
        )
        # 获取响应json中的errcode的值,因为jsonpath返回的是列表,故加上下标0
        actual_result = jsonpath.jsonpath(response.json(), "$.errcode")[0]

        self.assertEqual(actual_result,40013,  "api_case_02 执行失败")



if __name__ == '__main__':
    unittest.main(verbosity=2)

查看执行结果:

步骤4、修改test_create_user_tag_api.py文件代码;

 编写代码:

# encoding: utf-8
# @author: Jeffrey
# @file: test_create_user_tag_api.py
# @time: 2022/7/24 19:02
# @desc:
import unittest
import requests
import jsonpath
import json
from common import common_function
from common import local_config
from common.common_api_info import CommonApiInfo


class TestCreateUserTagApi(unittest.TestCase):

    def setUp(self) -> None:
        self.session = requests.session()
        self.hosts = local_config.HOSTS
    def tearDown(self) -> None:
        self.session.close()

    def test_case_01(self):
        '''[api_case_03] 测试正常进行创建标签接口调用'''
        #获 取access_token
        token_value = common_function.get_access_token_value(self.session,self.hosts)


        # 解决中文乱码问题;模拟post请求时,携带json 数据包含中文发送给服务器会转码
        # 方式一:json.dumps()
        # 获取创建标签接口
        response = CommonApiInfo(self.session,self.hosts).create_user_tag_info(
            token_value,'深圳人5'
        )

        # # 方式二:修改requests中的models.py中的源码,修改完后
        # response = self.session.post(url="https://api.weixin.qq.com/cgi-bin/tags/create",
        #                              params=tag_url_params,
        #                              json=tag_boby)
        # print(response.json())


        # 获取响应json的tag的name值,因为jsonpath返回的是列表,故加上下标0
        actual_result = jsonpath.jsonpath(response.json(), "$.tag.name")[0]


        self.assertEqual(actual_result,"深圳人5", "api_case_03 执行失败")


if __name__ == '__main__':
    unittest.main(verbosity=2)

查看执行结果:

步骤5、再执行run_api_tests.py文件,执行所有用例;

好处: 1、易于维护2、测试用例脚本更多的去关注测试过程而淡化接口细节3、减少代码冗余


以下是我收集到的比较好的学习教程资源,虽然不是什么很值钱的东西,如果你刚好需要,可以评论区,留言【777】直接拿走就好了

各位想获取资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

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

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

相关文章

怒刷LeetCode的第15天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:哈希表双向链表 方法二:TreeMap 方法三:双哈希表 第二题 题目来源 题目内容 解决方法 方法一:二分查找 方法二:线性搜索 方法三:Arrays类的b…

JAVA学习-全网最详细

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

1960-2017年世界各国总和生育率数据

1960-2017年世界各国总和生育率数据 1、时间:1960-2017年 2、指标:生育率 3、范围:全球各国 4、来源:世界银行 5、指标解释: 总生育率表示假设妇女度过整个生育期并按照当期的年龄别生育率生育孩子所生育的孩子数…

第一次课进行分类代码

System32下的进程 #include <windows.h> #include <stdio.h> #include<TlHelp32.h> #include<psapi.h>int main() {HANDLE hProcessSnap;PROCESSENTRY32 pe32;// 获取进程快照hProcessSnap CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hPr…

微信编辑器自带导出功能,同步到公众号生成链接

​在微信编辑器里编辑好了文章&#xff0c;想把编辑器里的文章复制到其它网站或者分享给好友&#xff0c;怎么操作呢&#xff1f;其实很简单&#xff0c;可以通过编辑器自带的导出功能&#xff0c;或者同步到微信公众号生成链接&#xff0c;那今天小编先给大家说一说编辑器自带…

python setup.py egg_info“ failed with error code 1 in xxxxxxxx问题解决

python setup.py egg_info" failed with error code 1 in xxxxxxxx问题解决 一、问题描述&#xff1a;通过pip安装opencv-python时候&#xff0c;提示安装二、解决办法&#xff1a;升级pip三、结果 一、问题描述&#xff1a;通过pip安装opencv-python时候&#xff0c;提示…

Python 机器学习入门之线性回归

系列文章目录 第一章 Python 机器学习入门之线性回归 线性回归 系列文章目录前言一、线性回归1.线性回归是什么2.线性回归的分类 二、实现线性回归1.步骤2.代价函数3.梯度下降 总结 前言 最近在上机器学习的课程&#xff0c;第一次实验是做线性回归&#xff0c;那神马是线性回…

基于FPGA的图像坏点像素修复算法实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 202…

竞赛选题 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖&am…

Linux 读写锁

读写锁是一把锁 /*读写锁的类型 pthread_rwlock_tpthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);int pthread_rwlock_destory(pthread_rwlock_t *rwlock);int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);int pt…

Android逆向技术高阶大法

原文链接 Android逆向技术高阶大法 安卓应用是一个客户端&#xff0c;与传统软件类似&#xff0c;需要把软件打包&#xff0c;然后通过某种渠道&#xff08;应用市场&#xff09;分发给用户&#xff0c;这是常规的发布方式&#xff0c;它的更新节奏很慢&#xff0c;从你在应用…

系统集成|第十四章(笔记)

目录 第十四章 合同管理14.1 概述及相关概念14.2 项目合同14.3 《合同法》14.4 《仲裁法》 上篇&#xff1a;第十三章、干系人管理 第十四章 合同管理 14.1 概述及相关概念 主要包括合同签订管理&#xff0c;合同履行管理&#xff0c;合同变更管理以及合同档案管理。作为一个重…

自拟实现消息队列(MQ)基于Rabbit MQ(含概念和源码)巨详细!!!!!含思维导图

MQ目录 MQ基本概念什么是MQ&#xff1f;MQ的应用场景 首先先明白需求持久化分析那么MQ如何设计持久化&#xff1f; 可靠性分析高效性分析MQ核心概念&#xff08;装配层&#xff09;实现MQ组件思维导图创建项目导入数据库下载SqLite。 创建组件实体类创建交换机&#xff08;要加…

精通Linux系列第一章:探索Linux世界的大门

文章目录 一、前言二、 什么是Linux&#xff1f;三、Linux系统与Windows系统的区别四、为什么要学习Linux&#xff1f;五、 Linux的优势六、什么是Linux发行版&#xff1f;七、常见的Linux发行版八、如何选择适合你的Linux发行版&#xff1f;九、Linux各种发行版的优势与应用十…

【C语言】进阶——结构体+枚举+联合

①前言&#xff1a; 在之前【C语言】初阶——结构体 &#xff0c;简单介绍了结构体。而C语言中结构体的内容还有更深层次的内容。 一.结构体 结构体(struct)是由一系列具有相同类型或不同类型的数据项构成的数据集合&#xff0c;这些数据项称为结构体的成员。 1.结构体的声明 …

NVM:node多版本管理的下载安装及使用

NVM&#xff1a;node多版本管理的下载安装及使用 使用之前先卸载node&#xff0c;避免各种奇葩问题导致不成功。win卸载&#xff1a;win > 设置 > 应用 > 应用和功能&#xff0c;找到 node 点击出现卸载按钮并且卸载它。 1、下载安装&#xff1a; https://github.co…

信创之国产浪潮电脑+统信UOS操作系统体验1:硬件及软件常规功能支持情况介绍

一、引言 由于公司要求支持国产信创&#xff0c;最近办公的笔记本电脑换成了软硬件全国产&#xff0c;由于国产操作系统是在开源linux基础上演进的&#xff0c;在换之前&#xff0c;非常担心操作不方便&#xff0c;周边应用软件少&#xff0c;功能差&#xff0c;内心是比较抗拒…

C++:优先级队列模拟实现和仿函数的概念使用

文章目录 使用方法Compare仿函数一些场景模板参数和函数参数 本篇总结优先级队列 使用方法 首先在官网查看它的一些用法 template <class T, class Container vector<T>,class Compare less<typename Container::value_type> > class priority_queue;从…

软件测试之接口测试

1、什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型&#xff0c;测试类型又主…

Crypto:MD5

题目 下载了题目给的压缩包解压后&#xff0c;打开文件 使用md5解码器解码后得到&#xff0c;即为flag