Python单元测试框架unittest入门

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

unittest框架有以下特点与优势:

  • 标准化的测试工具:  unittest框架提供了标准化的测试工具和从标准TestCase集成的测试运行器,为新手和高级用户提供了一个可用的接口。
  • 支持自动化测试: 可以通过编写自动化测试用例,加快测试效率,缩短测试时间,减少人工测试工作。
  • 支持测试定制: unittest框架可以轻松集成第三方库,支持创建自定义的测试用例和测试套件。
  • 执行结果明确: unittest框架提供了详细的错误信息,让测试人员能够快速地定位和修复错误。

三、unittest框架基础

安装和配置unittest框架

unittest是Python的内置模块,所以你不需要额外安装。

unittest 简单示例

被测试的代码demo,包含了两个方法, add 和 sub

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

为这两个函数编写单元测试用例

import unittest
from calculate import add, sub

class TestCalcuate(unittest.TestCase):
    def test_add(self):
        result = add(2, 3)
        self.assertEqual(result, 5) 

    def test_sub(self):
        result = sub(5, 3)
        self.assertEqual(result, 2)

if __name__ == '__main__':
    unittest.main()

在这个测试用例中,我们导入了addsub函数,并创建了一个名为 TestCalcuate 的测试类(所有的测试类都必须是unittest.TestCase 的子类)。在这个类中,我们定义了两个测试方法test_addtest_sub,分别用于测试加法和减法函数的行为。

在每个测试方法中,我们调用相应的函数,并使用self.assertEqual断言方法来验证计算结果是否等于预期值。

最后,我们使用unittest.main()来运行测试用例。

四、unittest框架常用的测试类和方法

Python的unittest框架中,提供了许多用于辅助构建单元测试的类和方法

常用的测试类
  1. unittest.TestCase:这是unittest框架中最重要的测试类,所有的测试用例都应该继承自它。它提供了一些常用的断言方法和测试辅助方法,用于编写和运行测试。
  2. unittest.TestSuite:这个类用于组织和管理一组测试用例。你可以将多个测试用例添加到一个测试套件中,并一次性运行它们。
  3. unittest.TestLoader:这个类用于加载测试用例。它提供了一些方法,可以从模块、类或者目录中自动发现和加载测试用例。
  4. unittest.TextTestRunner:这个类用于运行测试用例并生成测试结果的文本报告。它提供了一些方法,可以控制测试的输出格式和详细程度。
  5. unittest.TestResult:这个类用于存储测试结果。它提供了一些方法,可以获取测试的状态、错误信息和失败信息等。
常用的方法

在unittest框架中,常用的方法包括setUp()tearDown()setUpClass()tearDownClass()。这些方法用于在测试用例的执行过程中进行准备和清理工作。

  1. setUp()方法:在每个测试方法运行之前调用。它用于准备测试环境,例如初始化对象、打开文件等。每个测试方法都会在调用setUp()方法后执行。
  2. tearDown()方法:在每个测试方法运行之后调用。它用于清理测试环境,例如关闭文件、释放资源等。每个测试方法都会在调用tearDown()方法后执行。
  3. setUpClass()方法:在测试类中的所有测试方法运行之前调用。它用于进行一次性的测试环境准备工作,例如连接数据库、启动服务器等。setUpClass()方法需要使用@classmethod装饰器进行标记。
  4. tearDownClass()方法:在测试类中的所有测试方法运行之后调用。它用于进行一次性的测试环境清理工作,例如断开数据库连接、关闭服务器等。tearDownClass()方法需要使用@classmethod装饰器进行标记。

这些方法可以在测试类中重写,并根据需要进行自定义操作。

五、编写测试用例

当使用unittest框架编写测试用例时,通常需要进行以下步骤:

  1. 创建测试用例:

    • 创建一个继承自unittest.TestCase的测试类。
    • 在测试类中定义一个或多个测试方法。每个测试方法应该以test_开头,以便unittest能够自动识别并运行它们。
    • 在每个测试方法中,编写测试逻辑并使用断言方法来验证结果是否符合预期。
  2. 管理测试用例:

    • 使用unittest.TestLoader类来加载测试用例。你可以使用loadTestsFromModule()方法从模块中加载测试用例,或者使用loadTestsFromTestCase()方法从测试类中加载测试用例。
    • 创建一个unittest.TestSuite对象,并将加载的测试用例添加到测试套件中。你可以使用addTest()方法添加单个测试用例,或者使用addTests()方法添加多个测试用例。
  3. 运行测试用例:

    • 使用unittest.TextTestRunner类来运行测试用例并生成测试结果的文本报告。
    • 创建一个unittest.TextTestRunner对象。
    • 调用run()方法运行测试套件,并将结果输出到控制台或文件中。

结合前面的例子,进一步演示如何编写、管理和运行测试用例:

import unittest

class MyTestCase(unittest.TestCase):
    def test_add(self):
        result = 2 + 2
        self.assertEqual(result, 4)

    def test_sub(self):
        result = 5 - 3
        self.assertEqual(result, 2)

if __name__ == '__main__':
    # 创建测试套件并添加测试用例
    suite = unittest.TestSuite()
    suite.addTest(MyTestCase('test_add'))
    suite.addTest(MyTestCase('test_sub'))

    # 创建测试运行器并运行测试套件
    runner = unittest.TextTestRunner()
    runner.run(suite)

在这个示例中,我们创建了一个名为MyTestCase的测试类,并在其中定义了两个测试方法test_addtest_sub。然后,我们创建了一个测试套件,并使用addTest()方法将测试用例添加到测试套件中。最后,我们创建了一个测试运行器,并使用run()方法运行测试套件。

运行这个示例,你将看到测试结果的输出。如果所有测试通过,你将看到一个成功的消息。如果有测试失败,你将看到失败的消息和详细的错误信息。

这是使用unittest编写、管理和运行测试用例的基本步骤。你可以根据需要编写更多的测试方法,并使用各种断言方法来验证你的代码的行为。

六、unittest常用的断言方法

当然可以!以下是unittest常用的断言方法以markdown表格的方式呈现:

断言方法描述
assertEqual(a, b)断言a和b相等
assertNotEqual(a, b)断言a和b不相等
assertTrue(x)断言x为True
assertFalse(x)断言x为False
assertIs(a, b)断言a和b是同一个对象
assertIsNot(a, b)断言a和b不是同一个对象
assertIsNone(x)断言x为None
assertIsNotNone(x)断言x不为None
assertIn(a, b)断言a在b中
assertNotIn(a, b)断言a不在b中
assertIsInstance(a, b)断言a是b的实例
assertNotIsInstance(a, b)断言a不是b的实例
assertRaises(exception, callable, *args, **kwargs)断言调用callable(*args, **kwargs)会引发指定的异常
assertWarns(warning, callable, *args, **kwargs)断言调用callable(*args, **kwargs)会引发指定的警告
assertLogs(logger=None, level=None)断言在指定的日志记录器上发生了指定级别的日志记录
assertAlmostEqual(a, b, places=None, msg=None, delta=None)断言a和b近似相等
assertNotAlmostEqual(a, b, places=None, msg=None, delta=None)断言a和b不近似相等
assertSequenceEqual(a, b, msg=None, seq_type=None)断言a和b是相同的序列
assertListEqual(a, b, msg=None)断言a和b是相同的列表
assertTupleEqual(a, b, msg=None)断言a和b是相同的元组
assertSetEqual(a, b, msg=None)断言a和b是相同的集合

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值