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
相关文章:

Python接口自动化测试之UnitTest详解
基本概念 UnitTest单元测试框架是受到JUnit的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。 它分为四个部分test fixture、TestC…...

python——案例17:判断某年是否是闰年
案例17:判断某年是否是闰年 判断依据:闰年就是能被400整除,或者能被4整除的年份numint(input(输入年份:))if num%1000: if num%4000: #整百年份的判断print("%s年是闰年"%num) #…...

allure测试报告
使用pytest结合Allure进行测试报告生成的简单教程 allure测试报告 Allure基于Java开发,因此我们需要提前安装Java 8或以上版本的环境。 ◆安装allure-pytest插件在DOS窗口输入命令“pip3 install allure-pytest”,然后按“Enter”键。 下载安装Allure…...
Vue 路由懒加载
Vue 路由懒加载 随着 Web 应用的复杂性不断增加,性能优化成为了开发人员必须面对的挑战之一。Vue 路由懒加载是一项关键技术,它可以帮助我们提高 Web 应用的加载速度,从而提升用户体验。 在本篇技术博文中,我们将深入探讨 Vue 路…...

软件设计师(七)面向对象技术
面向对象: Object-Oriented, 是一种以客观世界中的对象为中心的开发方法。 面向对象方法有Booch方法、Coad方法和OMT方法等。推出了同一建模语言UML。 面向对象方法包括面向对象分析、面向对象设计和面向对象实现。 一、面向对象基础 1、面向对象的基本…...

Qt中将信号封装在一个继承类中的方法
QLabel标签类对应的信号如下: Qt中标签是没有双击(double Click)这个信号的; 需求一:若想双击标签使其能够改变标签中文字的内容,那么就需要自定义一个“双击”信号,并将其封装在QLabel类的派生…...

Docker介绍
1. docker是什么 1.1 为什么会有docker出现? 假设你在开发一个项目的时候,你使用的是windows系统而且你的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。你正在开发的应用依赖于你当前的配置而且还要依赖于某些配置文件。此外…...

C++红黑树
一、红黑树的概念 红黑树是一种二叉搜索树,在其每个节点上增加一个存储位用于表示节点的颜色,可以是Red或Black 通过对任何一条从根到叶子的路径上的各个节点着色方式的限制,红黑树确保没有一条路径比其他路径长两倍 红黑树的性质ÿ…...
LangChain与大模型的学习ing
大模型的菜鸟初学习 一、问题记录1、库的版本问题 二、实例记录1、公司名生成2、提示模板的使用3、LLM Chain4、LLMMemory5、聊天语言API 参考资料 一、问题记录 1、库的版本问题 openai.error.APIConnectionError: Error communicating with OpenAI: HTTPSConnectionPool(ho…...

Go把Map转成对象
最近使用了Redis的Hash,把一个对象给存储到了hash里面,具体如下: 现在需要从RedisHash缓存里面把结果给取出来,同时赋值到一个对象上面 result, err : global.GVA_REDIS.HGetAll(context.Background(), key).Result() 问题是resul…...
Java-网络编程
TCP TCP(Transmission Control Protocol)是一种在计算机网络中用于可靠数据传输的协议。它是一种面向连接的协议,确保数据在发送和接收之间的可靠性和有序性。以下是TCP是如何工作的简要概述: 建立连接: 当两台计算机…...

[数据集][目标检测]道路坑洼目标检测数据集VOC格式1510张2类别
数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):1510 标注数量(xml文件个数):1510 标注类别数:2 标注类别名称:["keng","…...

全网最详细,Pytest自动化测试框架-Fixture固件实战,你要的都有...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 什么是固件 Fixt…...

React 入门学习
React 入门 一、基本认识1.1、前言1.2、什么是1.3、编译<br>1.4、特点1.5、高效 二、React环境和基本使用2.1、环境搭建2.2、脚手架项目基本使用2.2.1、src2.2.2、public2.2.3、package.json 三、JSX的理解和使用四、模块与模块化, 组件与组件化的理解4.1、模块与组件4.2…...

VMware vCenter 6.5 断电后无法启动修复方案
目录 第1章 前言 第2章 问题现象 第3章 解决方案 第4章、Tips 第1章 前言 本文主要介绍VMware vcsa 6.5由于电源异常/存储异常之后无法启动,进入磁盘自检模式处理方法。(最近遇到类似情况比较多,Citrix Xenserver也遇到了,后来…...
c++ STL--算法,迭代器,容器适配器,仿函数
c STL–算法,迭代器,容器适配器,仿函数 一.算法 1.使用的头文件为 #include<algorithm>//以这个头文件为主 #include<numeric>2.关于算法一些功能的使用 1.遍历 void fun1(int x) {cout << x << " "…...

springcloud3 bus+springconfig 实现配置文件的动态刷新(了解)
一 springcloud Bus的作用 1.1 springcloud的作用 spring cloud bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架。 它整合了java的事件处理机制和消息中间件的功能。其中目前支持RabbitMQ和kafka 简介: bus实现多个服务的配置文件动态刷新。 1.2 …...

SpringMVC的架构有什么优势?——视图与模型(二)
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄ÿ…...
Vue中实现图片懒加载简单说明
1.安装 npm i vue-lazyload1.2.6 2.导入 import VueLazyload from "vue-lazyload"; 3.注册插件 说明:main.js文件 import imgs_src from "src" Vue.use(VueLazyload, {// 懒加载默认图片loading:"imgs_src" }); 4.前台 说明:vue文…...

zookeeper案例
目录 案例一:服务器动态上下线 服务端: (1)先获取zookeeper连接 (2)注册服务器到zookeeper集群: (3)业务逻辑(睡眠): 服务端代码…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...