Python接口自动化测试之UnitTest详解

news2024/11/24 16:23:22

基本概念

UnitTest单元测试框架是受到JUnit的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。

它分为四个部分test fixture、TestCase、test suite、test runner,分别是:

测试脚手架:为了开展项测试所需要进行的准备工作,以及所有相关的清理操作;

测试用例:一个测试用例是一个独立的测试单元。它检查输入特定的数据时的响应;

测试套件:它用于归档需要一起执行的测试用例;

测试运行器:是一个用于执行和输出测试结果的组件。

TestCase详解

类TestCase为测试用例提供了支持。通过继承TestCase来设置一个新的测试类,和设置测试方法,每个测试方法通过实际响应结果与预期结果对比来实现单元测试。

测试用例包括的方法:setUp()、tearDown()、setUpClass()、tearDownClass()。注意类名要以Test开头,测试用例的名称要以test开头

下面一个示例来展示:


import unittest
class Test_unittest(unittest.TestCase):
    def setUp(self) -> None:
        print('setup')
    def test(self):
        print('test')
    def tearDown(self) -> None:
        print('teardown')
if __name__ == '__main__':
    unittest.main()

在这里插入图片描述
可以看到运行结果打印了三条测试用例里的内容,setup和teatdown方法,在每次执行测试用例前后都会执行,如果再增加一条测试用例,setup和teardown也会再执行一次,如下图所示:
在这里插入图片描述

所以如果想初始化和结束方法只想执行一次的话,可以使用setUpClass()、tearDownClass(),但是注意得在方法前面添加注解@classmethod,看下面示例和结果:

import unittest
class Test_unittest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print('setup')
    def testcase1(self):
        print('testcase1')
    def testcase2(self):
        print('testcase2')
    def tearDown(self) -> None:
        print('teardown')
if __name__ == '__main__':
    unittest.main()

在这里插入图片描述
可以看到,使用了setUpClass()方法就只初始化了一次,teardown没使用就每条用例都会执行一次。

常用方法

断言

测试用例中还有常用的断言和skip跳过测试用例。在UniTtest框架中也提供了一个自带的断言方式,主要有以下几种:在这里插入图片描述

skip跳过

在实际测试中,如有功能缺陷的功能点对应的自动化测试用例执行不了,或者不执行的用例,可以用skip()方法来操作,使用方法为:

1.unittest.skip(‘输入理由’)——无条件执行跳过操作

2.unittest.skipif(2>1,’理由’)——判断条件为true的时候执行

3.unittest.skipUnless(1>2’理由’)—判断条件为false的时候执行

4.unittest.expectedFailure—执行错误不计入不通过用例中

下面查看示例,testcase1方法被跳过,testcase2方法使用了断言,但是断言结果不对,于是有报错信息:

import unittest
class Test_unittest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print('setup')
    @unittest.skip
    def testcase1(self):
        print('testcase1')
    def testcase2(self):
        a = 1
        self.assertEqual(a,2,msg='error')
        print('testcase2')
    def tearDown(self) -> None:
        print('teardown')
if __name__ == '__main__':
    unittest.main()

在这里插入图片描述

测试套件

当一个类里有多个测试用例又不会同时运行的时候,可以选择把测试用例添加到suite中,中suite运行(pycharm中直接在文件中写不行,要重新新建一个py文件)。

1.直接一个一个添加到suite中:

在这里插入图片描述

解释:导入该文件中的类,定义一个套件名称,使用testsuite方法,对该套件添加测试用例,定义一个运行名称,使用运行方法,添加测试套件,即可运行(得一个个的添加测试用例)。

2.定义一个列表【】把用例都存进去,然后运行:在这里插入图片描述

3.直接读取类名的形式来运行(最简单,最方便,不能使用‘’):在这里插入图片描述
4.也是读取名字,不过容易找不到类,需要在前面加一个文件名。

TestRunner

1.编写完脚本之后重新新建一个文件然后添加用例到suite,即可全部执行。

