Unittest加载执行用例的方法总结
前言
说到测试框架,unittest是我最先接触的自动化测试框架之一了, 而且也是用的时间最长的, unittest框架有很多方法加载用例,让我们针对不同的项目,不同项目的大小及用例的多少自己选择加载方式。今天我们就简单的说说几种加载方式。
方式1
简单的实例
1 import unittest2 3 4 class LoadTest(unittest.TestCase):5 6 def test_case_01(self):7 self.assertEqual(1, 1)8 9 def test_case_02(self):
10 self.assertEqual(2, 1)
11
12
13 if __name__ == '__main__':
14 suit = unittest.TestSuite()
15 suit.addTest(LoadTest('test_case_01'))
16 suit.addTest(LoadTest('test_case_02'))
17
18 runner = unittest.TextTestRunner()
19 runner.run(suit)
# 输出
..
----------------------------------------------------------------------
Ran 2 tests in 0.000sOKProcess finished with exit code 0
说明
首先我们需要创建一个测试套件suite,其次通过addTest方法添加用例,addTest的参数为单个用例, 比如实例中记载的是LoadTest测试类中的test_case_01 和 02, 我们就按照上述方式传递参数。如果加载运行用例的代码在另一个文件中,我们需要在此文件中导入测试类。
方式2
简单实例
1 import unittest2 3 4 class LoadTest(unittest.TestCase):5 6 def test_case_01(self):7 self.assertEqual(1, 1)8 9 def test_case_02(self):
10 self.assertEqual(2, 2)
11
12
13 if __name__ == '__main__':
14 suit = unittest.TestSuite()
15 case_list = [LoadTest('test_case_01'), LoadTest('test_case_02')]
16 suit.addTests(case_list)
17 runner = unittest.TextTestRunner()
18 runner.run(suit)
# 输出
..
----------------------------------------------------------------------
Ran 2 tests in 0.000sOKProcess finished with exit code 0
说明
方式2是通过同样的原理加载测试用例的,只不过是一次性加载多个,不需要多次调用addTest方法,我们只需要调用一次addTests方法,加载一个用例组成的序列,相比较而言,第二种比第一种稍微方便那么一点
方式3
简单实例
1 import unittest2 3 4 class LoadTest(unittest.TestCase):5 6 def test_case_01(self):7 self.assertEqual(1, 1)8 9 def test_case_02(self):
10 self.assertEqual(2, 2)
11
12
13 if __name__ == '__main__':
14 suit = unittest.TestSuite() # 测试套件
15 loader = unittest.TestLoader() # 用例加载器
16 test_class = loader.loadTestsFromTestCase(LoadTest) # 加载测试类
17 suit.addTest(test_class) # 测试类添加到测试套件中
18 runner = unittest.TextTestRunner() # 用例运行器
19 runner.run(suit) # 运行
# 输出
..
----------------------------------------------------------------------
Ran 2 tests in 0.000sOKProcess finished with exit code 0
说明
实例是通过创建一个加载器来加载测试用例,可以看到加载器需要加载一个测试类, 不需要像前两个方式那样,一个一个加载测试用例,但是如果一个模块中有多个测试类的情况,我们仍然需要编写多条加载代码 test_class = loader.loadTestsFromTestCase(LoadTest) # 加载测试类
方式4
简单实例
1 import unittest2 3 4 class LoadTest(unittest.TestCase):5 6 def test_case_01(self):7 self.assertEqual(1, 1)8 9 def test_case_02(self):
10 self.assertEqual(2, 2)
11
12
13 if __name__ == '__main__':
14 pass
1 import unittest2 import sys3 sys.path.append('.')4 import unittest_tc_load5 6 if __name__ == '__main__':7 suit = unittest.TestSuite() # 测试套件8 loader = unittest.TestLoader() # 用例加载器9 test_module = loader.loadTestsFromModule(unittest_tc_load) # 加载测试类
10 suit.addTest(test_module) # 测试类添加到测试套件中
11 runner = unittest.TextTestRunner() # 用例运行器
12 runner.run(suit) # 运行
说明
这个方式其实是和方式3一样的原理, 只不过这个方式是直接加载整个测试模块, 如果测试模块中含有多个测试类,都将被加载,这样批量添加测试会很方便,前提是我们需要导入我们测试模块
方式5
说明
方式5是直接通过在创建测试套件的时候直接把测试模块添加到测试套件中,看下面的代码
1
2 loader = unittest.TestLoader() # 用例加载器
3 test_modules = (loader.loadTestsFromModule(unittest_tc_load1), loader.loadTestsFromModule(unittest_tc_load2)) # 加载测试类
4 suit = unittest.TestSuite(tests=test_modules) # 测试套件
5 runner = unittest.TextTestRunner() # 用例运行器
6 runner.run(suit) # 运
unittest_tc_load1和unittest_tc_load2为两个测试模块,我们使用这种方式的时候需要先导入这两个模块
方式6
简单实例
1 import unittest2 3 4 class LoadTest(unittest.TestCase):5 6 def test_case_01(self):7 self.assertEqual(1, 1)8 9 def test_case_02(self):
10 self.assertEqual(2, 2)
11
12
13 if __name__ == '__main__':
14 suite = unittest.makeSuite(LoadTest)
15 runner = unittest.TextTestRunner()
16 runner.run(suite)
# 输出
..
----------------------------------------------------------------------
Ran 2 tests in 0.000sOKProcess finished with exit code 0
说明
方式6的方法同样只能加载一个测试类,但是相比前面几种方法,代码少了很多,同样,如果运行多个测试类仍然需要创建多个suite
方式7
简单实例
1 import unittest2 3 4 class LoadTest(unittest.TestCase):5 6 def test_case_01(self):7 self.assertEqual(1, 1)8 9 def test_case_02(self):
10 self.assertEqual(2, 2)
11
12
13 if __name__ == '__main__':
14 discover = unittest.defaultTestLoader.discover(start_dir='.', pattern='unittest*.py')
15 runner = unittest.TextTestRunner()
16 runner.run(discover)
# 输出
..
----------------------------------------------------------------------
Ran 2 tests in 0.000sOKProcess finished with exit code 0
说明
方式7通过defaultTestLoader.discover()方法来发现用例,我们可以看到第一个参数start_dir 表示用例的目录, pattern 表示匹配什么样的文件搜索测试用例,比较上面几种方法,个人认为这种方法是最灵活的,我们可以通过规范测试模块文件的命名,使用这种方式一次性加载所有的用例
总结
大概方法差不多就这些,其实还有很多其他加载方法, 比如通过TestLoader方法加载用例,我们可以看到他其他加载用例的方法。

