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

unittest框架 核心知识的系统复习及与pytest的对比

1. unittest 介绍

  • 是什么:Python 标准库自带的单元测试框架,遵循 xUnit 架构(类似Java的JUnit)。

  • 核心概念

    • TestCase:测试用例的基类,所有测试类需继承它。

    • TestSuite:测试套件,用于聚合多个测试用例。

    • TestLoader:加载测试用例。

    • TestRunner:执行测试并输出结果。

  • 适用场景:单元测试、集成测试,适合需要与Python标准库深度集成的项目。


2. 环境搭建

  • 无需安装:Python 自带,直接导入即可:

    python

    复制

    import unittest

3. 用例规则

  • 测试类:必须继承 unittest.TestCase

  • 测试方法:以 test_ 开头(如 test_login)。

  • 断言方法:使用 self.assertXxx()(如 self.assertEqual())。


4. 用例编写示例

python

复制

import unittest

class TestMath(unittest.TestCase):
    def test_add(self):
        self.assertEqual(1 + 1, 2)

    def test_multiply(self):
        self.assertTrue(2 * 3 == 6)

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

5. 断言方法

方法说明
self.assertEqual(a, b)断言 a == b
self.assertNotEqual(a, b)断言 a != b
self.assertTrue(x)断言 x 为 True
self.assertFalse(x)断言 x 为 False
self.assertIn(a, b)断言 a 在 b 中
self.assertRaises(Error)断言代码块抛出指定异常

6. 测试夹具(Setup/Teardown)

  • 类级别

    python

    复制

    @classmethod
    def setUpClass(cls):   # 类初始化(整个类执行前运行一次)
    @classmethod
    def tearDownClass(cls):# 类清理(整个类执行后运行一次)
  • 方法级别

    python

    复制

    def setUp(self):       # 每个测试方法执行前运行
    def tearDown(self):    # 每个测试方法执行后运行

7. 用例跳过

  • 无条件跳过

    python

    复制

    @unittest.skip("跳过原因")
    def test_skip(self):
        pass
  • 条件跳过

    python

    复制

    @unittest.skipIf(sys.platform == "win32", "Windows不支持")
    def test_linux_only(self):
        pass

8. 测试套件(TestSuite)

  • 手动聚合用例

    python

    复制

    suite = unittest.TestSuite()
    suite.addTest(TestMath("test_add"))
    suite.addTest(TestLogin("test_login"))
  • 自动发现用例

    python

    复制

    loader = unittest.TestLoader()
    suite = loader.loadTestsFromModule(test_module)  # 从模块加载
    suite = loader.loadTestsFromTestCase(TestMath)  # 从类加载

9. 参数化

  • 原生不支持:需借助第三方库 parameterized 或 ddt

  • 使用 ddt 示例

    python

    复制

    import ddt
    
    @ddt.ddt
    class TestDataDriven(unittest.TestCase):
        @ddt.data((1, 2, 3), (0, 0, 0))
        @ddt.unpack
        def test_add(self, a, b, expected):
            self.assertEqual(a + b, expected)

10. 与 pytest 的对比

特性unittestpytest
语法简洁性需继承 TestCase,断言方法较繁琐无需继承,直接使用 assert
参数化依赖第三方库(如ddt)原生支持 @pytest.mark.parametrize
夹具setUp/tearDown更灵活的 @pytest.fixture
插件生态较少丰富(如并发、Allure报告)
执行效率较低更高(支持并发)

11. 集成 HTMLTestRunner(生成测试报告)

步骤:

  1. 下载 HTMLTestRunner.py(非标准库,需单独放置)。

  2. 在代码中调用:

    python

    复制

    with open("report.html", "wb") as f:
        runner = HTMLTestRunner.HTMLTestRunner(
            stream=f,
            title="测试报告",
            description="用例执行详情"
        )
        runner.run(suite)

12. 生成测试报告

  • 控制台输出

    bash

    复制

    python -m unittest discover -s tests  # 自动发现并执行测试
  • XML 报告(用于CI集成):

    bash

    复制

    python -m unittest discover -s tests -p "test_*.py" -v > report.xml

总结

  • 适用场景:适合需要与Python标准库无缝集成的项目,或团队习惯xUnit风格。

  • 优势

    • 无需额外安装,兼容性强。

    • 清晰的类与方法结构。

  • 劣势:灵活性较低,扩展依赖第三方库。

  • 推荐搭配:结合 ddt(参数化)、coverage(覆盖率)、HTMLTestRunner(报告)提升效率。


http://www.kler.cn/a/572725.html

相关文章:

  • 厦门大学:《DeepSeek大模型赋能高校教学和科研报告》(120页PPT,建议收藏)
  • Milvus 数据批量导出实战:Python 代码解析
  • 【深度剖析】古德-图灵估计:从密码破译到NLP的统计革命
  • react精简面试题
  • 金融术语:Loan origination理解
  • RockyLinux9.5 虚拟机安装、配置及XShell连接
  • GaussianCity:实时生成城市级数字孪生基底的技术突破
  • 报错Non-terminating decimal expansion; no exact representable decimal result
  • 【YOLO V5】目标检测 WSL2 AutoDL VScode SSH
  • MySQL环境搭建
  • 充分必要条件
  • Spring Boot 3 整合 MinIO 实现分布式文件存储
  • 大模型基石——Transformer介绍
  • 蓝桥杯4T平台(频率测量显示)
  • FPGA有关HDMI的一些知识,程序源自bilibi正点原子
  • Ubuntu20.04双系统安装及软件安装(一):系统安装
  • 数字电子技术基础(二十四)——TTL门电路的高、低电平的输出特性曲线
  • 大模型简介
  • 【Linux】磁盘结构 | 文件系统 | inode(二)
  • FastGPT 源码:controller.ts 主要定义