2.在网上下载htmlTestrunner源码,复制到python/lib目录即可import导入:在这里插入图片描述

Python之request

主要方法解析

requests是Python实现的最简单易用的HTTP库,requests库7个主要方法:在这里插入图片描述

举例:普通接口测试的接口之间没有关联性,所以直接定义变量去发起get、post请求即可。在这里插入图片描述 

其中post的请求常用的分为json和formdata,两种方式请求的参数方式如截图所示。需要鉴权的,需要导入auth包,然后跟在请求方法后面。

requests方法详解

具体方法查看可以直接按住ctrl+左键点击requests方法查看源码。

在这里插入图片描述

1.url: 请求地址

2.data:字典,字节序列或文件对象,作为Request的内容

3.json: JSON格式的数据,作为Request的内容

4.headers: 字典, HTTP定制头

5.cookie: 字典或CooKiJar, Request中的cookie

6.auth: 元祖,支持HTTP认证功能

7.files: 字典类型,传输文件

8.timeout: 设定超时时间,秒为单位

9.proxies: 字典类型,设定访问代理服务器,可以增加登录认证

10.allow_redirects: True/False,默认为True,重定向开关

11.stream: True/False,默认为True,获取内容立即下载开关

12.verity: True/False默认Ture,认证ssl证书开关

13.cert: 本地ssl证书路径

Response返回方法详解

1.response.status_code #返回的http响应状态码

2.response.content #返回的是bytes型也就是二进制的数据

3.response.headers # 返回的http请求头

4.response.json() # 返回响应中的Json数据

5.response.url # 返回url

6.response.encoding # 返回响应的编码格式

7.response.cookies # 返回响应中的cookie

8.response.text #返回的是Unicode型的数据。—文本

Session详解

对于需要前后接口依赖的接口测试,比如从上一个请求中获取token用作下一个接口请求的参数去提交的话,用上面一种方法明显不合适,按照上面的方法需要定义很多变量,然后根据依赖去添加到对应的请求参数里。

下面这种方法,使用session会话的方式,贯穿前后,只要添加了一次,所有请求都能用到。在这里插入图片描述

解释:

1.这个是cynthia缺陷管理系统,登录的时候需要拿到响应里的cookie作为下一个请求的cookie,不然登录不上。

2.所以在UniTtest结构中,可以把登录操作放到setup里面,类似UI自动化一样,登录放在初始化中。

3.在setup中把响应的cookie值,加入到请求的里面去了,同时添加了浏览器UA。

4.参数可以复用,从头到尾请求的变量都是rsp,body里的参数都是dict,编写简单方便。在这里插入图片描述

定义一个变量s等于requests的session会话,后面都用这个s的会话去发起请求。

定义一个变量等于rsp等于s去发起请求的结果。

s会话请求的头文件中cookie需要添加tokenid,不然登录不上,这个id在rsp响应信息里。

因为响应信息是json字典格式,所以要添加到请求头里需要按照截图格式。

如果需要在字典中添加字段或者内容,按照截图的格式s.headers[‘xxx’]=“xxx”,如果字典中有这个key:value,那么value值会直接更新,没有这个key那么则会添加这个key:value到字典。

接口实战

添加token到头文件中

在公司实际项目中,调接口首先需要获取token,要先调用获取token的请求,然后拿到token值之后,在后面接口中添加到头文件中。

在这里插入图片描述

self.session.headers.update({“token”:rsp.json()[‘data’][‘token’]})
(左右滑动查看完整代码)

通过在setup初始化方法中调用获取token,来拿到token的值,然后添加到整个session的head中去,后续请求中都不需要额外添加head了。

使用ddt做参数化

ddt数据驱动测试,首先pip list ddt,安装第三方库,在代码最上方导入库中的data

from ddt import ddt,data,在测试类前面声明ddt,用@ddt:

在这里插入图片描述

1、在测试用例前声明使用data,用@data:

