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

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逆问题。在本文中&#xff0…...

微服务测试是什么?

微服务测试是一种特殊的测试类型,因为它涉及到多个独立的服务。以下是进行微服务测试的一般性步骤: 【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 插入总结: 四、插入操作源码 五、红黑树验证 一、红黑树概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色&#xff0…...

教育机构视频播放时观看行为分析有哪些应用?

教育机构视频播放时观看行为分析有哪些应用? 观看行为分析 观看行为分析是指我们平台基于视频大数据分析,能够以秒为粒度展示观众如何观看您的视频。 视频观看热力图是单次观看行为的图形化表示,我们平台云点播视频的每一次播放&#xff0…...

Jmeter+验证json结果是否正确小技巧

前言: 通过sql语句或者返回的参数,可以在查看结果树返回的结果中,用方法先跑一下验证是否取到自己想要的值 步骤: 1、添加查看结果树 2、跑出结果 3、在查看结果树中 text改成选Json Path Tester 返回的值如果是列表里面的字符…...

Spring 6.0官方文档示例(22): singleton类型的bean和prototype类型的bean协同工作的方法(一)

一、配置文件&#xff1a; <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的应用场景非常广泛&#xff0c;如公共安全、交通管理、企业安全、教育、医疗等众多领域&#xff0c;细分场景可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、生产运输、车载终…...

el-Cascader 中div上绑定keyDown事件

keydown&#xff0c;keyup&#xff0c;keypress 事件默认是给页面上可以聚焦的元素绑定键盘事件&#xff0c;例如input输入框&#xff0c;点击输入框即代表聚焦在该元素上。那么想要给div或者其他不能聚焦的元素上使用键盘事件怎么处理呢&#xff1f;这里用到tabindex属性。 …...

elementUI 表格滚动分页加载请求数据

需求&#xff1a;elementui Table表格滚动分页&#xff08;不使用分页组件&#xff09;&#xff0c;请求数据。 1、自定义加载更多数据的指令&#xff0c;在utils文件夹中创建 loadMore.js /*** 加载更多数据的指令*/ export default {install(Vue) {Vue.mixin({directives: …...

JAVA面试总结-Redis篇章(五)——持久化

Java面试总结-Redis篇章&#xff08;五&#xff09;——持久化 1.RDBRDB全称Redis Database Backup file (Redis数据备份文件)&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后&#xff0c;从磁盘读取快照文件&#x…...

【数据结构】·顺序表函数实现·赶紧学起来呀

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

C++,类和对象-多态,制作饮品

#include<iostream> using namespace std;//多态案例&#xff0c;制作饮品class AbstractDrinking { public://煮水virtual void Boil() 0;//冲泡virtual void Brew() 0;//倒入茶杯virtual void PourInCup() 0;//加入辅料virtual void PutSomething() 0;//制作饮品vo…...

网站分析:学习如何分析目标网站的页面结构和URL规律,确定爬取目标和策略。

要学习如何分析目标网站的页面结构和URL规律&#xff0c;确定爬取目标和策略&#xff0c;可以遵循以下步骤&#xff1a; 目标网站的页面结构分析&#xff1a; 寻找目标网站的主页&#xff0c;并观察主页上的链接、导航菜单和内容分类等元素&#xff0c;以了解网站的整体结构。 …...

《向量数据库指南》:向量数据库Pinecone如何集成数据湖

目录 为什么选择Databricks? 为什么选择Pinecone? 设置Spark集群 环境设置 将数据集加载到分区中 创建将文本转换为嵌入的函数 将UDF应用于数据 更新嵌入 摘要 使用Databricks和Pinecone在规模上创建和索引向量嵌入 建立在Apache Spark之上的Databricks是一个强大的…...

Vue3中使用pinia

在Vue 3中使用Pinia&#xff0c;您需要按照以下步骤进行设置&#xff1a; 安装Pinia&#xff1a; npm install pinia创建和配置Pinia存储&#xff1a; // main.jsimport { createApp } from vue import { createPinia } from pinia import App from ./App.vueconst app create…...

Mysql中(@i:=@i+1)的介绍

i:i1 表达式 生成伪列实现自增序列 语法&#xff1a; select (i:i1) as ,t.* from table_name t,(select i:0) as j (i:i1)代表定义一个变量&#xff0c;每次叠加 1&#xff1b; (select i:0) as j 代表建立一个临时表&#xff0c;j是随便取的表名&#xff0c;但别名一定…...

Nexperia和KYOCERA AVX Components Salzburg 就车规氮化镓功率模块达成合作

Nexperia和KYOCERA AVX Components Salzburg 就车规氮化镓功率模块达成合作 基础半导体器件领域的高产能生产专家Nexperia&#xff08;安世半导体&#xff09;近日宣布与国际著名的为汽车行业提供先进电子器件的供应商 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…...

