【2024软件测试面试必会技能】Unittest(6):unittest_构建测试套件

构建测试套件

在实际项目中,随着项目进度的开展,测试类会越来越多,可是直到现在我 们还只会一个一个的单独运行测试类,这在实际项目实践中肯定是不可行的,在 unittest中可以通过测试套件来解决该问题。

测试套件(Test Suite)是由多个测试用例(Test Case)组成的,当然也 可以由多个子测试套件组成

在unittest中,把测试用例加载到测试套件的方式有如下方法:(推荐方式六)

方式一、用unittest.TestSuite()实例化测试套件对象后,内部的addTest()方法对测试类内部的测试案例进行逐一添加。

注:使用addTest()方法,不是以test开头的用例也可以执行

代码示例:

复制代码

# 1,一条一条添加测试用例
import unittestclass Test_Case(unittest.TestCase):def setUp(self):print("我是setup方法:进行测试前的初始化工作")def tearDown(self) -> None:  # 表示该方法没有返回值print("我是tearDown方法:执行测试后的清除工作")print("------------执行结束----------------")def test_aaa(self):print("我是case:test_aaa")def test_bbb(self):print("我是case:test_bbb")def ccc(self):print("我是case:ccc")# 测试套件
# 一条一条用例通过addTest方法添加
# 方法一:
# if __name__ == '__main__':
#     suite = unittest.TestSuite()  # 创建测试套件对象
#     suite.addTest(test_case("test_bbb"))  # addTest(类名(“方法名称”))
#     suite.addTest(test_case("ccc"))  # 不是以test开头的用例也可以执行
#     unittest.main(defaultTest="suite")# 方法二:
def suite():suite = unittest.TestSuite()suite.addTest(Test_Case("test_bbb"))  # addTest(类名(“方法名称”))suite.addTest(Test_Case("ccc"))return suite
if __name__ == '__main__':unittest.main(defaultTest="suite")

复制代码

查看执行结果

方式二、用unittest.TestSuite()实例化测试套件对象后,内部的makeSuite()方法对整个测试类进行添加。

注:使用makeSuite()方法,不是以test开头的方法不会被添加进测试套件中

代码示例:

复制代码

# 添加整个测试类
import unittestclass Test_Case(unittest.TestCase):def setUp(self):print("我是setup方法:进行测试前的初始化工作")def tearDown(self) -> None:  # 表示该方法没有返回值print("我的tearDown方法:执行测试后的清除工作")print("------------执行结束----------------")def test_aaa(self):print("我的case:test_aaa")def test_bbb(self):print("我的case:test_bbb")def ccc(self):print("我的case:ccc")# 能否添加整个测试类?
if __name__ == '__main__':# 注意:此时不是以test开头的方法不会被添加进测试套件中# 注意:makeSuite 可能需要手动添加suite = unittest.TestSuite(unittest.makeSuite(Test_Case))  # 里面是类名unittest.main(defaultTest="suite")

复制代码

查看执行结果

方式三、使用TestLoader()方法添加整个测试类

注:unittest.TestLoader().loadTestsFromTestCase() 不是以test开头的方法不会被执行

代码示例:

复制代码

# 3,添加整个测试类
# unittest中提供一个TestLoader类用于自动创建一个测试类,并且把单个测试自动放入测试集中
# TestLoader 类会自动运行以test开头的测试方法
import unittestclass Test_Case1(unittest.TestCase):def setUp(self):print("我是setup方法:进行测试前的初始化工作")def tearDown(self) -> None:  # 表示该方法没有返回值print("我是tearDown方法:执行测试后的清除工作")print("------------执行结束----------------")def test_aaa(self):print("我是case1:test_aaa")def test_bbb(self):print("我是case1:test_bbb")def ccc(self):print("我是case1:ccc")class Test_Case2(unittest.TestCase):def setUp(self):print("我是setup方法:进行测试前的初始化工作")def tearDown(self) -> None:  # 表示该方法没有返回值print("我是tearDown方法:执行测试后的清除工作")print("------------执行结束----------------")def test_aaa(self):print("我是case2:test_aaa")def test_bbb(self):print("我是case2:test_bbb")def test_ccc(self):print("我是case2:test_ccc")if __name__ == "__main__":suite = unittest.TestLoader().loadTestsFromTestCase(Test_Case1) # 填 类名unittest.main(defaultTest='suite')

