Python+Pytest接口自动化之测试函数、测试类/测试方法的封装

2023-12-21

前言

在python+pytest 接口自动化系列中,我们之前的文章基本都没有将代码进行封装,但实际编写自动化测试脚本中,我们都需要将测试代码进行封装,才能被测试框架识别执行。

例如单个接口的请求代码如下:

import requests
 
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
}
 
url = "https://www.cnblogs.com/lfr0123/"
res = requests.get(url=h_url, headers=headers)

假设我们需要将上面这段代码编写成测试框架能执行的测试用例,仅仅只是这样写代码显然是不够的,还需要进行如下补充:

  • 需要将代码封装成单元测试框架 (pytest或unittest) 能识别的测试函数或测试类,否则将不会被识别执行。
  • 需要加上断言,即结果与期望之间的对比,单元测试框架才能判定该用例执行结果是否通过,结果==期望则说明通过,否则失败。

python中函数以及类的封装这里不做过多说明,pytest断言大家可以参考文章pytest(5)-断言,而这篇文章的目的是让大家明白在接口自动化测试中一般怎样封装测试代码。

测试用例封装的一般规则

测试用例的封装有两种, 测试函数 和测试类,封装的一般规则如下:

  • 一个测试函数对应一条测试用例。
  • 测试类中可定义多个测试方法,一个测试方法对应一条测试用例,测试类可以看作是一个测试用例集。
  • pytest中测试函数或测试方法的命名必须以test开头,测试类名必须以Test开头。具体命名规则可以参考我之前的文章pytest(3)-测试命名规则。
  • 对于单接口的测试校验,一个单接口的测试用例只包含一个接口请求,即将一个接口请求封装成一个测试函数或测试方法。
  • 对于场景(多接口) 的测试校验,一条场景测试用例需请求多个接口,因此需要将多个接口请求封装在同一个测试函数或方法中。
  • 一般封装一个接口的正向校验、异常校验封装成不同的方法,并封装在同一个测试类中。如定义一个登陆的测试类,正确用户名、密码请求封装成一个方法 (即一条测试用例),正确用户名、错误密码请求封装成另一个方法 (即另一条测试用例)。
  • 也可以将某个功能点或功能相关联的接口用例封装在同一个测试类中。比如个人中心涉及到的接口,可以封装在同一个测试类中

测试函数的封装

一般而言,一个测试函数对应一条用例。上面的代码编写成一条测试用例,示例如下:

强调,pytest中测试函数命名必须以test开头,如test_get_home。

测试类/方法的封装

一个测试类相当于一个测试用例集,类中的每个方法对应一条测试用例。以登录接口为例,封装成测试类,示例如下:

强调,pytest中测试类命名需要以Test开头,如TestLogin,且测试类中不能有init方法。测试类中测试方法必须以test开头,如test_login_normal。

示例代码

pytest中可以使用命令行或者使用代码方式即 pytest.main() 执行用例,具体可参考文章pytest(1)-简介。

完整的示例代码如下:


 import requests
import pytest
import json
 
def test_get_home():
    '''
    请求首页接口
    :return:
    '''
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
    }
 
    url = "https://www.cnblogs.com/lfr0123/"
    res = requests.get(url=url, headers=headers)
    # 断言,判断返回结果的code是否等于200,当然实际接口测试中一般返回结果中还会有别的字段需要断言
    assert res.status_code == 200
 
class TestLogin:
    '''
    登录接口校验
    '''
    url = "http://127.0.0.1:5000/login"
    headers = {"Content-Type": "application/json;charset=utf8"}
 
    def test_login_normal(self):
        '''正确用户名、正确密码登录'''
        data = {
            "username": "AndyLiu",
            "password": "123456"
        }
        res = requests.post(url=self.url, json=data, headers=self.headers)
        # 断言
        assert res.status_code == 200
        assert json.loads(res.text)["token"]
 
    def test_login_error(self):
        '''正确用户名、错误密码登录'''
        data = {
            "username": "AndyLiu",
            "password": "111111"
        }
        res = requests.post(url=self.url, json=data, headers=self.headers)
        # 断言
        assert res.status_code == 200
        assert not json.loads(res.text)["token"]
 
if __name__ == '__main__':
    pytest.main()

总结

  • 测试函数、测试类/测试方法的封装,其实不管是什么单元测试框架,遵循的方式都一样。
  • 而在命名方式上各有自己的要求,比如pytest与unittest中测试命名方法有一定的区别。
  • 把一个有自己断言的函数或方法看成是一条测试用例,那么测试类其实就是一个含有一条或者多条测试用例的测试用例集,类中的每个方法对应一条测试用例。
  • 一个测试类中放置哪些测试方法,换句话说一个测试用例集中应该包含哪些测试用例,这个可以按照项目自身情况而定,也可按照测试人员自己的想法而定,主旨就是要清晰明了。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:


这些资料,对于【 软件测试 】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 有需要的小伙伴可以点击下方小卡片领取

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python+Pytest接口自动化之测试函数、测试类/测试方法的封装 的相关文章

