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. 面向对象和面向过程的区别 面向过程:是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后在使用的时候一一调用则可。性能较高,所以单片机、嵌入式开发等一般采用面向过程…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
