unittest 执行测试用例的常见方式
在 unittest 框架中,执行测试用例的方式有多种,可根据项目规模、执行需求选择合适的方式。以下是常见的执行方式及示例:
一、直接执行单个模块(最基础)
适用于测试用例写在单个 .py 文件中,直接通过脚本入口执行。
方式 1:使用 unittest.main()
在测试模块末尾添加 unittest.main(),运行脚本时自动执行所有测试用例:
# test_demo.py import unittest class TestDemo(unittest.TestCase): def test_add(self): self.assertEqual(1 + 2, 3) if __name__ == "__main__": unittest.main() # 自动发现并执行当前模块的所有测试用例 |
执行命令:
python test_demo.py |
方式 2:通过命令行指定模块
无需在脚本中写入口,直接通过 python -m unittest 命令执行模块:
python -m unittest test_demo.py # 执行 test_demo.py 中的所有用例 |
二、通过 TestSuite 手动组织用例(灵活控制)
当需要选择性执行部分用例或按特定顺序执行时,使用 TestSuite 手动组织用例。
步骤:
- 创建 TestSuite 实例。
- 通过 addTest() 或 addTests() 添加用例。
- 使用 TextTestRunner 执行套件。
示例:
# test_suite.py import unittest class TestLogin(unittest.TestCase): def test_success(self): print("登录成功") class TestPay(unittest.TestCase): def test_success(self): print("支付成功") if __name__ == "__main__": # 创建测试套件 suite = unittest.TestSuite() # 添加单个用例(格式:类名("方法名")) suite.addTest(TestLogin("test_success")) # 批量添加类中所有用例 suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestPay)) # 执行套件 runner = unittest.TextTestRunner(verbosity=2) # verbosity=2 显示详细日志 runner.run(suite) |
执行效果:可精确控制执行哪些用例,忽略不需要的用例。
三、批量发现并执行用例(适合大型项目)
当项目中有多个测试模块(如 test_login.py、test_order.py),可通过 unittest.discover() 自动发现并执行所有用例。
核心参数:
- start_dir:开始搜索的目录(通常为项目的测试目录,如 tests/)。
- pattern:匹配测试文件的模式(默认 test*.py,即文件名以 test 开头的 .py 文件)。
- top_level_dir:项目顶层目录(可选,一般与 start_dir 一致)。
示例:
假设项目结构如下:
project/ └── tests/ ├── test_login.py ├── test_order.py └── sub_tests/ └── test_pay.py |
执行方式:
方式 1:在脚本中使用 discover
# run_all.py import unittest if __name__ == "__main__": # 发现 tests 目录下所有 test*.py 中的用例 suite = unittest.defaultTestLoader.discover( start_dir="tests", pattern="test*.py", top_level_dir=None ) # 执行发现的用例 unittest.TextTestRunner(verbosity=2).run(suite) |
执行命令:
python run_all.py |
方式 2:通过命令行直接发现
无需编写脚本,直接通过命令行执行:
# 发现并执行 tests 目录下的所有用例 python -m unittest discover -s tests -p "test*.py" |
四、结合命令行参数执行(灵活筛选)
通过命令行参数可指定执行特定模块、类或方法,无需修改代码。
常用命令:
命令示例 |
说明 |
python -m unittest test_demo |
执行 test_demo.py 模块中的所有用例 |
python -m unittest test_demo.TestDemo |
执行 test_demo.py 中 TestDemo 类的所有用例 |
python -m unittest test_demo.TestDemo.test_add |
执行单个用例 test_add |
python -m unittest -v test_demo |
显示详细执行日志(-v 等价于 verbosity=2) |
python -m unittest -f test_demo |
第一个用例失败后立即停止执行(-f 即 failfast) |
五、使用第三方工具执行(扩展功能)
结合 pytest 等工具执行 unittest 用例,支持更多功能(如并行执行、生成报告)。
示例:用 pytest 执行 unittest 用例
- 安装 pytest:
pip install pytest |
- 执行命令:
pytest test_demo.py # 自动识别并执行 unittest 用例 pytest tests/ -n auto # 并行执行 tests 目录下的用例(需安装 pytest-xdist) |
六、在 IDE 中执行(可视化操作)
主流 IDE(如 PyCharm、VS Code)支持直接点击运行按钮执行 unittest 用例:
- PyCharm:在测试方法、类或模块旁点击绿色运行箭头,选择执行方式(如 “Run 'TestDemo'”)。
- VS Code:安装 Python 插件后,测试文件中会出现运行按钮,或通过 “测试” 面板批量执行。
七、总结:不同场景的选择建议
场景需求 |
推荐执行方式 |
单个模块快速测试 |
unittest.main() 或命令行执行模块 |
选择性执行用例或控制顺序 |
TestSuite 手动组织 |
大型项目批量执行所有用例 |
unittest.discover() 或 IDE 批量执行 |
需要详细日志或失败立即停止 |
命令行加 -v 或 -f 参数 |
扩展功能(并行、报告) |
结合 pytest 等第三方工具 |
通过以上方式,可满足从简单脚本到大型项目的各种测试执行需求。实际使用中,建议结合项目结构和团队习惯选择最合适的方式。如果需要某类方式的进阶用法(如生成 HTML 报告),可以补充需求进一步说明~