@data('test1','test2')
def test_ddt1(self,value):
    print(value)`在这里插入代码片`
(左右滑动查看完整代码)

运行结果中该用例执行了两次,分别输出的test1和test2。

2、data用法读取文件

此方法需要解包,故需要用到unpack方法,在测试用例前声明@unpack即可。

def readline(self):
    date = []
    file = open('D:\\base64\\keyid.txt','r',encoding='utf-8')
    for line in file:
        date.append(line.split())
    return date
@data(*readline(""))
@unpack
def test_ddt2(self,vars):
    print(vars)

对运行结果解释:定义一个读取文件的方法,定义一个list数组,使用file函数的open方法,读取文件名为“txt1”的文件,以read的形式,编码格式为utf-8,以for循环的方式一直循环读取每一行,以\n换行符为一行结尾,以逗号分隔每一个参数,最后返回data值以便下方直接调用。

上面写了读取方法之后,在测试用例前,直接使用该方法即可,@data(*readfile())这种形式,接着使用@unpack解包的方法即可。在这里插入图片描述

生成测试报告

按照上述的方法编写好测试用例后,结合UniTtest框架生成报告的HTMLTestRunner来生成接口测试报告。在这里插入图片描述

从网上找的HTMLTestRunner库文件,下载后放到Python安装目录的lib文件夹中就行,后续就可以直接调用了https://github.com/GoverSky/HTMLTestRunner_cn/issues在这里插入图片描述

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

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

相关文章

【LeetCode】149. 直线上最多的点数

149. 直线上最多的点数(困难) 枚举直线 哈希表统计 思路 遍历每两个点之间的连线,然后计算这条连线上有多少个点。 具体步骤如下: 初始化最大点数为 0。遍历每个点,用它和其他点计算斜率。如果两个点的x坐标相同&…

7月大概率加息25bp!美股螺旋式下跌,加密市场“迎难而上”!

今年6月,美股标普500指数走出了自1948年以来最长的熊市,进入新的牛市,美联储暂停加息给全球资本市场一个喘息的机会。尽管如此,美国目前经济基本面的情况仍不及预期,股市其上涨态势恐怕将会迎来一轮调整。 以Solita Ma…

资深开发竟然不清楚int(1)和int(10)的区别

一、困惑 最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单alter table xxx ADD user_id int(1)。领导看到我的sql工单,于是说:这int(1)怕是不够用吧,接下来是一通解释。…

做一个小程序需要多少钱

做一个小程序要多少钱,这种分2种类型 定制版 定制版就是按着客户的需求来做了。首先是聊需求,然后画思维导图,做原型图,做完原型图,就是做UI设计,然后做前端,后端。这个费用下来大概几千元到几…

Rust 第五天—代码组织管理

通过之前的内容介绍,对Rust或多或少有了一些了解.也许现在还不能写出“像样子”的项目,但是把大量代码堆积写在一个文件中依旧是不可取的.今天的内容相对轻松一些,聊聊Rust的包和模块 Rust的模块系统可以划分为Package,Crate,Module,具体可以总结如下: Package:整个项目Crate…

【hadoop】Linux安装和配置

安装 RedHat Linux 7.4 创建新的虚拟机 选择“自定义(高级)” 选择“下一步” 选择“稍后安装操作系统” 选择操作系统的类型 设置虚拟机名称和保存路径 下一步 下一步 设置网络类型,选择“使用仅主机模式网络” 下一步 下一步 下一步 设置硬…

pytorch笔记:归一化

来自B站视频,API查阅,TORCH.NN layer normalization 是针对单个样本,训练和测试的时候行为一致LN 相对于 BN 更适合 RNN,可以降低训练时间LN 中不同样本有不同的归一化参数,以层计算 a 是输入,f 是每层具…

【LeetCode周赛】2022上半年题目精选集——思维题

