当前位置: 首页 > news >正文

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的内置框架,支持多种自动化测试用例的编写,以及支持用例前置条件和后置…...

特权级那些事儿-实模式下分段机制首次出现的原因

前言: 操作系统的特权级模块在整个操作系统的学习中应该算的上是最难啃的了,提到特权级就要绕不开保护模式下的分段机制;如果想要彻底弄明白就要对比实模式下的分段机制有什么缺陷。这就衍生出很多问题如:什么是实模式&#xff1f…...

详解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. 面向对象和面向过程的区别 面向过程:是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后在使用的时候一一调用则可。性能较高,所以单片机、嵌入式开发等一般采用面向过程…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色&#xf…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性&#xf…...

安卓基础(aar)

重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...