Python+unittest:执行测试用例~discover函数介绍

本文详细介绍了如何使用Python的unittest库来查找并运行指定目录下的所有测试模块,特别关注于匹配以'test'开头的.py文件。通过示例代码展示了如何设置测试目录,使用discover方法加载测试用例,并最终执行测试。

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

discover(start_dir,pattern=‘test*.py’,top_level_dir=None)
找到指定目录下所有测试模块,并可递归查到子目录下的测试木块,只有匹配到的文件名才会被加载。如果启动的不是顶层目录,那么顶层目录必然单独指定。

start_dir:要测试的模块名或测试用例的目录。
pattent=‘test*.py’:表示用例文件名的匹配原则。此处匹配文件名一test开头的所有.py类型文件,*表示任意多个字符。
top_level_dir=None :测试模块的顶层目录,如果没有顶层目录,默认为None。

import unittest
#定义测试用例的目录为当前目录
test_dir=’./’

discover=unittest.defaultTestLoader.discover(test_dir,pattern=“test*.py”)
if name == ‘main’:
runer=unittest.TextTestRunner()
runer.run(discover)

备注:test_dir=刚开始不懂问别人说的是填写当前目录地址为test_dir=’./test_case’,一直提示错误,最后改为test_dir=’./'才执行对
在这里插入图片描述

<think>嗯,用户想了解如何在Python中使用unittest编写测试用例。首先,我需要回忆一下unittest的基本结构和常用方法。记得unittest是基于xUnit框架的,所以有TestCase类,测试方法要以test_开头,断言方法比如assertEqual、assertTrue这些。然后,可能需要提到如何组织测试用例,比如创建测试类继承unittest.TestCase,每个测试方法对应一个功能点。 接下来,用户可能想知道具体的步骤,比如如何导入模块,如何运行测试。记得setUp和tearDown方法,用于测试前的准备和测试后的清理,这部分也应该包含进去。还有,用户可能会关心如何分组测试,使用TestLoader或者TestSuite,不过对于初学者来说,可能先讲基本用法更合适。 然后,想到用户可能需要示例代码,这样更直观。比如写一个简单的测试用例,比如测试一个加法函数。然后展示如何运行测试,使用unittest.main()或者在命令行执行。还要提到常用的断言方法,列出几个常见的,比如assertEqual、assertTrue、assertRaises等。 另外,用户可能不知道测试用例的结构,所以需要分步骤说明:导入unittest、创建测试类、编写测试方法、使用断言。可能还需要解释为什么测试方法要以test_开头,因为unittest默认会检测这些方法。 还有,关于setUp和tearDown,可以举例说明,比如数据库连接的建立和关闭。这部分对资源管理很重要,用户可能会遇到需要重复初始化的场景。 最后,可能需要提到一些高级用法,比如跳过测试、预期失败,或者参数化测试,但可能作为扩展内容,先满足用户的基本需求。然后根据引用内容,用户提供的引用里有提到创建测试用例文件,使用assertEqual,还有运行测试的方法,这些都需要整合到回答中。 总结一下,回答的结构应该是先介绍unittest的基本概念,然后分步骤讲解如何编写测试用例,包括测试类、测试方法、断言,接着是setUp和tearDown的作用,最后展示示例代码和运行方式。同时,要确保代码格式正确,使用中文解释清楚每个部分的作用,并可能生成相关问题,比如如何组织多个测试用例,如何测试异常情况等。</think>### 如何在 Python 中使用 unittest 编写测试用例 #### 一、unittest 核心概念 1. **测试用例(TestCase)**:每个测试用例对应一个独立的测试场景,继承自`unittest.TestCase` 2. **断言方法**:用于验证代码行为是否符合预期,如`assertEqual(a, b)`、`assertTrue(x)` 3. **测试套件(TestSuite)**:用于组织多个测试用例的集合 4. **测试运行器(TestRunner)**:执行测试并输出结果 #### 二、编写测试用例的步骤 1. **导入模块** ```python import unittest from mymodule import add, multiply # 被测函数 ``` 2. **创建测试类** ```python class TestMathOperations(unittest.TestCase): def setUp(self): """每个测试方法执行前的初始化操作""" self.test_data = [(2, 3), (0, 0), (-1, 5)] def test_add(self): """测试加法函数""" for a, b in self.test_data: self.assertEqual(add(a, b), a + b) def test_multiply_edge_case(self): """测试乘法边界条件""" self.assertEqual(multiply(0, 5), 0) self.assertEqual(multiply(-3, -4), 12) ``` 3. **添加断言示例** ```python def test_type_check(self): with self.assertRaises(TypeError): # 验证异常抛出 add("2", 3) self.assertIsInstance(multiply(2.5, 3), float) # 类型检查 ``` 4. **运行测试** ```python if __name__ == '__main__': unittest.main() ``` #### 三、关键特性详解 1. **setUp/tearDown 生命周期**: - `setUp()`:每个测试方法执行前调用(适合初始化资源) - `tearDown()`:每个测试方法执行后调用(适合清理资源) - `setUpClass()`/`tearDownClass()`:整个测试类的初始化和清理 2. **跳过测试** ```python @unittest.skip("待实现") def test_divide(self): self.assertEqual(divide(6, 3), 2) ``` 3. **参数化测试**(需安装`parameterized`包) ```python from parameterized import parameterized class TestParameterized(unittest.TestCase): @parameterized.expand([ (1, 2, 3), (4, 5, 9) ]) def test_add(self, a, b, expected): self.assertEqual(add(a, b), expected) ``` #### 四、最佳实践 1. **测试命名规范**: - 测试类名:`Test[被测模块名]` - 测试方法名:`test_[被测方法]_[场景描述]` 2. **测试隔离**:每个测试方法应独立运行,不依赖其他测试结果 3. **测试覆盖率**:建议结合`coverage.py`确保关键路径覆盖[^3] #### 五、执行测试的多种方式 1. 命令行执行: ```bash # 执行单个模块 python -m unittest test_module.py # 发现并执行所有测试 python -m unittest discover -s tests -p "test_*.py" ``` 2. 生成HTML报告(需安装`html-testRunner`): ```python with open('report.html', 'wb') as f: runner = HTMLTestRunner(stream=f, title='测试报告') runner.run(test_suite) ``` ```python # 示例被测函数(calculator.py) def add(a, b): return a + b def multiply(a, b): return a * b ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值