文章目录 2211. 统计道路上的碰撞次数(栈 || 脑筋急转弯)解法1:自己想的——使用栈解法2——思维:去掉左右两边往左右开的车代码写法1——找左右端点代码写法2——正则表达式去除流处理api补充:replaceAll() 和 正则表…

VS2022 And QtCreator10 调试 Qt 源码教程

文章目录 背景IDE 调试 Qt 源码Visual Studio 2022Qt Creator 10.0.1 排查思路姊妹篇系列 简 述: 记录使用 Visual Studo 2022 和 QtCreator10 调试 Qt 5.15 源码和 加载 .pdb 的方法。 本文初发于 “偕臧的小站”,同步转载于此。 背景 源码:…

8、动手学深度学习——现代卷积神经网络:AlexNet

1、学习表征 在2012年前,图像特征都是机械地计算出来的。事实上,设计一套新的特征函数、改进结果,并撰写论文是盛极一时的潮流 另一组研究人员,包括Yann LeCun、Geoff Hinton、Yoshua Bengio、Andrew Ng、Shun ichi Amari和Juer…

Java阶段四Day11

Java阶段四Day11 文章目录 Java阶段四Day11Spring AOPElasticsearch1. 关于各种数据库的使用2. 关系型数据库中的索引3. 安装与启动elasticsearch4. 访问elasticsearch5. 使用elasticsearch分词6. elasticsearch文档的相关概念7. 使用elasticsearch添加数据7.1. 添加文档7.2. 查…

Spring Boot 中的分布式追踪及使用

Spring Boot 中的分布式追踪及使用 随着互联网应用程序的复杂性不断增加,分布式系统已经成为了许多企业级应用程序的标配。在分布式系统中,由于服务之间的调用关系错综复杂,很难追踪到一个请求在整个系统中的执行路径和时间,这就…

Python如何提高工作效率,轻松实现读取分数,计算出最高/低分

前言 Python如何读取分数,计算最高/低分 与平均分? 今天这篇文章就来带你学习学习如何实现这个功能~ 环境使用: Python 3.8 解释器 Pycharm 编辑器 涉及知识点 文件读写基础语法字符串处理循环遍历 代码展示 模块 import platform定义获取最高分、最…

AI 语音 - 人声歌曲合成

前情提要 2023-07-02 周日 杭州 阴晴不定 小记: 天生五音不全,唱歌永远找不到调,使用下 AI 通过音色合成下吧,目前才训练 15000 步左右,我准备的数据集其实满打满算也只有 40min 左右的数据集,为了数据预处理有删减了…

基于openvino+yolov5的模型量化记录(PTQ模式)

本文主要是记录学习openvino_notebootk 302-pytorch-quantization-aware-training文档的一些收获,对于yolov5在cpu部署感兴趣的可以参考下。 此文档的目的是为了了解openvino如何降低模型部署的推理时间,同时尽可能保证精度。 此文档一共提供了两种PT…

【Flutter】Flutter 使用 Stream Transform 包处理流操作

文章目录 一、 前言二、 Stream Transform 包简介三、 安装和版本信息四、 Stream Transform 的基本使用1. 扩展方法2. 异步映射 五、 示例:使用 Stream Transform 实现实时搜索功能六、 总结 一、 前言 欢迎来到我的博客!我是小雨青年,这是…

基于docker的ubuntu云服务器jupyter深度学习环境配置指南

step1 安装docker 文档中的命令如下: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings…

驱动 控制开发版3盏灯、蜂鸣器、风扇、马达

head.h #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; //查看开发扩展板原理图可知 //蜂鸣器 PB6 //风扇 PE9 //马达 PF6 //LED1 PE…

商用车线控底盘需求文档

一、 概述 商用车线控底盘主要用于接收智能驾驶域控制器(控制器ADU)的请求指令,完成ADU 对驱动、制动、档位转向、驻车声光等部分的指令控制,从而实现智能驾驶功。 即 ADU 可通过 CAN 通讯的方式以特定周期和指令控制 一台车的线控…