unittest框架
目录
框架:
unittest框架:
使用的原因:
核心要素(组成):
TestCase测试用例:
可能出现的错误:
TestSuite(测试套件):
TestRunner(测试执行):
整体步骤:
查看执行结果:
TestLoader测试加载:
方法级别Fixture:
类级别Fixture:
模块级别Fixture:
用例脚本包含:
断言常用判断方法:
参数化:
环境准备:
参数化使用:
测试报告:
使用绝对路径:
跳过:
框架:
- framework;
- 为了解决一类事情的功能集合.
unittest框架:
是python自带的单元测试框架
--自带的,可以直接使用,不需要单独安装
--测试人员用来做自动化测试,作为自动化测试的执行框架,即管理和执行用例的
使用的原因:
- 能够组织多个用例去执行;
- 提供丰富的断言方法;
- 能够生产测试报告.
核心要素(组成):
- TestCase测试用例,这个测试用例是unittest的组成部分,作用是用来书写真正的用例代码(脚本);
- Testsuite测试套件,作用是用来组装(打包)TestCase(测试用例)的,即可以将多个用例脚本组装到一起;
- TestRunner测试执行(测试运行),作用是用例执行Testsuite(测试套件)的;
- Testloader测试加载,是对Testsuite(测试套件)功能的补充,作用是用来组装(打包)TeseCase(测试用例)的;
- Fixture测试夹具,是一种代码结构,书写前置方法(执行用例之前的方法)代码和后置方法(执行用例之后的方法)代码,即用例执行顺序 前置-->用例-->后置.
TestCase测试用例:
书写真正的用例代码(脚本)
单独一个测试用例也可以执行
- 步骤:
1.导包unittest;
2.定义测试类,需要继承unittest.TestCase类,习惯性以Test开头;
3.书写测试方法,必须以test开头;
4.执行.- 注意事项:
1.代码文件名字要满足标识符的规则;
2.代码文件名不要使用中文.
"""学习TestCase(测试用例)的使用"""
# 1.导包unittest
import unittest# 2.定义测试类,只要继承unittest.TestCase类,就是测试类
class TestDemo(unittest.TestCase):# 3.书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test_method1(self):print('测试方法一')def test_method2(self):print('测试方法二')# 4.执行
# 4.1 在类名或者方法名后边右键执行
# 4.1.1 在类名后边,执行类中的所有测试方法
# 4.1.2 在方法名后边,只执行当前测试方法
#
# 4.2 在主程序使用unittest.main()来执行if __name__ == '__main__':unittest.main()
可能出现的错误:
1.文件名包含中文;
2.右键运行没有unittest for......
解决方法:1.新建一个代码文件,将之前的代码复制过来;
2.在主程序是应用unittest.main()来执行:
if __name__ == '__main__': unittest.main()
TestSuite(测试套件):
将多条用例脚本集合在一起,就是套件,即用来组装测试用例的
- 导包 unittest;
- 实例化套件对象 unittest.TestSuite();
- 添加用例方法.
TestRunner(测试执行):
用来执行套件对象
- 导包 unittest;
- 实例化执行对象unittest.TextTestRunner();
- 执行对象执行 套件对象 执行对象.run(套件对象).
整体步骤:
- 导包 unittest;
- 实例化套件对象unittest.TestSuite();
- 添加用例方法.
3.1 套件对象.addTest(测试类名('测试方法名'));
或者 3.2 套件对象.addTest(unittest.makeSuite(测试类名))# 3.2 套件对象.addTest(unittest.makeSuite(测试类名)); suite.addTest(unittest.makeSuite(TestDemo1)) suite.addTest(unittest.makeSuite(TestDemo2))
- 实例化执行对象 unittest.TextTestRunner();
- 执行对象执行 套件对象 执行对象.run(套件对象).
# 导包 unittest;
import unittestfrom Python.unittest.Testcast1 import TestDemo1
from Python.unittest.Testcast2 import TestDemo2# 实例化套件对象unittest.TestSuite();
suite = unittest.TestSuite()
# 添加用例方法.
# 3.1 套件对象.addTest(测试类名('测试方法名'));
suite.addTest(TestDemo1('test_method1'))
suite.addTest(TestDemo1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))# 实例化执行对象 unittest.TextTestRunner();
run = unittest.TextTestRunner()
# 执行对象执行 套件对象 执行对象.run(套件对象).
run.run(suite)
查看执行结果:
TestLoader测试加载:
和TestSuite作用一样,组装用例代码,同样也需要使用TextTestRunner()去执行
- 导包unittest;
- 实例化加载对象并加载用例--->得到的是套件对象;
- 实例化执行对象并执行.
# 导包unittest;
import unittest# 实例化加载对象并加载用例--->得到的是套件对象;
# suite = unittest.TestLoader().discover('用例所在的目录','用例代码文件名*.py')
suite = unittest.TestLoader().discover('.', '*case*.py')
# 实例化执行对象并执行
# runner = unittest.TextTestRunner
# runner.run(suite)
unittest.TextTestRunner().run(suite)
方法级别Fixture:
在每个用例执行前后都会自动调用,方法名是固定的.
def setUp(self): #前置#每个用例执行之前都会自动调用passdef tearDown(self): #后置#每个用例执行之后都会自动调用pass#方法前置 用例 方法后置
#方法前置 用例 方法后置
类级别Fixture:
在类中所有的测试方法执行前后,会自动执行的代码,只执行一次
#类级别的FIxture需要写作类方法
@classmethod
def setUpClass(cls): #类前置pass@classmethod
def tearDowmClass(cls): #后置pass#类前置 方法前置 用例 方法后置 方法前置 用例 方法后置 类后置
模块级别Fixture:
模块,就是代码文件,模块级别,在这个代码文件执行前后执行一次
#在类外部定义函数
def setUpModule():passdef tearDownModule():pass
import unittestclass TestLogin(unittest.TestCase):def setUp(self) -> None:print('2.打开网页,点击登录')def tearDown(self) -> None:print('4.关闭网页')@classmethoddef setUpClass(cls) -> None:print('1.打开浏览器')@classmethoddef tearDownClass(cls) -> None:print('5.关闭浏览器')def test_1(self):print('3.输入用户名密码验证码1,点击登录')def test_2(self):print('3.输入用户名密码验证码2,点击登录')def test_3(self):print('3.输入用户名密码验证码3,点击登录')
用例脚本包含:
- 断言(使用代码自动判断的预期结果和实际结果是否相符);
- 参数化(将测试数据定义到json文件中使用);
- 跳过(某些用例由于某种原因不想执行,设置为跳过);
- 生成测试报告(suite和runner(第三方)).
断言常用判断方法:
- assertEqual(预期结果,实际结果)
---判断预期结果和实际结果是否相等,如果相等,用例通过,如果不相等,抛出异常,用例不通过- assertIn(预期结果,实际结果)
---判断预期结果是否包含在实际结果中,如果存在,用例通过,如果不存在,抛出异常,用例不通过.
import unittestclass TestAssert(unittest.TestCase):def test_equal_1(self):self.assertEqual(10, 10) # 用例通过def test_equal_2(self):self.assertEqual(10, 12) # 用例不通过def test_in_1(self):self.assertIn('123', '123123') # 用例通过def tese_in_2(self):self.assertIn('123', '1243') # 用例不通过
参数化:
---通过参数的方式来传递数据,从而实现数据和脚本分离,并且可以实现用例的重复执行.(在书写用例方法的时候,测试数据使用变量代替,在执行的时候进行数据传递)
--unittest测试框架,本身不支持参数化,但是可以通过安装unittest扩展差价parameterized来实现.
环境准备:
因为参数化的插件不是unittest自带的,所以想要使用,需要进行安装;
python中包(插件,模块)的安装,使用pip工具
pip install parameterized #在终端(cmd)中执行.
参数化使用:
- 导包 from parameterized import parameterized;
- 修改测试方法,将测试方法中的测试数据使用变量显示;
- 组织测试数据,格式[(),(),()],一个元组就是一组测试数据;
- 参数化:在测试方法上方使用装饰器@parameterized.expand(测试数据);
- 运行(直接TestCase或者使用suite运行).
import unittestfrom Python.unittest.tools import add
from parameterized import parameterizeddata = [(1, 1, 2), (1, 2, 3), (2, 3, 5), (4, 5, 9)]class Addtest(unittest.TestCase):@parameterized.expand(data)def test_add(self, a, b, expect):print(f'a:{a},b:{b},expect:{expect}')self.assertEqual(expect, add(a, b))if __name__ == '__main__':unittest.main
测试报告:
使用第三方的报告模板,生成报告,HTMLTestReport,本质是TestRunner
--安装
pip install HTMLTestReport
--使用
- 导包unittest,HTMLTestReport;
- 组装用例(套件,loader);
- 使用HTMLTestReport中的runner执行套件;
- 查看报告
import unittestfrom Python.unittest.Testadd import Addtest
from htmltestreport import HTMLTestReport# 套件
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(Addtest))# 运行对象
# runner = HTMLTestReport(报告的文件路径后缀.html,报告的标题,其他的描述信息)
runner = HTMLTestReport('test_add_report.html', '加法用例测试报告')
runner.run(suite)
使用绝对路径:
将来的项目是分目录书写的,使用相对路径,可能会出现找不到文件的情况,此时需要使用绝对路径.
方法:
- 在项目的根目录,创建一个python文件(app.py或者config.py);
- 在这个文件中获取项目的目录,在其他代码中使用路径拼接完成绝对路径的书写.
- 获取当前文件的绝对路径:abspath = os.path.abspath(__file__);
- 获取文件路径的目录名称:dirname = os.path.dirname(filepath).
import osBASE_DIR = os.path.dirname(__file__)if __name__ == '__main__':print(BASE_DIR)
跳过:
跳过:对于一些未完成的或者不满足测试条件的测试函数和测试类,可以跳过执行(简单来说,不想执行的测试方法,可以设置为跳过)
---直接将测试函数标记成跳过
@unittest.skip('跳过的原因')
---根据条件判断测试函数是否跳过
@unittest.skipif(判断条件,reason='原因') #判断条件为True,执行跳过
import unittestversion = 30class Test_skip(unittest.TestCase):@unittest.skip('跳过测试')def test_1(self):print('测试方法一')@unittest.skipIf(version >= 30, '版本号大于30,测试方法不执行')def test_2(self):print('测试方法二')def test_3(self):print('测试方法三')
相关文章:

