Python unittest discover()方法与执行顺序补充

本文介绍unittest测试框架中discover方法的应用,该方法能自动查找并加载指定目录下的测试用例,支持递归查找子目录,同时介绍了如何通过设置文件名匹配规则来加载特定的测试用例文件,以及unittest框架中测试用例的默认执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、discover更多测试用例

可以根据不同的功能创建不同的测试文件,甚至是不同的测试目录,测试文件中还可以将不同的小功能划分为不同的测试类,在类下编写测试用例,让整体结构更加清晰

但通过addTest()添加、删除测试用例就变得非常麻烦

TestLoader 类中提供的discover()方法可以自动识别测试用例

discover(start_dir,pattern='test*.py',top_level_dir= None)

找到指定目录下所有测试模块,并可递归查到子目录下的测试模块,只有匹配到文件名时才加载

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

pattern='test*.py':表示用例文件名的匹配原则。此处匹配以“test”开头的.py 类型的文件,* 表示任意多个字符

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

实例1:

import unittest
test_dir = './'
#定义测试目录为当前目录
discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')

if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(discover)
discover()方法会自动根据测试目录test_dir 匹配查找测试用例文件,并将查找到的测试用例组装到测试套件中,因此,可以直接通过
run()方法执行discover,大大简化了测试用例的查找与执行

实例2:
suite = unittest.TestSuite()
all_cases = unittest.defaultTestLoader.discover(PY_PATH,'Test*.py')
#discover()方法会自动根据测试目录匹配查找测试用例文件(Test*.py),并将查找到的测试用例组装到测试套件中
[suite.addTests(case) for case in all_cases]
report_html = BeautifulReport.BeautifulReport(suite)
二、用例执行的顺序
unittest 框架默认根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0~9,A~Z,a~z
如果要让某个测试用例先执行,不能使用默认的main()方法,需要通过TestSuite类的addTest()方法按照一定的顺序来加载
<think>好的,我现在要解决用户的问题,他问的是“unittest有哪些方法”。首先,我需要确定用户指的是Python中的unittest框架。因为unittestPython的标准库之一,用于编写和运行测试用例。用户可能是刚开始学习单元测试,或者想了解unittest提供的各种方法,以便更好地编写测试。 接下来,我需要回忆unittest模块的主要组成部分。通常,测试用例是通过继承unittest.TestCase类来创建的,所以TestCase类中的方法是关键。用户可能想知道常用的测试方法、断言方法以及生命周期钩子方法。 首先,生命周期方法。每个测试用例都有setUp和tearDown,这两个方法分别在每个测试方法执行前后运行,用于准备和清理资源。还有setUpClass和tearDownClass,是类级别的,整个测试类运行前后执行一次。可能用户需要知道这些来管理测试环境。 然后是测试方法本身。测试方法必须以test_开头,这样unittest会自动识别并执行它们。比如test_add、test_sub等。用户可能想知道如何正确命名测试方法,以及如何组织多个测试。 接下来是断言方法,这是测试的核心。常用的有assertEqual(a, b)检查a和b是否相等,assertTrue(x)验证x是否为True,assertFalse(x)检查是否为False。还有assertRaises(异常类型, 可调用对象)来测试是否抛出了预期的异常。此外,assertIn(a, b)检查a是否在b中,assertIsNone(x)验证x是否为None等。用户需要这些断言方法来验证各种条件。 还有一些其他方法,比如skip装饰器,用来跳过某些测试。例如@unittest.skip("原因")可以跳过测试方法。还有测试发现相关的方法,但用户可能更关注基本的断言和生命周期方法。 用户可能的深层需求是希望有一个清晰的列表,方便查阅各种方法的使用场景,或者在学习过程中需要快速参考。他们可能在实际编写测试时遇到了问题,比如不知道如何验证异常,或者如何跳过测试,所以需要具体的断言方法说明。 我需要将这些方法分门别类,用简单的中文解释每个方法的作用,并给出示例,帮助用户理解。同时,结构要清晰,方便用户快速找到所需的信息。可能还需要提到一些常用的装饰器或高级功能,但重点放在基础方法上,避免信息过载。 最后,确保回答准确,符合Python官方文档对unittest的描述,避免错误。如果有不确定的地方,可能需要查阅文档确认,比如关于assertRaises的用法是否正确,或者生命周期方法执行顺序。</think>`unittest` 是 Python 的标准单元测试框架,提供了一系列方法用于编写和运行测试。以下是核心方法分类及说明: --- ### **一、测试用例生命周期方法** 1. **`setUp()`** 在每个测试方法执行**前**调用,用于初始化测试环境(如创建对象、连接数据库等)。 2. **`tearDown()`** 在每个测试方法执行**后**调用,用于清理资源(如关闭文件、断开网络等)。 3. **`setUpClass()`** 使用 `@classmethod` 装饰器,在整个测试类执行**前**调用一次(需配合 `classmethod`)。 4. **`tearDownClass()`** 使用 `@classmethod` 装饰器,在整个测试类执行**后**调用一次。 --- ### **二、测试方法** 测试方法需以 `test_` 开头,例如: ```python def test_add(self): self.assertEqual(1 + 1, 2) ``` --- ### **三、常用断言方法** | 方法 | 用途 | 示例 | |------|------|------| | **`assertEqual(a, b)`** | 验证 `a == b` | `self.assertEqual(3, 1+2)` | | **`assertTrue(x)`** | 验证 `x` 为 `True` | `self.assertTrue(isinstance(5, int))` | | **`assertFalse(x)`** | 验证 `x` 为 `False` | `self.assertFalse(10 < 5)` | | **`assertRaises(Error, func, *args)`** | 验证函数调用抛出指定异常 | `self.assertRaises(ValueError, int, 'abc')` | | **`assertIn(a, b)`** | 验证 `a` 在 `b` 中 | `self.assertIn('a', ['a', 'b'])` | | **`assertIsNone(x)`** | 验证 `x` 是 `None` | `self.assertIsNone(None)` | | **`assertAlmostEqual(a, b, places=7)`** | 验证浮点数近似相等 | `self.assertAlmostEqual(0.1 + 0.2, 0.3, places=5)` | --- ### **四、其他功能方法** 1. **跳过测试** - `@unittest.skip("原因")`:强制跳过当前测试。 - `@unittest.skipIf(条件, "原因")`:根据条件跳过测试。 ```python @unittest.skipIf(sys.platform != 'win32', "仅限 Windows 运行") def test_windows_feature(self): pass ``` 2. **测试套件** - `unittest.TestLoader().loadTestsFromModule(模块)`:加载模块中的所有测试用例。 - `unittest.TestSuite()`:手动组合多个测试用例。 --- ### **五、运行测试** 1. **命令行运行** ```bash python -m unittest test_module.py # 运行单个模块 python -m unittest discover # 自动发现并运行所有测试 ``` 2. **代码中运行** ```python if __name__ == '__main__': unittest.main() ``` --- ### **示例代码** ```python import unittest class TestMath(unittest.TestCase): @classmethod def setUpClass(cls): print("=== 测试类开始 ===") def setUp(self): print("--- 单个测试开始 ---") def test_add(self): self.assertEqual(1 + 1, 2) def test_divide(self): self.assertRaises(ZeroDivisionError, lambda: 1 / 0) def tearDown(self): print("--- 单个测试结束 ---") @classmethod def tearDownClass(cls): print("=== 测试类结束 ===") if __name__ == '__main__': unittest.main() ``` --- 通过上述方法,可以高效地编写结构化、可维护的单元测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值