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

 基本概念

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):@classmethoddef 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):@classmethoddef setUpClass(cls) -> None:print('setup')@unittest.skipdef testcase1(self):print('testcase1')def testcase2(self):a = 1self.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.mzph.cn/news/38315.shtml

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

相关文章

电脑提示数据错误循环冗余检查怎么办?

有些时候,我们尝试在磁盘上创建分区或清理硬盘时,还可能会遇到这个问题:数据错误循环冗余检查。这是如何导致的呢?我们又该如何解决这个问题呢?下面我们就来了解一下。 导致冗余检查错误的原因有哪些? 数据…

应急响应-钓鱼邮件的处理思路溯源及其反制

0x00 钓鱼邮件的危害 1.窃取用户敏感信息,制作虚假网址,诱导用户输入敏感的账户信息后记录 2.携带病毒木马程序,诱导安装,使电脑中病毒木马等 3.挖矿病毒的传输,勒索病毒的传输等等 0x01 有指纹的钓鱼邮件的溯源处理…

nodejs+vue+elementui社区流浪猫狗救助救援网站_4a4i2

基于此背景,本研究结合管理员即时发布流浪猫狗救助救援信息与用户的需求,设计并实现了流浪猫狗救助救援网站。系统采用B/S架构,java语言作为主要开发语言,MySQL技术创建和管理数据库。系统主要分为管理员和用户两大功能模块。通过…

网络编程555

上传代码 #include <stdio.h>//客户端 #include <string.h> #include <stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<head.h> #define PORT 69 #define IP "192.168.124.57"…

excel填数据转json格式

定制化比较严重&#xff0c;按需更改 excel文件如下 代码 # -*- coding: utf-8 -*- import oss2 import shutil import sys import xlwt import xlrd import json from datetime import datetime, timedeltafile1 "C:\\Users\\cxy\\Desktop\\generate.xls" #打开表…

MySQL8的下载与安装-MySQL8知识详解

本文的内容是mysql8的下载与安装。主要讲的是两点&#xff1a;从官方网站下载MySQL8安装和从集成环境安装MySQL8。 一、从官方网站下载MySQL8.0安装 MySQL8.0官方下载地址是&#xff1a;&#xff08;见图&#xff09; 官方正式版的最新版本是8.0.34&#xff0c;也推出了创新版…

Kafka第三课

Flume 由三部分 Source Channel Sink 可以通过配置拦截器和Channel选择器,来实现对数据的分流, 可以通过对channel的2个存储容量的的设置,来实现对流速的控制 Kafka 同样由三大部分组成 生产者 服务器 消费者 生产者负责发送数据给服务器 服务器存储数据 消费者通过从服务器取…

【C++11保姆级教程】auto和decltype

文章目录 前言总结一、auto1.初识auto关键字 2.auto使用二、decltype1.初识decltype2.使用decltype 总结 前言 在C11中引入了一些新的关键字和特性&#xff0c;其中包括auto和decltype。这两个关键字提供了更方便、更灵活的类型推断机制&#xff0c;使得代码编写更加简洁和可读…

CSS3中的var()函数

目录 定义&#xff1a; 语法&#xff1a; 用法&#xff1a; 定义&#xff1a; var()函数是一个 CSS 函数用于插入自定义属性&#xff08;有时也被称为“CSS 变量”&#xff09;的值 语法&#xff1a; var(custom-property-name, value) 函数的第一个参数是要替换的自定义属性…

MATLAB | 绘图复刻(十一) | 截断的含散点及误差棒的分组柱状图

hey大家好久不见&#xff0c;本期带来一篇绘图复刻&#xff0c;居然已经出到第11篇了&#xff0c;不知道有朝一日有没有机会破百&#xff0c;本期绘制的是《PNAS》期刊中pnas.2200057120文章的figure03&#xff0c;文章题目为Intranasal delivery of full-length anti-Nogo-A a…

Debian/Ubuntu清理硬盘空间

Debian/Ubuntu清理硬盘空间_debian清理磁盘空间_weixin_43606319的博客-CSDN博客 1. 删除残余的配置文件 通常Debian/Ubuntu删除软件包可以用两条命令 sudo apt-get remove <package-name> sudo apt-get purge <package-name> remove将会删除软件包&#xff0…

车载以太网物理层

车载以太网物理层 O S I 参考模型的第 1 层&#xff08; 最底层&#xff09;。负责逻辑信号&#xff08; 比特流&#xff09;与物理信号&#xff08;电信号、光信号&#xff09;之间的互相转换&#xff0c;通过传输介质为数据链路层提供物理连接。 车载以太网与传统以太网相比…

java实现docx,pdf文件动态填充数据

一&#xff0c;引入pom 根据需求引入自己所需pom org.apache.poi poi 4.1.1 org.apache.poi poi-ooxml 4.1.1 org.jxls jxls 2.6.0 ch.qos.logback logback-core org.jxls jxls-poi 1.2.0 fr.opensagres.xdocreport fr.opensagres.xdocreport.core 2.0.2 fr.opensagres.xdocrep…

QT笔记——QProcess学习

我们常常想通过某一个类&#xff0c;来启动一个外部进程 本文将讲解如何通过QProcess来进行启动外部进程 一&#xff1a;了解QProcess QProcess是Qt框架提供的一个类&#xff0c;用于在应用程序中执行外部进程。它提供了一系列函数来启动、控制和与外部进程进行交互 1.启动进程…

C++入门基础(万字详解!!!)

文章目录 前言1.C关键字2.命名空间3.C的输入输出4.缺省参数4.1 全缺省4.2 半缺省 5.函数重载6. 引用6.1 引用的特性6.2 引用的使用场景6.3 引用和指针 7.内联函数7.1 特性 8.auto关键字8.1 注意事项 9. 基于范围的for循环9.1 使用条件 10.指针控制nullptr10.1 注意事项 11.总结…

fastadmin 自定义搜索分类和时间范围

1.分类搜索&#xff0c;分类信息获取----php 2.对应html页面&#xff0c;页面底部加搜索提交代码&#xff08;这里需要注意&#xff1a;红框内容&#xff09; 图上代码----方便直接复制使用 <script id"countrySearch" type"text/html"><!--form…

安全 1自测

常见对称加密算法&#xff1a; DES&#xff08;Data Encryption Standard&#xff09;&#xff1a;数据加密标准&#xff0c;速度较快&#xff0c;适用于加密大量数据的场合&#xff1b; 3DES&#xff08;Triple DES&#xff09;&#xff1a;是基于DES&#xff0c;对一块数据用…

Spring相关面试题

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱写博客的嗯哼&#xff0c;爱好Java的小菜鸟 &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;个人博客&#xff1a;敬请期待 &#x1f4d5;系列…

时序预测 | MATLAB实现EEMD-GRU、GRU集合经验模态分解结合门控循环单元时间序列预测对比

时序预测 | MATLAB实现EEMD-GRU、GRU集合经验模态分解结合门控循环单元时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-GRU、GRU集合经验模态分解结合门控循环单元时间序列预测对比效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 1.MATLAB实现EEMD-GRU、GRU时…

【Linux】—— 进程程序替换

目录 序言 &#xff08;一&#xff09;替换原理 1、进程角度——见见猪跑 1️⃣ 认识 execl 函数 2、程序角度——看图理解 &#xff08;二&#xff09;替换函数 1、命名理解 2、函数理解 1️⃣execlp 2️⃣execv 3️⃣execvp 4️⃣execle 5️⃣execve 6️⃣execve…