Unittest单元测试框架之unittest构建测试套件

news2025/2/22 12:34:45

构建测试套件

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

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

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

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

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

代码示例:

# 1,一条一条添加测试用例
import unittest


class 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 unittest

class 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 unittest

class 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 unittest

class 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")

查看执行结果

实战案例

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

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

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

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

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

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

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

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

相关文章

七、Zookeeper注册中心

目录 1、下载Zookeeper的服务jar包 2、下载好jar包后解压放到合适的目录(目录最好不要有中文及空格) 3、进入解压后的conf目录,复制zoo_sample.cfg文件并重命名为zoo.cfg,修改zoo.cfg文件内容如下 4、运行bin目录下的zkServer…

split,paste,eval命令及正则表达式

一、split命令 将 linux 下的一个大文件拆分成若干小文件 1.语法格式 格式:split 选项 参数 原始文件 拆分后文件名前缀 常用选项: -l:以行数拆分 -b:以大小拆分 2.命令演示 2.1选项 -l :以行数分隔 cat -n anaconda-ks.cfg…

Windows系统安装好MongoDB后运行方法

文章目录 1、先找到安装MongoDB的文件位置的bin文件夹:2、找到data/db文件夹位置(如果data文件夹中没有db文件夹需要创建一个):3、在刚刚打开的cmd窗口中运行以下命令:4、再另外从bin文件夹位置开一个cmd窗口&#xff…

图书管理系统(Java简单版)(完整代码+详解)

目录 详解: BookList类: InOperation接口 User类(父类) 和 Main类(这俩要一起看) 完整代码 book包 Book类 BookList类 operation包 AddBook类 BorrowBook类 DeleteBook类 FindBook类 Pr…

ESP32 FreeRTOS学习总结

2023.5.11 1.Task 创建任务常用API: 任务函数描述xTaskCreate()使用动态的方法创建一个任务xTaskCreatePinnedToCore指定任务的运行核心(最后一个参数)vTaskDelete(NULL)删除当前任务 BaseType_t xTaskCreate(TaskFunction_t pxTaskCode, // 任…

【HBase】架构

文章目录 整体架构Master负载均衡器元数据管理器预写日志处理器 Region ServerZookeeperHDFS Master架构Meta 表格 RegionServer 架构MemStoreWALBlockCache 读写流程HFile结构写流程读操作 整体架构 Master 实现类为 HMaster。 负责监控集群中所有的 RegionServer 实例。 &…

在Fedora-Workstation-Live-x86_64-36-1.5中使用佳能喷墨打印机ip2780

在Fedora-Workstation-Live-x86_64-36-1.5中使用佳能喷墨打印机ip2780 操作系统是64位的Fedora-Workstation-Live-x86_64-36-1.5.iso,实物打印机是佳能ip2780,USB接口 应用程序——其它——设置——打印机——解锁——输入root密码——将打印机USB插入电…

Redis数据结构——动态字符串、Dict、ZipList

一、Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题: 获取字符串长度…

智慧产业城彰显中国智造魅力,中联重科踏出“走上去”的关键一步

5月11日至14日,中联重科在长沙举行了“科技献礼新时代”系列活动。 借着活动,松果财经实地探访了全球规模最大、品种最全的工程机械产业基地,领略了前沿技术赋能先进制造的魅力。 作为湖南省“一号工程”和“十大重点项目之首”&#xff0c…

好家伙,又一份牛逼笔记面世了...

最近网传的一些裁员的消息,搞的人心惶惶。已经拿到大厂offer的码友来问我:大厂还能去,去了会不会被裁。 还在学习的网友来问我:现在还要冲互联网么? 我是认为大家不用恐慌吧,该看啥看啥,该学啥…

你一定要知道的unittest自动化测试框架详解

目录 框架的概念 Unittest单元测试框架 常用的assert语句 unittest创建测试代码的方式: unittest构建测试套件(测试用例集合): unittest忽略测试用例: 运行测试集 批量执行测试用例 生成HTMLTestRunner测试报告…

【运维知识进阶篇】集群架构-Nginx基础(安装+启动+配置+多业务实现+日志管理)

本篇文章介绍下Nginx有关内容,Nginx是一个开源且高性能、可靠的Http Web服务、代理服务。 开源:直接获取源代码,高性能:支持海量并发,可靠:服务稳定 Web服务有很多,选择Nginx是因为他的轻量化…

【软件测试】测试开发的一生之敌-BUG

文章目录 1.前言2.如何描述/创建一个BUG3.BUG的级别4.BUG的生命周期5.跟开发产生争执怎么办 1.前言 BUG相比大家都知道,程序运行出错或者与预期不符就是BUG.现在我们来用测试人员的角度来看待BUG. 2.如何描述/创建一个BUG 测试人员要测试开发人员的代码,找出开发人员可能忽略…

敏态开发在大兴机场数字化转型中的实践

一、最大事业是育人 大兴机场是一个年轻的企业,作为一个企业来讲,最宝贵的就是人才。我们在2017年开始社招大学生,到目前为止,公司有一半都是30岁左右的年轻人,并且每年都会招几十个。年轻人特别想做事,而…

C++之内存管理及函数模版

C中的内存管理机制和C语言是一样的,但在具体内存管理函数上,C语言的malloc已经无法满足C面向对象销毁的需求,于是祖师爷在C中新增了一系列内存管理函数,即 new 和 delete 著名段子:如果你还没没有对象,那就…

( 位运算 ) 342. 4的幂 ——【Leetcode每日一题】

❓342. 4的幂 难度:简单 给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。 整数 n 是 4 的幂次方需满足:存在整数 x 使得 n 4 x n 4^x n4x。 示例 1&…

src学习记录(二)

学习目标: Apache Shiro ThinkPHP struts2 Apache Log4j Fastjson Weblogic 学习内容: 1.Apache Shiro 字段内容指纹信息请求包中,在Cookie信息中给 rememberMe变量赋任意值,收到返回包的Set-Cookie 值存在 rememberMedeleteMe …

类和对象【C++】【下篇】

目录 一、初始化列表 二、隐式类型转换 三、静态成员 四、友元 1、友元函数 2、友元类 五、内部类 六、匿名对象 一、初始化列表 下面是日期类的一个构造函数,调用该构造函数后,对象中已经有了一个初始值,但并不能将它称为对对象成员变…

实时操作系统内存管理-TLSF算法

内存管理-TLSF算法 前言TLSF算法:为什么内存又叫内存“块”:O(1)查找空闲块:确定fl:确定sl:提级申请:分割块: 空闲块如何串成链表?减少外部碎片:查找上下块: …