复制代码

查看执行结果

方式四、添加整个模块下所有的测试类

注:unittest.TestLoader().loadTestsFromName() 不是以test开头的方法不执行

代码示例:

复制代码

# 4,添加整个模块下所有的测试类
import unittestclass Test_Case1(unittest.TestCase):def setUp(self):print("我是setup方法:进行测试前的初始化工作")def tearDown(self) -> None:  # 表示该方法没有返回值print("我的tearDown方法:执行测试后的清除工作")print("------------执行结束----------------")def test_aaa(self):print("我是case1:test_aaa")def test_bbb(self):print("我是case1:test_bbb")def ccc(self):print("我是case1:test_ccc")class Test_Case2(unittest.TestCase):def setUp(self):print("我是setup方法:进行测试前的初始化工作")def tearDown(self) -> None:  # 表示该方法没有返回值print("我的tearDown方法:执行测试后的清除工作")print("------------执行结束----------------")def test_aaa(self):print("我是case2:test_aaa")def test_bbb(self):print("我是case2:test_bbb")def test_ccc(self):print("我是case2:test_ccc")if __name__ == "__main__":# 通过TestLoader中字符串的方法加载用例;不以test开头的方法不执行# 1,增加一个测试用例  模块名称.类名.方法名称# suite = unittest.TestLoader().loadTestsFromName("demo11_测试套件4.test_case1.test_aaa")# 2,增加整个测试类# suite = unittest.TestLoader().loadTestsFromName("demo11_测试套件4.test_case1")# 3,增加整个.py模块下所有的测试类suite = unittest.TestLoader().loadTestsFromName("demo11_测试套件4")  # 填 py文件名unittest.main(defaultTest='suite')

复制代码

查看执行结果

方式五、将多个子测试集进行整合到一个大的测试套件中

代码示例:

复制代码

# 将多个子测试集进行整合到一个大的测试套件中
import unittest
from unittest框架 import  demo11_测试套件4  # 导入其他模块
from unittest框架 import  demo08_测试套件1  # 导入其他模块# 依次创建多个套件
# 1,单个用例套件
suite01 = unittest.TestLoader().loadTestsFromName('demo08_测试套件1.Test_Case.test_aaa')
# 2,整个类
suite02 = unittest.TestLoader().loadTestsFromName("demo08_测试套件1.Test_Case")
# 3,整个.py模块
suite03 = unittest.TestLoader().loadTestsFromName("demo11_测试套件4")main_suite = unittest.TestSuite()  # 主套件
main_suite.addTest(suite01)  # 添加子套件到主套件中
main_suite.addTest(suite02)
main_suite.addTest(suite03)unittest.main(defaultTest="main_suite")

复制代码

查看执行结果

方式六、使用discover()来实现添加执行整个目录下所有的测试用例  (=====推荐=====)

当测试用例存放在多个不同子目录下,我们用之前的把用例加载到测试集合中的方 式还是不太方便,需要不断的去导入和添加测试用例模块,此时可以通过discover()方法 来实现

方法如下:
discover(start_dir,pattern ='test *.py', top_level_dir = None)

start_dir:要测试的模块名或测试用例目录

pattern="test*.py":表示用例文件名的匹配原则,例子中匹配文件名为以"test"开头的".py"文件,星号"*"表示任意多个字符;

top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为None。

该方法通过从指定的开始目录递归到子目录中查找所有测试模块,并返回包含它们的TestSuite对象,只要与模式匹配测试文件和可导入的模块名称才会被加载。