手把手教你用TI F28P65X开发板实现LED定时闪烁(基于CPU Timer2,含完整源码)

从零玩转TI F28P65X开发板&#xff1a;CPU Timer2实现可调频LED闪烁实战指南 刚拿到TI F28P65X开发板时&#xff0c;面对密密麻麻的引脚和复杂的开发环境&#xff0c;很多嵌入式新手会感到无从下手。本文将带你用最直观的方式&#xff0c;通过控制LED闪烁这个经典入门项目&…...

【DexGraspNet与多指手抓取算法详解】第六章 运动规划与轨迹优化

目录 第六章 运动规划与轨迹优化 6.1 从静态姿态到动态轨迹 6.1.1 抓取前运动规划 6.1.1.1 快速扩展随机树 (RRT) 6.1.1.1.1 状态空间采样 6.1.1.1.2 碰撞检测机制 6.1.1.2 轨迹平滑处理 6.1.1.2.1 B样条插值 6.1.1.2.2 速度与加速度约束 6.2 基于优化的轨迹生成 6.…...

探秘书匠策AI:毕业论文创作的“全能助手”大揭秘

在学术探索的征途中&#xff0c;毕业论文如同一座巍峨的山峰&#xff0c;让无数学生既心怀憧憬又倍感压力。从选题迷茫到文献海捞&#xff0c;从结构搭建到内容雕琢&#xff0c;每一步都充满了挑战。但别怕&#xff0c;今天我们就来揭秘一位学术界的“全能助手”——书匠策AI&a…...

SDMatte效果对比评测:与传统抠图工具及在线API的全面比拼

SDMatte效果对比评测&#xff1a;与传统抠图工具及在线API的全面比拼 1. 开篇&#xff1a;为什么需要新的抠图方案 在数字内容创作领域&#xff0c;抠图一直是个让人又爱又恨的技术活。记得去年帮朋友做电商产品图&#xff0c;光是给20个商品抠图就花了我整整一个周末。传统工…...

企业级低代码平台JeecgBoot快速搭建指南:从环境配置到实战应用

企业级低代码平台JeecgBoot快速搭建指南&#xff1a;从环境配置到实战应用 【免费下载链接】jeecg-boot 一款 AI 驱动的低代码平台&#xff0c;提供"零代码"与"代码生成"双模式——零代码模式一句话搭建系统&#xff0c;代码生成模式自动输出前后端代码与建…...

Qwen3.5-9B-AWQ-4bit开源可部署教程:私有云/K8s集群中部署多实例视觉理解服务

Qwen3.5-9B-AWQ-4bit开源可部署教程&#xff1a;私有云/K8s集群中部署多实例视觉理解服务 1. 模型概述 Qwen3.5-9B-AWQ-4bit是一个支持图像理解的多模态模型&#xff0c;能够结合上传图片与文字提示词&#xff0c;输出中文分析结果。这个量化版本特别适合在资源受限的环境中部…...

Phi-4-mini-reasoning企业应用探索:智能客服知识推理模块集成方案

Phi-4-mini-reasoning企业应用探索&#xff1a;智能客服知识推理模块集成方案 1. 轻量级推理模型的价值 在当今企业智能化转型浪潮中&#xff0c;轻量级推理模型正成为技术落地的关键。Phi-4-mini-reasoning作为一款专注于高质量推理的开源模型&#xff0c;凭借其128K令牌的超…...

Java 无人图书借阅系统设计与完整源码实现

以下是一个基于Java的无人图书借阅系统的设计与完整源码实现方案&#xff0c;涵盖系统架构、核心模块、数据库设计、关键代码实现及部署建议&#xff1a;一、系统架构设计1. 分层架构表现层&#xff1a;用户端&#xff1a;微信小程序&#xff08;UniApp开发&#xff09; H5页面…...

IPXWrapper终极指南:三步让Windows 11完美运行经典游戏联机对战

IPXWrapper终极指南&#xff1a;三步让Windows 11完美运行经典游戏联机对战 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 还在为Windows 11无法运行《红色警戒2》、《星际争霸》等经典游戏而烦恼吗&#xff1f;IPXWrapper正是…...

鸿蒙与Android双端蓝牙开发避坑指南:定位权限、虚拟地址与厂商SDK那些事

鸿蒙与Android双端蓝牙开发实战&#xff1a;权限策略与真实地址获取全解析 当你的应用需要同时在鸿蒙和Android设备上稳定运行蓝牙功能时&#xff0c;系统差异就像一片雷区——Android 12的权限拆分、鸿蒙4.0的虚拟地址返回、不同版本间的API兼容性&#xff0c;每个环节都可能让…...