最后呢还是需要根据个人实际中的一个需求选择不同的方法, 正确的方法往往会事半功倍。
感谢每一个认真阅读我文章的人!!!
我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家点击下方名片免费领取,千万不要错过哦。

相关文章:
Unittest加载执行用例的方法总结
前言 说到测试框架,unittest是我最先接触的自动化测试框架之一了, 而且也是用的时间最长的, unittest框架有很多方法加载用例,让我们针对不同的项目,不同项目的大小及用例的多少自己选择加载方式。今天我们就简单的说说…...
使用预训练的2D扩散模型改进3D成像
扩散模型已经成为一种新的生成高质量样本的生成模型,也被作为有效的逆问题求解器。然而,由于生成过程仍然处于相同的高维(即与数据维相同)空间中,极高的内存和计算成本导致模型尚未扩展到3D逆问题。在本文中࿰…...
微服务测试是什么?
微服务测试是一种特殊的测试类型,因为它涉及到多个独立的服务。以下是进行微服务测试的一般性步骤: 【B站最通俗易懂】Python接口自动化测试从入门到精通,超详细的进阶教程,看完这套视频就够了 1. 确定系统架构 了解微服务架构对…...
《现代C++教程》笔记(5-7)
文章目录 5 智能指针与内存管理5.1 RAII与引用计数5.2 std::shared_ptr5.3 std::unique_ptr5.4 std::weak_ptr 6 正则表达式7 并行与并发7.1 并行基础7.2 互斥量与临界区7.3 期物7.4 条件变量7.5 原子操作与内存模型 5 智能指针与内存管理 5.1 RAII与引用计数 在传统 C 中&am…...
红黑树深入剖析【C++】
目录 一、红黑树概念 二、红黑树节点结构设计 三、插入操作 处理情况1 处理情况2 处理情况3 插入总结: 四、插入操作源码 五、红黑树验证 一、红黑树概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色࿰…...
教育机构视频播放时观看行为分析有哪些应用?
教育机构视频播放时观看行为分析有哪些应用? 观看行为分析 观看行为分析是指我们平台基于视频大数据分析,能够以秒为粒度展示观众如何观看您的视频。 视频观看热力图是单次观看行为的图形化表示,我们平台云点播视频的每一次播放࿰…...
Jmeter+验证json结果是否正确小技巧
前言: 通过sql语句或者返回的参数,可以在查看结果树返回的结果中,用方法先跑一下验证是否取到自己想要的值 步骤: 1、添加查看结果树 2、跑出结果 3、在查看结果树中 text改成选Json Path Tester 返回的值如果是列表里面的字符…...
Spring 6.0官方文档示例(22): singleton类型的bean和prototype类型的bean协同工作的方法(一)
一、配置文件: <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://www.springframework.org/schema/context"xsi:schemaLocation"http…...
Android平台GB28181设备接入侧如何同时对外输出RTSP流?
技术背景 GB28181的应用场景非常广泛,如公共安全、交通管理、企业安全、教育、医疗等众多领域,细分场景可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、生产运输、车载终…...
el-Cascader 中div上绑定keyDown事件
keydown,keyup,keypress 事件默认是给页面上可以聚焦的元素绑定键盘事件,例如input输入框,点击输入框即代表聚焦在该元素上。那么想要给div或者其他不能聚焦的元素上使用键盘事件怎么处理呢?这里用到tabindex属性。 …...
elementUI 表格滚动分页加载请求数据
需求:elementui Table表格滚动分页(不使用分页组件),请求数据。 1、自定义加载更多数据的指令,在utils文件夹中创建 loadMore.js /*** 加载更多数据的指令*/ export default {install(Vue) {Vue.mixin({directives: …...
JAVA面试总结-Redis篇章(五)——持久化
Java面试总结-Redis篇章(五)——持久化 1.RDBRDB全称Redis Database Backup file (Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件&#x…...
【数据结构】·顺序表函数实现·赶紧学起来呀
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
C++,类和对象-多态,制作饮品
#include<iostream> using namespace std;//多态案例,制作饮品class AbstractDrinking { public://煮水virtual void Boil() 0;//冲泡virtual void Brew() 0;//倒入茶杯virtual void PourInCup() 0;//加入辅料virtual void PutSomething() 0;//制作饮品vo…...
网站分析:学习如何分析目标网站的页面结构和URL规律,确定爬取目标和策略。
要学习如何分析目标网站的页面结构和URL规律,确定爬取目标和策略,可以遵循以下步骤: 目标网站的页面结构分析: 寻找目标网站的主页,并观察主页上的链接、导航菜单和内容分类等元素,以了解网站的整体结构。 …...
《向量数据库指南》:向量数据库Pinecone如何集成数据湖
目录 为什么选择Databricks? 为什么选择Pinecone? 设置Spark集群 环境设置 将数据集加载到分区中 创建将文本转换为嵌入的函数 将UDF应用于数据 更新嵌入 摘要 使用Databricks和Pinecone在规模上创建和索引向量嵌入 建立在Apache Spark之上的Databricks是一个强大的…...
Vue3中使用pinia
在Vue 3中使用Pinia,您需要按照以下步骤进行设置: 安装Pinia: npm install pinia创建和配置Pinia存储: // main.jsimport { createApp } from vue import { createPinia } from pinia import App from ./App.vueconst app create…...
Mysql中(@i:=@i+1)的介绍
i:i1 表达式 生成伪列实现自增序列 语法: select (i:i1) as ,t.* from table_name t,(select i:0) as j (i:i1)代表定义一个变量,每次叠加 1; (select i:0) as j 代表建立一个临时表,j是随便取的表名,但别名一定…...
Nexperia和KYOCERA AVX Components Salzburg 就车规氮化镓功率模块达成合作
Nexperia和KYOCERA AVX Components Salzburg 就车规氮化镓功率模块达成合作 基础半导体器件领域的高产能生产专家Nexperia(安世半导体)近日宣布与国际著名的为汽车行业提供先进电子器件的供应商 KYOCERA AVX Components (Salzburg) GmbH 建立合作关系&am…...
数据库应用:Redis安装部署
目录 一、理论 1.缓存 2.关系型数据库与非关系型数据库 3.Redis 4.Redis安装部署 5.Redis命令工具 6.Redis数据库常用命令 7.Redis多数据库操作 二、实验 1.Redis安装部署 2.Redis命令工具 3.Redis数据库命令 4.Redis多数据库操作 三、问题 1.RESP连接CentOS 7 R…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