随机推荐

  • 框架网页中如何查看中心网页源码

    框架网页分框架和中心显示页面 直接浏览器右键 显示源码 看到的是框架的网页 方法 假设 框架网址是 a com menu index php 假设 单击菜单后显示的center网页是 manage user php 则我们知道最终中心网页的
  • QT中网络编程之发送Http协议的Get和Post请求

    文章目录 HTTP协议 GET请求 POST请求 QT中对HTTP协议的处理 1 QNetworkAccessManager 2 QNetworkRequest 3 QNetworkReply QT实现GET请求和POST请求
  • 我该如何解除微软账户儿童模式?

    之前注册微软账户时把日期填成小于14岁的了 现在出现由于你的家庭安全设置 你不能使用 Google Chrome 您可以访问以下网页 https account microsoft com family home lang 首先登陆后点击添
  • 华纳云:ServiceComb如何实现zipkin分布式调用链追踪

    Apache ServiceComb是一个开源的微服务框架 它提供了分布式系统开发所需的一系列工具和服务 在ServiceComb中 实现分布式调用链追踪可以通过整合Zipkin来实现 Zipkin是一个开源的分布式追踪系统 它可以帮助你跟
  • 23年12月AI烟火识别系统应用案例-北京梅兰芳故居防火系统

    AI烟火识别智能视频分析系统在文化遗产保护领域的应用 尤其是在梅兰芳故居防火系统的部署 是现代科技与传统文化保护结合的典范 这篇文章将详细介绍富维烟火识别系统的设计 实施及其在23年12月在北京梅兰芳故居中的应用 背景介绍 nbsp 梅兰芳
  • http通信 axios VS fetch

    基本用法 GET 两者都是基于Promise 所以可以使用 then 也可以使用async await fetch需要手动对相应内容进行转换 axios会根据响应头类型 进行自动转换 所以axios的代码更加简洁 axios get htt
  • netty源码:(28)ChannelPromise

    ChannelPromise是ChannelFuture的子接口 它是可写入的 其父接口Promise定义如下 ChannelPromise有个默认的实现类 DefaultChannelPromise 它的setSuccess方法用来调用所
  • Microsoft Family Safety Microsoft 家庭安全将人员添加到你的家庭组

    在 创建家庭组 后 通过添加家庭成员来浏览 Microsoft 家庭安全 的功能和权益 如果某人已是家庭组成员 则在加入另一个组之前 他们必须 退出该组或从该组中删除 他们还可以 创建一个新的 Microsoft 帐户 以与新的家庭组相关联
  • 大模型ChatGLM简介及应用情景

    本节介绍生成模型GLM系列模型的新成员 中英双语对话模型ChatGLM ChatGLM分为6B和130B 默认使用ChatGLM 6B 两种 主要区别在于其模型参数不同 ChatGLM是一个开源的 支持中英双语问答的对话语言模型 并针对中文
  • WaterBench: Towards Holistic Evaluation of Watermarks for Large Language Models

    本文是LLM系列文章 针对 WaterBench Towards Holistic Evaluation of Watermarks for Large Language Models 的翻译 WaterBench 面向大型语言模型水印的整
  • 【vue】$bus 跨组件调用方法

    1 新建bus js import Vue from vue 使用 Event Bus const bus new Vue export default bus 2 main js引用 import bus from libs bus Vu
  • 什么是DLNA

    DLNA旨在解决个人PC 消费电器 移动设备在内的无线网络和有线网络的互联互通 使得数字媒体和内容服务的无限制的共享和增长成为可能 DLNA的口号是Enjoy your music photos and videos anywhere an
  • LLaVA和LLaVA-Plus视觉指令微调及工具使用构建多模态智能体

    认识和理解视觉内容 以及基于人类指令对视觉世界进行推理 长久以来一直是一个具有挑战性问题 得益于大规模预训练 OpenAI 的 GPT 4V 展示了在自然语言处理任务和复杂视觉理解中令人印象深刻的能力 智源社区邀请到了LLaVA的一作柳昊天
  • 测试开发 | 智能辅助在心理健康治疗中的革新:倾听、理解、支持的新时代

    随着科技的迅速发展 智能辅助技术正在逐渐渗透到心理健康治疗领域 为个体提供更为智能 个性化的支持 这种创新性的结合为心理健康领域带来了新的可能性 使治疗更加灵活 高效 并为患者提供了更全面的关怀 1 虚拟治疗环境 智能辅助技术通过虚拟治疗环
  • 航空港务数据大屏为航空港的可持续发展提供有力支撑!

    随着经济的发展 不断加建与扩建民用机场 空港行业规模不断扩大 在不断引进和消化发达国家先进技术的同时 中国深入开展了对新技术和新材料的研究 极大地丰富和发展了中国的机场建设技术 且各项机场建设计划均已落实推进 行业在经济发展的推动下欣欣向荣
  • 在vue3的setup语法糖中为什么无法直接使用useRouter().currentRoute

    在vue3的setup语法糖中为什么无法直接使用useRouter currentRoute 问题 在setup语法糖中 不能直接使用useRouter xx
  • 测试开发 | 创业与人工智能的密切关系

    随着科技的迅猛发展 人工智能 AI 已经逐渐渗透到各个领域 为创业者带来了前所未有的机遇与挑战 在这个数字化转型的时代 创业与人工智能的密切关系日益凸显 成为推动创新和持续发展的关键因素 1 人工智能为创业提供新的商业模式 人工智能技术的不
  • 在spring boot项目引入mybatis plus后的的案例实践

    前景提要 1 项目背景 一个spring boot mybatis的项目 分页一直是PageHelper 2 为什么要引入mybatis plus 1 简化单表的crud 2 对mybatis plus进行简单的设计 以满足现有系统的规范
  • 龙芯loongarch64服务器编译安装paddlepaddle

    前言 PaddlePaddle Parallel Distributed Deep Learning 中文名飞桨 是百度公司推出的开源 易学习 易使用的分布式深度学习平台 现阶段各行各业均追求国产化 软件行业也一样 所有需要在龙芯服务器上编
  • Python+Pytest接口自动化之测试函数、测试类/测试方法的封装

    前言 在python pytest 接口自动化系列中 我们之前的文章基本都没有将代码进行封装 但实际编写自动化测试脚本中 我们都需要将测试代码进行封装 才能被测试框架识别执行 例如单个接口的请求代码如下 import requests he