如果一个测试文件的名称符合pattern,会自动查找该文件中派生自TestCase 的类包含的 test 开头的方法作为测试方法

代码示例:

复制代码

# 使用discover()来实现添加执行整个目录下所有的测试用例
import os
import unittest
import HTMLTestRunner
import time# 获取当前路径
curren_path = os.path.dirname(__file__)
# 获取测试用例目录的路径
case_path = os.path.join(curren_path,"all_case")# 从当前路径回到上一层路径
# case_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))# 匹配测试用例路径下的所有的测试方法
discover = unittest.defaultTestLoader.discover(start_dir=case_path,  # 用例路径pattern="*_case*.py",top_level_dir=None)   # 文件类型
# 创建主套件
main_suite = unittest.TestSuite()
# 把测试用例路径添加到主套件中
main_suite.addTest(discover)
# 执行主套件里的测试用例
unittest.main(defaultTest="main_suite")

复制代码

查看执行结果

 总结

如果你对此文有任何疑问,如果你也需要接口项目实战,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入我们,加入方式在文章的最后面

  自动化测试相关教程推荐:

2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili

2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili

测试开发相关教程推荐

2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili

postman/jmeter/fiddler测试工具类教程推荐

讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili

2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili

2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili

  总结:

 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

​​​

​​​

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/698133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标检测-Transformer-ViT和DETR

文章目录 前言一、ViT应用和结论结构及创新点 二、DETR应用和结论结构及创新点 总结 前言 随着Transformer爆火以来,NLP领域迎来了大模型时代,成为AI目前最先进和火爆的领域,介于Transformer的先进性,基于Transformer架构的CV模型…

C语言深入剖析——函数栈帧的创建与销毁

目录 0.前言 1.什么是函数栈帧 1.1栈帧的组成 1.2栈帧的作用 1.3栈帧的管理 2.理解函数栈帧的作用 3.解析函数栈帧的创建与销毁 3.1栈的介绍 3.2寄存器简介 3.3汇编指令简介 3.4具体过程解析 3.4.1预备知识 3.4.2函数的调用堆栈 3.4.3转到反汇编 3.4.4函数栈帧的…

【Python_Zebra斑马打印机编程学习笔记(一)】实现标贴预览的两种方式

实现标贴预览的两种方式 实现标贴预览的两种方式前言一、调用 Labelary Online ZPL Viewer API 方法实现标贴预览功能1、Labelary Online ZPL Viewer API 案例介绍2、生成 PNG 格式3、Parameters 二、通过 zpl 的 label.preview() 方法实现标贴预览功能1、实现步骤2、代码示例 …

Python实战:读取MATLAB文件数据(.mat文件)

Python实战:读取MATLAB文件数据(.mat文件) 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 👈 希望得到您的订阅…

R语言【base】——abs(),sqrt():杂项数学函数

Package base version 4.2.0 Description abs(x) 计算 x 的绝对值,sqrt(x) 计算 x 的正平方根。 Usage abs(x) sqrt(x) Arguments 参数【x】:一个数值或复数向量或数组。 Details 这些都是内部泛型原语函数:可以为它们单独定义方法,也可以…

MATLAB R2018b安装教程

目录 一、软件下载 二、软件介绍 三、安装须知 四、安装步骤 【最后】 🎈个人主页:库库的里昂 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:MATLAB基础及应用🤝希望作者的文章能…

Bert基础(一)--自注意力机制

1、简介 当下最先进的深度学习架构之一,Transformer被广泛应用于自然语言处理领域。它不单替代了以前流行的循环神经网络(recurrent neural network, RNN)和长短期记忆(long short-term memory, LSTM)网络,并且以它为基础衍生出了诸如BERT、GPT-3、T5等…

知识积累(二):损失函数正则化与权重衰减

文章目录 1. 欧氏距离与L2范数1.1 常用的相似性度量 2. 什么是正则化?参考资料 本文只介绍 L2 正则化。 1. 欧氏距离与L2范数 欧氏距离也就是L2范数 1.1 常用的相似性度量 1)点积 2)余弦相似度 3)L1和L2 2. 什么是正则化&…

