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

前言

今天呢,笔者想和大家聊聊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://mp.toutiao.com/profile_v4/"
res = requests.get(url=h_url, headers=headers)

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

需要将代码封装成单元测试框架 (pytest或unittest) 能识别的测试函数或测试类,否则将不会被识别执行。
需要加上断言,即结果与期望之间的对比,单元测试框架才能判定该用例执行结果是否通过,结果==期望则说明通过,否则失败。
python中函数以及类的封装这里不做过多说明,这篇文章的目的是让大家明白在接口自动化测试中一般怎样封装测试代码。

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

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

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

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:822269834

 

三、测试类/方法的封装

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

强调,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中测试命名方法有一定的区别。
把一个有自己断言的函数或方法看成是一条测试用例,那么测试类其实就是一个含有一条或者多条测试用例的测试用例集,类中的每个方法对应一条测试用例。
一个测试类中放置哪些测试方法,换句话说一个测试用例集中应该包含哪些测试用例,这个可以按照项目自身情况而定,也可按照测试人员自己的想法而定,主旨就是要清晰明了

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

文档获取方式:

加入我的软件测试交流群:632880530免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

 

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国标28181平台只能连接视频监控吗?

在一些视频监控项目中,国标28181平台成为了必不可少的工具。这个平台的主要作用在于将分布在不同区域的视频监控录像机、摄像头等设备进行联网管理,同时还能将视频监控连接到上一级的国标监控平台。 可以说,国标监控平台是一个非常重要的承上…

【QT】解决QTableView修改合并单元格内容无法修改到合并范围内的单元格

问题:修改合并单元格的内容 修改合并单元格的内容时,希望直接修改到合并范围内的单元格,Qt没有实现这个功能,需要自己写出 Delegate来实现 方案:Delegate class EditDelegate : public QStyledItemDelegate {public:EditDelegate(QTableView *view): tableView(view){}pu…

【Spring Security】让你的项目更加安全的框架

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《MyBatis-Plus》。🎯🎯 &am…

【halcon深度学习之那些封装好的库函数】determine_dl_model_detection_param

determine_dl_model_detection_param 目标检测的数据准备过程中的有一个库函数determine_dl_model_detection_param “determine_dl_model_detection_param” 直译为 “确定深度学习模型检测参数”。 这个过程会自动针对给定数据集估算模型的某些高级参数,强烈建议…

kafka offset sasl加密连接

kafka-tool(offset) 进行SCRAM连接,直接上图 填写jaas的认证(账密 引用包)

【Java】网络编程-UDP字典服务器客户端简单代码编写

上文讲了UDP回响服务器客户端简单代码编写 本文将讲述UDP字典服务器客户端简单代码编写。所谓回显,就是指客户端向服务器发送一个报文,从服务器那里得到一条一模一样的回响报文 而我们的字典功能呢,则是实现了输入中文,得到对应…

力扣 面试经典150算法题

1合并两个有序数组88. 合并两个有序数组-CSDN博客简单23

Backend - Django 项目创建 运行

目录 一、配置环境 二、创建 Django 项目 (一)新建文件夹 (二)打开文件夹 (三)打开运行终端 (四)创建基础项目 (五)创建app 1. 安装Django &#xf…

分析某款go扫描器之四

一、概述 上文提到实现IP的探测存活以及tcp扫描的实现,这部分来分析实现本机网卡信息获取,以及维护一张mac地址表以及ip扫描端口状态表,同时实现syn扫描功能。 项目来源:https://github.com/XinRoom/go-portScan/blob/main/util…

PY32F072片内闪存读写 HAL库

我这个hal库底层是一次写一页,擦除也是以页为单位的。这个芯片太偏了,有点小恶心。 flash.c uint8_t flash_read(uint32_t add) {uint8_t temp;temp *(__IO uint8_t *)(add);return temp; }void flash_read_buf(uint32_t add, uint8_t *data, uint8_t…

【ICCV 2023】MPI-Flow:什么,只需要单张图片就能训练光流估计模型了?

ICCV 2023 | MPI-Flow:从单视角构建的多平面图像中学习光流 引言:主要贡献:Motivation:算法细节:Optical Flow Data GenerationIndependent Object MotionsDepth-Aware Inpainting 实验结果: 来源&#xff…

Python实现多元线性回归模型信用卡客户价值预测项目源码+数据+项目设计报告

多元线性回归——信用卡客户价值预测 一、背景 这里以信用卡客户的客户价值为例来解释客户价值预测的具体含义: 客户价值预测就是指预测客户在未来一段时间内能带来多少利润,其利润可能来自信用卡的年费、取现手续费、分期手续费、境外交易手续费等。分…

《C++ Primer》第13章 拷贝控制(三)

参考资料: 《C Primer》第5版《C Primer 习题集》第5版 13.5 动态内存管理类(P464) 某些类需要在运行时分配可变大小的内存空间。这种类通常可以用使用标准库容器来保存它们的数据。有些时候,我们希望类自己进行内存分配&#…

TypeScript【泛型1、泛型2、声明合并、命名空间 、模块1、模块2、声明文件简介】(五)-全面详解(学习总结---从入门到深化)

文章目录 泛型1 泛型2 声明合并 命名空间 模块1 模块2 声明文件简介 泛型1 泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性 首先,我们来实现一个函数…

小黑南京归来,参加部里的公务员培训,有点儿社死认识了好多小伙伴的leetcode之旅13. 罗马数字转整数

小黑代码 class Solution:def romanToInt(self, s: str) -> int:chars [M, CM, D, CD, C, XC, L, XL, X, IX, V, IV,I]nums [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]map_ dict((k, v) for k,v in zip(chars, nums))# 字符串长度n len(s)# 结果变量res …

安装Redis+Redis设置成windows下的服务+windows无法启动Redis服务,报错误1067:进程意外终止,解决方法

(一)安装Redis 官网地址:Redis 不过Redis 的官网不提供 Windows 版本的下载,可以从Github上下载,Windows版本的下载地址: https://github.com/microsoftarchive/redis/releases/ 无需安装,直…

2828. 判别首字母缩略词

2828. 判别首字母缩略词 难度: 简单 来源: 每日一题 2023.12.20 给你一个字符串数组 words 和一个字符串 s ,请你判断 s 是不是 words 的 首字母缩略词 。 如果可以按顺序串联 words 中每个字符串的第一个字符形成字符串 s ,则认为 s 是 words 的…

比例导引(PNG)-Matlab 程序

本文提供比例导引的matlab程序,想要看理论的可以看书《导弹飞行力学》或者我的博客 比例导引详解 代码 %% 三维比例导引末制导clc;clear; close all;%% 设置导弹初始参数和目标参数% 总步长 length 1000000; x_m zeros(length,1); y_m zeros(length,1); z_m z…

node.js mongoose

目录 官方文档 mongoose Schema Model Query document 关系 官方文档 Mongoose v8.0.3: Getting Started mongoose Mongoose 是一个 Node.js 环境下 MongoDB 的对象建模工具。它提供了一种在应用程序中与 MongoDB 数据库进行交互的方式,使得开发者能够使用…

基于k6和python进行自动化性能测试

摘要:在性能测试中,达到相应的性能指标对于一个软件来说十分重要,在本文中,将介绍一种现代化性能测试工具k6。 import http from k6/http; import { sleep } from k6; export default function () {http.get(https://test-api.co…
最新文章