unittest框架
目录 框架: unittest框架: 使用的原因: 核心要素(组成): TestCase测试用例: 可能出现的错误: TestSuite(测试套件): TestRunner(测试执行): 整体步骤: 查看执行结果: TestLoader测试加载: 方法级别Fixture: 类级别Fixture: 模块级别Fixture: 用例脚本…...
Python中的__str__和__repr__:揭示字符串表示的奥秘
标题:Python中的__str__和__repr__:揭示字符串表示的奥秘 摘要 在Python中,对象的字符串表示对于调试和日志记录至关重要。__str__和__repr__是两个特殊的方法,用于定义对象的字符串表示形式。尽管它们在功能上相似,…...

gazebo插入一个图片
在下面的目录下添加文件夹 my_ground_plane 文件夹内容如下 model.sdf <?xml version"1.0" encoding"UTF-8"?> <sdf version"1.4"><model name"my_ground_plane"><static>true</static><link na…...
(已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
Modals是Bootstrap中用户弹框用的组件,使用时不需要额外引入其他插件,在引入了boostrap.js或者boostrap.min.js前提下就可以使用。 官方的示例: <!-- Button trigger modal --> <button type="button" class="btn btn-primary" data-bs-…...
网络编程介绍(IP)(一)
定义:可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。 java.net.*包下提供了网络编程的解决方案。 基本的通信架构: CS架构( Client客户端/Server服务端 ): Clie…...

C语言 指针——函数指针
目录 什么是函数指针? 函数指针的定义 定义函数指针时的常见错误 函数指针有什么用? 函数指针的主要应用 什么是函数指针? 函数指针 (Function Pointer) 就是指向函数的指针变量 数据类型 ( * 指针变量名 ) ( 形参列表 ); 例如&#x…...

【C++】———list容器
前言 1.list容器简单来说其实就是之前的链表结构。 2.这里的list用的是双向带头结点的循环链表。 目录 前言 一 构造函数 1.1 list (); 1.2 list (size_type n, const value_type& val value_type() ); 1.3 list (InputIterator first, InputIterator last…...

【网络安全技术】——期末复习(冲刺篇)
📖 前言:快考试了,做篇期末总结,都是重点与必考点。 题型:材料分析题、简答题、看图分析题 课本: 目录 🕒 1. 计算机网络安全概述🕘 1.1 安全目标🕘 1.2 常见的网络安全…...

Python中Web开发-Django框架
大家好,本文将带领大家进入 Django 的世界,探索其强大的功能和灵活的开发模式。我们将从基础概念开始,逐步深入,了解 Django 如何帮助开发人员快速构建现代化的 Web 应用,并探讨一些最佳实践和高级技术。无论是初学者还…...

1882java密室逃脱管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 java密室逃脱管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…...

LeetCode 两两交换链表中的节点
原题链接24. 两两交换链表中的节点 - 力扣(LeetCode) 思路,请看图片的过程模拟,这里添加了一个哨兵节点0,目的是为了方便操作,得到指向1节点的指针。 class Solution {public:ListNode* swapPairs(ListNod…...

STM32作业实现(五)温湿度传感器dht11
目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…...

java mybatis处理大数据量,开启和配置二级缓存,及注意事项,已解决
注意事项: 尽量避免使用下面方式写sql否则会降低服务器性能: mybatis二级缓存开启后,避免使用事务注解(加上事务注解后二级缓存数据会导致两次访问不一致问题): 3. 返回的对象实体类,要实现Se…...

在 LLM 架构中应用多专家模型
本文转载自:在 LLM 架构中应用多专家模型 2024年 3月 14日 By Kyle Kranen and Vinh Nguyen https://developer.nvidia.cn/zh-cn/blog/applying-mixture-of-experts-in-llm-architectures/ 文章目录 一、概述二、LLM 架构领域的专家齐聚一堂1、模型容量2、MoE 在降低…...
C语言编程代码软件:深入探索与实战应用
C语言编程代码软件:深入探索与实战应用 在编程的广袤领域中,C语言以其独特的魅力吸引着无数编程爱好者。作为一种基础且强大的编程语言,C语言在软件开发、系统编程、嵌入式系统等领域发挥着不可替代的作用。而要想熟练掌握C语言,…...
【AIGC半月报】AIGC大模型启元:2024.06(上)
AIGC大模型启元:2024.06(上) (1) ChatTTS(语音合成项目) (1) ChatTTS(语音合成项目) 2024.06.01 ChatTTS 文本转语音项目爆火出圈,引来大家极大的关注。短短三天时间,在…...

两款 IntelliJ IDEA 的 AI 编程插件
介绍两款 IntelliJ IDEA 的 AI 编程插件:通义灵码和 CodeGeeX。 通义灵码 这是由阿里推出的一个基于通义大模型的 AI 编码助手。 它提供了代码智能生成、研发智能问答等功能。通义灵码经过海量优秀开源代码数据训练,可以根据当前代码文件及跨文件的上下…...
语义化版本控制:软件工程的实用之道
语义化版本控制:软件工程的实用之道 在软件开发过程中,版本控制是确保项目稳定、有序进行的关键环节。随着项目的发展,功能的增加、错误的修复以及API的修改变得日益频繁。为了有效管理这些变化,并确保团队成员、用户以及依赖该软…...

Java设计模式总结
《武林外传》老白曾经说过这样一句话。高手就是手里无刀,心中也无刀。 类似于设计模式,你不知不觉中已经融进你的代码中了,但你并不知已经运用了。下面我总结几个我觉得比较常用的设计模式。 1:设计模式分类 总体来说设计模式分为…...

小米路由器如何设置去广告功能,如何设置小米路由器的自定义Hosts(小米路由器如何去除小米广告、去除小米电视盒子开屏广告、视频广告)
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现方案 📒📝 操作步骤📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 小米设备的广告一直是用户头疼的问题,无论是开屏广告、应用内广告还是系统广告,都影响了用户体验。本文将详细介绍如何通过小米路由器实现去除广告…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...