Python - 单元测试
python-单元测试
- 1 Unittest
- 2 Pytest
- 3 两者区别
- 断言方面
- 用例执行编写规则
- 前后置操作
- setUp, setUpclass, setUpmodule 区别
- 4 实战操作
- unittest:
- pytest:
1 Unittest
unittest属于python的内置框架,支持多种自动化测试用例的编写,以及支持用例前置条件和后置数据清理功能也可以将多个测试用例放在测试集中生成测试报告。
参考:https://blog.csdn.net/weixin_53041251/article/details/124394128
2 Pytest
pytest也是基于python的一个单元测试框架,是基于unittest的一个扩展框架,比unittest更加简洁,方便,pytest最主要可以支持第三方插件内容,可以更加高效的完成日常工作。而且pytest也支持unittest的代码框架内容。
3 两者区别
断言方面
Unittest 的断言是根据自身携带的断言内容,提供了assertEqual, assertFalse, assertTrue 等。
pytest的断言就是根据Python自带的assert断言内容进行使用的
import pytestclass Test_o1:def test_o1(self):a = 'gavin'b = 'gavin''''判断两个值是否相等'''assert a == b'''判断a 是否在 b中'''assert a in b
用例执行编写规则
unittest:
- 可以使用自定义测试类内容,但必须继承unittest.TestCase的方法,
- 测试用例需要以test_开头的方法进行编写,用例的执行顺序是根据ASCII的顺序进行执行的。
- unittest中提供了TestCase(测试用例),TestSuite(测试套件),TestLoder(加载用例),TextTestRunner(执行用例)等方法让测试用例更加方便编写,
- 编写测试用例必须导入unittest模块,执行用例必须带有unittest.main()参数。
pytest:
- 测试文件名必须以test_开头的py文件或者以*_test.py结尾的py文件,
- 测试类名必须以Test开头,测试用例必须以test_开头。
- Pytest可以进行执行unittest的用例,pytest的执行顺序可以通过第三方插件进行定制顺序,默认是通过从上往下的顺序进行执行。
- pytest的执行用例不需要导入模块。执行用例可以通过命令行的形式进行执行。
前后置操作
unittest:
- 可以通过setup()和tearDown()的方法来控制用例的前后置操作,并且每条用例执行前后都会执行前后置操作。
- 通过setupclass()和teardownclass()方法来控制一个class下的所有用例都只执行1次前后置操作。
import unittestclass Test(unittest.TestCase):def setUp(self):print('unittest前置操作,每次执行用例都会进行执行')def tearDown(self):print('unittest后置操作,每次执行用例都会进行执行')@classmethoddef setUpClass(cls):print('所有用例只执行一次前置操作')@classmethoddef tearDownClass(cls):print('所有用例只执行一次后置操作')def test_01(self):print('用例01')def test_02(self):print('用例02')def test_03(self):print('用例03')if __name__ == '__main__':unittest.main()
frontend.py::Test::test_01
所有用例只执行一次前置操作
PASSED [ 33%]
unittest前置操作,每次执行用例都会进行执行
用例01
unittest后置操作,每次执行用例都会进行执行frontend.py::Test::test_02
PASSED [66%]
unittest前置操作,每次执行用例都会进行执行
用例02
unittest后置操作,每次执行用例都会进行执行frontend.py::Test::test_03
PASSED [100%]
unittest前置操作,每次执行用例都会进行执行
用例03
unittest后置操作,每次执行用例都会进行执行
所有用例只执行一次后置操作
pytest:
- 模块级别的前后置操作(setup_module,teardown_function)表示模块下的测试用例只执行1次前后置操作。
import pytestdef setup_module():print('每次用例执行前,只执行一次测试前置操作')def teardown_module():print('每次用例执行后,只执行一次测试后置操作')def test01():print('用例01')def test02():print('用例02')def test03():print('用例03')if __name__ == '__main__':pytest.main(['-vs'])
frontendpytest.py::test01
每次用例执行前,只执行一次测试前置操作
PASSED [ 33%]
用例01frontendpytest.py::test02
PASSED [ 66%]
用例02frontendpytest.py::test03
PASSED [100%]
用例03
每次用例执行后,只执行一次测试后置操作
import pytest@pytest.fixture()
def login():print('测试用例前置操作')yieldprint('测试用例后置操作')class Test:def test01(self, login):print('用例01')def test02(self, login):print('用例02')def test03(self):print('用例03')if __name__ == '__main__':pytest.main(['-vs'])
通过执行发现,我们在用例03中没有加入fixture,所有他没有执行一些用例的前置和后置操作。
test_fixture.py::Test::test01
测试用例前置操作
PASSED [ 33%]
用例01
测试用例后置操作test_fixture.py::Test::test02
测试用例前置操作
PASSED [ 66%]
用例02
测试用例后置操作test_fixture.py::Test::test03
PASSED [100%]
用例03
setUp, setUpclass, setUpmodule 区别
https://blog.csdn.net/qq_42792477/article/details/102833763
setUp: 类里面,每个测试用例都会调用一遍
setUpclass: 类里面,一个测试用例里面只执行一遍
setUpmodule: 类外面, 提前创建好的内容,之后调用
4 实战操作
unittest:
import unittestimport requestsimport HtmlTestRunner# from HTMLTestRunner import HTMLTestRunner
import ddt# 天气接口的参数化数据
from .HTMLTestRunner import HTMLTestRunnerdata = [{"city": '上海', "key": "331eab8f3481f37868378fcdc76cb7cd", 'result': "查询成功!"},{"city": "上海", "key": "331eab8f3481f37868378fcdc76cb7c",'result': "错误的请求KEY"},{"city": "上", "key": "331eab8f3481f37868378fcdc76cb7cd", 'result': "暂不支持该城市"}]@ddt.ddt
class Test_(unittest.TestCase):def tianqi(self, city, key):'''天气接口'''data = {"key": key,"city": city}r = requests.post(url='http://apis.juhe.cn/simpleWeather/query', data=data)return r.json()def shenfenzheng(self, cardno, key):'''身份证查询接口'''data = {"cardno": cardno,"key": key}r = requests.post('http://apis.juhe.cn/idcard/index', data=data)return r.json()@ddt.data(*data)def test_01(self, data):'''参数化的天气接口'''x = self.tianqi(city=data['city'], key=data['key'])self.assertEqual(x['reason'], data['result'])def test_02(self):'''正确的身份证号正确的key'''cardno = '130428197411155947' # 身份证信息通过Faker随机创建key = "f40a75704fac353952a6534a18f9f437"# 请求查询身份证接口a = self.shenfenzheng(cardno, key)self.assertIn(a['reason'], '成功的返回')@unittest.skip('强制跳过,不需要条件')def test_03(self):'''正确的身份证号错误的key(跳过用例)'''cardno = '130428197411155947'key = "f40a75704fac353952a6534a18f9f43"a = self.shenfenzheng(cardno, key)self.assertEqual(a['reason'], '错误的请求KEY')@unittest.skipIf(True, '条件成立时候,进行跳过')def test_04(self):'''错误的身份证号正确的key(跳过用例)'''cardno = '42082120031108929'key = "f40a75704fac353952a6534a18f9f437"a = self.shenfenzheng(cardno, key)self.assertEqual(a['reason'], '请输入正确的15或18位身份证')if __name__ == '__main__':unittest.main()# report_path = 'report.html'## # suite = unittest.TestLoader().discover("./", "test*.py")# # print('--------', suite)## # 以只写方式打开测试报告文件# fp = open(# r"C:\Users\zhihguo\PycharmProjects\Capgemini\Pytest_1\new_tests\test01.html",# "wb")# # 实例化 HTMLTestRunner 对象 stream:open 函数打开的文件流; title:[可选参数],为报告标题; description:[可选参数],为报告描述信息;比如操作系统、浏览器等版本;# runner = HTMLTestRunner(stream=fp, title="自动化测试报告", description="Chrome 浏览器")# # 执行# # runner.run(suite)# # 关闭# # f.close()# ## testunit = unittest.TestSuite()## # 加载用例## testunit.addTests(unittest.TestLoader().loadTestsFromTestCase(Test_))## # 执行用例## runner.run(testunit)## # 关闭报告## fp.close()''''''# import unittest# from HTMLTestRunner import HTMLTestRunner## # # 生成测试套件# # suite = unittest.TestLoader().discover(".\\", "test*.py")# # 以只写方式打开测试报告文件# f = open(r"test01.html", "wb")# # 实例化 HTMLTestRunner 对象 stream:open 函数打开的文件流; title:[可选参数],为报告标题; description:[可选参数],为报告描述信息;比如操作系统、浏览器等版本;# runner = HTMLTestRunner(stream=f, title="自动化测试报告", description="Chrome 浏览器")# testunit = unittest.TestSuite()## # 加载用例## testunit.addTests(unittest.TestLoader().loadTestsFromTestCase(Test_))# # 执行# runner.run(testunit)# # 关闭# f.close()
pytest:
import requestsimport jsonimport pytest# 参数不同值# 天气接口的参数化数据data = [({"city": '上海', "key": "331eab8f3481f37868378fcdc76cb7cd", 'result': "查询成功!"}),({"city": "上海", "key": "331eab8f3481f37868378fcdc76cb7c", 'result': "错误的请求KEY"}),({"city": "上", "key": "331eab8f3481f37868378fcdc76cb7cd", 'result': "暂不支持该城市"})]class TestCase:def weather(self, city, key):url = 'http://apis.juhe.cn/simpleWeather/query'# 查询天气接口参数data = {'city': city,'key': key}r = requests.post(url, data=data)return r.json()def shenfenzheng(self, cardno, key):'''身份证查询接口'''data = {"cardno": cardno,"key": key}r = requests.post('http://apis.juhe.cn/idcard/index', data=data)return r.json()@pytest.mark.parametrize('data', data)def test_01(self, data):# 调用天气预报接口r = TestCase().weather(city=data['city'], key=data['key'])assert r['reason'] == data['result']def test_02(self):'''正确的身份证号正确的key'''cardno = '130428197411155947' # 身份证信息通过Faker随机创建key = "f40a75704fac353952a6534a18f9f437"# 请求查询身份证接口a = self.shenfenzheng(cardno, key)assert a['reason'] == '成功的返回'@pytest.mark.skip('强制跳过,不需要条件')def test_03(self):'''正确的身份证号错误的key(跳过用例)'''cardno = '130428197411155947'key = "f40a75704fac353952a6534a18f9f43"a = self.shenfenzheng(cardno, key)assert a['reason'] == '错误的请求KEY'@pytest.mark.skipif(True, reason='条件成立时候,进行跳过')def test_04(self):'''错误的身份证号正确的key(跳过用例)'''cardno = '42082120031108929'key = "f40a75704fac353952a6534a18f9f437"a = self.shenfenzheng(cardno, key)assert a['reason'] in '请输入正确的15或18位身份证'if __name__ == '__main__':pytest.main(['-s'])相关文章:
Python - 单元测试
python-单元测试1 Unittest2 Pytest3 两者区别断言方面用例执行编写规则前后置操作setUp, setUpclass, setUpmodule 区别4 实战操作unittest:pytest:1 Unittest unittest属于python的内置框架,支持多种自动化测试用例的编写,以及支持用例前置条件和后置…...
特权级那些事儿-实模式下分段机制首次出现的原因
前言: 操作系统的特权级模块在整个操作系统的学习中应该算的上是最难啃的了,提到特权级就要绕不开保护模式下的分段机制;如果想要彻底弄明白就要对比实模式下的分段机制有什么缺陷。这就衍生出很多问题如:什么是实模式?…...
详解Vue安装与配置(2023)
文章目录一、官网下载node.js二、安装Node.js三、环境配置四、idea导入vue项目五、IDEA添加Vue.js插件一、官网下载node.js Vue是前端开发框架。搭建框架,首先要搭建环境。搭建Vue的环境工具:node.js(JavaScript的运行环境)&…...
TypeScript深度剖析:Vue项目中应用TypeScript?
一、前言 与link类似 在VUE项目中应用typescript,我们需要引入一个库vue-property-decorator, 其是基于vue-class-component库而来,这个库vue官方推出的一个支持使用class方式来开发vue单文件组件的库 主要的功能如下: metho…...
linux面试高级篇
题目目录1.虚拟机常用有几种网络模式?请简述其工作原理或你个人的理解?2. Dockerfile中最常见的指令是什么?3.docker网络模式有哪些?4.Kubernetes有哪些核心组件这些组件负责什么工作?5. Pod是什么?6.描述一…...
java 4 (面向对象上)
java——面向对象(上) 目录java——面向对象(上)面向对象的思想概述类的成员(1-2):属性和方法对象的内存解析类中属性的使用类中方法的使用1.举例:2.声明方法:3.说明4.re…...
HTTP报头的2个方法
在采集网页信息的时候,经常需要伪造报头来实现采集脚本的有效执行 下面,我们将使用urllib2的header部分伪造报头来实现采集信息 方法1、 #!/usr/bin/python -- coding: utf-8 -- #encodingutf-8 #Filename:urllib2-header.py import urllib2 import…...
yolov5双目检测车辆识别(2023年+单目+双目+python源码+毕业设计)
行人识别yolov5和v7对比yolo车距源码:yolov5双目检测车辆识别(2023年单目双目python源码毕业设计)上盒岛APP,开线上盲盒商店http://www.hedaoapp.com/yunPC/goodsDetails?pid4132 为了提高传统遗传算法(genetic algorithm, GA)IGA优化BP网络迭代时间过长以及精度偏…...
华为OD机试题,用 Java 解【用户调度问题】问题
华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…...
根据mybatis plus注解动态创建sqlite表和表字段
根据mybatis plus注解动态创建sqlite表和表字段 启动时动态创建sqlite数据库,根据mybatis plus注解动态创建表。如果有新增字段,动态创建字段。 文章目录根据mybatis plus注解动态创建sqlite表和表字段一、初始化数据库1.系统启动时初始化数据库2.初始化…...
同步、异步ETL架构的比较
背景介绍: 数据的抽取,转换和加载 (ETL, Extract, Transform, Load) 是构建数据仓库过程中最复杂也是至 关重要的一个步骤,我们通常用两种办法来处理 ETL 流程: 一种是异步(Asynchronous) ETL 方式, 也称为文本文件(Flat file)方式。 另外…...
【机会约束、鲁棒优化】具有排放感知型经济调度中机会约束和鲁棒优化研究【IEEE6节点、IEEE118节点算例】(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
用Python帮老叔选出好基金,大赚一笔,老叔专门提着茅台登门道谢
我有个老叔很喜欢买基金,因为不想被割韭菜,所以啥群都没进,全部自己精挑细选。 看着他的一个本子密密麻麻地写了一大堆东西,全是基金的数据分析,一大把年纪了挺不容易的,于是就决定帮他一把。 在跟他详谈…...
ZeroTier实现内网穿透详细教程,无需公网IP,实现异地组网
ZeroTier实现内网穿透详细教程,无需公网IP,实现异地组网ZeroTier1.官网注册账号,创建自己的局域网段2.点击创建好的网络,进入设置界面进行设置3.下载客户端,安装客户端,然后连接到网络中4.加入网络成功后&a…...
电商 SaaS 全渠道实时数据中台最佳实践
摘要:本文整理自聚水潭数据专家张成玉,聚水潭高级数据工程师应圣楚,在 FFA 2022 行业案例专场的分享。本篇内容主要分为四个部分:实时数仓的建设和发展数据中台的产品体系及架构实时计算的实践和优化对实时计算的未来展望Tips&…...
macos ncnn 安装踩坑记录···
安装真麻烦踩了无数坑,官方给的安装教程:macos安装ncnn, 安装过程老是报错,记录一下卡的比较久的,网上也不好找资料的错. 我的电脑: 1. 使用homebrew 的时候失败fatal: not in a git directory Error: Command failed…...
ESP32设备驱动-AM2301(DHT21)温度湿度传感器驱动
AM2301(DHT21)温度湿度传感器驱动 文章目录 AM2301(DHT21)温度湿度传感器驱动1、AM2301(DHT21)介绍2、硬件准备3、软件准备4、驱动实现1、AM2301(DHT21)介绍 AM2301 湿敏电容数字温湿度模块是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温…...
[数据结构]:16-归并排序(顺序表指针实现形式)(C语言实现)
目录 前言 已完成内容 归并排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容,除其中使用到C引用外,全为C语言代码。使用C引用主要是…...
React(七):Router基本使用、嵌套路由、编程式导航、路由传参、懒加载
React(七)一、React-Router的基本使用1.安装和介绍2.路由的配置和跳转3.Navigate的使用4.如果找不到对应的路由路径?二、嵌套路由的用法三、编程式路由导航1.类组件中使用useNavigate2.函数式组件中使用useNavigate四、路由跳转传参1.设置好路…...
Java基础面试题(一)
Java基础面试题 一、面向对象和集合专题 1. 面向对象和面向过程的区别 面向过程:是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后在使用的时候一一调用则可。性能较高,所以单片机、嵌入式开发等一般采用面向过程…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
