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

2023-12-04

构建测试套件

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

测试套件(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")

查看执行结果

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unittest单元测试框架之unittest构建测试套件 的相关文章

  • 软件测试|web自动化测试神器playwright教程(三十八)

    简介 在我们使用selenium时 我们可以获取元素的属性 元素的文本值 以及输入框的内容等 作为比selenium更为强大的web自动化测试神器 playwright也可以实现对元素属性 文本值和输入框内容的抓取 并且实现比seleniu
  • Docker 安全必知:最佳实践、漏洞管理与监控策略

    容器安全是实施和管理像 Docker 这样的容器技术的关键方面 它包括一组实践 工具和技术 旨在保护容器化应用程序及其运行的基础架构 在本节中 我们将讨论一些关键的容器安全考虑因素 最佳实践和建议 容器隔离 隔离对于确保容器化环境的强大性和
  • Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose

    Docker CLI 命令行界面 是一个强大的工具 可让您与 Docker 容器 映像 卷和网络进行交互和管理 它为用户提供了广泛的命令 用于在其开发和生产工作流中创建 运行和管理 Docker 容器和其他 Docker 资源 安装 要开始
  • 软件测试|使用Python读写yaml文件,你会了吗?

    简介 YAML YAML Ain t Markup Language 是一种可读的数据序列化格式 它常用于配置文件和数据交换 Python 提供了许多库来处理 YAML 文件 在本文中 我们将探讨如何使用 PyYAML 库来读取和写入 YA
  • 软件测试|pycharm关联GitHub的详细步骤

    简介 GitHub 是全球最大的开源代码托管平台之一 而 PyCharm 是一款强大的 Python 集成开发环境 将两者结合使用 可以提高团队协作和代码管理的效率 本文将详细介绍如何在 PyCharm 中管理 GitHub 账号 包括如何
  • 软件测试|教你如何使用Python绘制出奥运五环旗

    简介 我们之前介绍过使用turtle来绘制正多边形 但是绘制正多边形只是turtle模块最基础的使用 我们可以使用turtle模块绘制出更多不一样的精彩图形 本文就来给大家介绍一个比较简单的turtle绘图实例 绘制奥运五环旗 初始化参数
  • 软件测试|Python数据可视化神器——pyecharts教程(九)

    使用pyecharts绘制K线图进阶版 简介 K线图 Kandlestick Chart 又称蜡烛图 是一种用于可视化金融市场价格走势和交易数据的图表类型 它是股票 外汇 期货等金融市场中最常用的技术分析工具之一 可以提供关于价格变动 趋势
  • 深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析

    Python MongoDB 排序 对结果进行排序 使用 sort 方法对结果进行升序或降序排序 sort 方法接受一个参数用于 字段名 一个参数用于 方向 升序是默认方向 示例 按名称按字母顺序对结果进行排序 import pymongo
  • Python 中多态性的示例和类的继承多态性

    单词 多态 意味着 多种形式 在编程中 它指的是具有相同名称的方法 函数 操作符 可以在许多不同的对象或类上执行 函数多态性 一个示例是 Python 中的 len 函数 它可以用于不同的对象 字符串 对于字符串 len 返回字符的数量 示
  • 掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南

    C 变量 变量是用于存储数据值的容器 在 C 中 有不同类型的变量 用不同的关键字定义 例如 int 存储整数 没有小数点的整数 如 123 或 123 double 存储浮点数 有小数点 如 19 99 或 19 99 char 存储单个
  • Python自动化测试 | 如何使用Robot Framework进行自动化测试?

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 跨平台UI自动化框架:Airtest,游戏开发和应用测试的利器

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • msyql 异常,别干着急,70%的问题都在这里!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 新手也能看懂的【前端自动化测试入门】

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 新手也能看懂的【前端自动化测试入门】!

    前言 最近在网上搜索前端自动化测试相关的文档 但是发现网上的文章都是偏使用 没有把一些基础概念说清楚 导致后续一口气遇到一些 karma Jasmine jest Mocha Chai BDD 等词汇的时候很容易一头雾水 这次一方面整理一下
  • 月薪2W的软件测试工程师,到底是做什么的?

    在生活中 我们常常会遇到以下几种窘迫时刻 准备骑共享单车出行 却发现扫码开锁半天 车子都没有反应 手机导航打车 却发现地图定位偏差很大 司机总是跑错地方 买个水 却遭遇自动售货机吐币 或者不找零钱 好不容易休息打个游戏 却一直出现卡顿 闪退
  • 探索自动化测试断言:提升测试效率与质量的关键!

    前言 断言在自动化测试中起着关键的作用 它是验证测试结果是否符合预期的重要手段 如果在自动化测试过程中忽视了断言 那么这个测试就失去了其本质的意义 因为我们无法得知测试结果是否达到了预期的效果 因此 断言在自动化测试中的重要性不言而喻 那么
  • 软件测试/测试开发/全日制/测试管理丨Android WebView 技术原理

    Android WebView是一个内置的组件 允许在Android应用中嵌套显示Web内容 Android WebView的技术原理涉及到使用WebKit引擎来渲染Web内容 并提供一系列API和回调函数 使得开发人员可以控制和定制Web
  • Python - 字典4

    复制字典 您不能简单地通过输入 dict2 dict1 来复制一个字典 因为 dict2 只会成为 dict1 的引用 对 dict1 的更改也会自动应用于 dict2 有多种方法可以复制字典 一种方法是使用内置的 copy 方法 示例 使
  • Airtest自动化测试工具

    一开始知道Airtest大概是在年初的时候 当时 看了一下官方的文档 大概是类似Sikuli的一个工具 主要用来做游戏自动化的 通过截图的方式用来解决游戏自动化测试的难题 最近 移动端测试的同事尝试用它的poco库来做自动化 看样子还不错

随机推荐