http相关概念以及apache的功能(最详细讲解!!!!)

概念 互联网:是网络的网络,是所有类型网络的母集 因特网:世界上最大的互联网网络 万维网:www (不是网络,而是数据库)是网页与网页之间的跳转关系 URL:万维网使用统一资源定位符,…

c#程序,oracle使用Devart驱动解决第第三方库是us7ascii,数据乱码的问题

最近做项目,要跟对方系统的库进行读写,结果发现对方采用的是oracle的us7ascii编码,我们系统默认采用的是ZHS16GBK,导致我们客户端读取和写入对方库的数据都是乱码,搜索网上,发现需要采用独立的oracle驱动去…

JVM——感谢黑马程序员官方文档

JVM——感谢黑马程序员官方文档 一、JVM介绍1.什么是JVM?2.有什么好处3.学习路线 二、内存结构1.程序计数器(Program Counter Registe)1.定义2.作用3.特点4.演示 2.虚拟机栈(Java Virtual Machine Stacks)1.定义2.演示3.问题解析4.栈内存溢出5.线程运行诊断&#xf…

操作系统--多线程的互斥、同步

一、概念 在进程/线程并发执行的过程中,进程/线程之间存在协作的关系,例如有互斥、同步的关系。 1.互斥 由于多线程执行操作共享变量的这段代码可能会导致竞争状态,因此我们将此段代码称为临界区(critical section)…

数据中心机房建设的真正挑战

在数字化时代,数据中心机房不仅是信息处理和存储的心脏,也是企业运营的核心枢纽。然而,在机房建设过程中,存在一系列概念上的误解和痛点。这些误区不仅影响了机房建设的质量和效率,也给企业的长期发展带来了潜在的风险…

了解RT-Thread

1.简介 1)RT-Thread,全程是Real Time-Thread; 2)嵌入式实时多线程操作系统; 3)基本属性之一是支持多任务; 4)某一时刻只能运行一个任务,每次对一个任务的执行时间很短…

[论文精读]Do Transformers Really Perform Bad for Graph Representation?

论文网址:[2106.05234] Do Transformers Really Perform Bad for Graph Representation? (arxiv.org) 论文代码:https://github.com/Microsoft/Graphormer 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼…

【什么是Mask R-CNN呢?】

🚀 作者 :“码上有前” 🚀 文章简介 :深度学习 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Mask R-CNN Mask R-CNN(Mask Region-based Convolutional Neural Network)是一…

【ACM独立出版|武汉】第五届计算机信息和大数据应用国际学术会议(CIBDA 2024)

第五届计算机信息和大数据应用国际学术会议(CIBDA 2024) 2024 5th International Conference on Computer Information and Big Data Applications 第五届计算机信息和大数据应用国际学术会议(CIBDA 2024)将于2024年3月22-24日在中…

深度学习基础(三)循环神经网络(RNN)

之前的章节我们初步介绍了卷积神经网络(CNN): 深度学习基础(二)卷积神经网络(CNN)-CSDN博客文章浏览阅读2次。卷积神经网络(CNN)的应用领域广泛,尤其在图像处…

全国各地2024上半年软考报名费用汇总

注:因各地考试政策时有变化,因此下列报名价格仅供参考,大家需要以当地当年通知说明为准。 山东:每人每科68元 北京:每人每科57元 广东:纸笔科目按每人每科63元收取,机考科目(信息…

如何使用Douglas-042为威胁搜索和事件应急响应提速

关于Douglas-042 Douglas-042是一款功能强大的PowerShell脚本,该脚本可以提升数据分类的速度,并辅助广大研究人员迅速从取证数据中筛选和提取出关键数据。 该工具能够搜索和识别Windows生态系统中潜在的安全漏洞,Douglas-042会将注意力放在…