每日一模块:pytest
日常中每次需求开发完成,都要求写单元测试,以便于在上线前尽量将bug找到,Python单元测试中我使用最多的模块就是pytest, 之前也根据pytest模块封装了一个日常工具我的实用小工具-单元测试模块,感兴趣的可以去看看。
1. 简介
pytest是一个成熟、全功能的Python测试框架,它包含简单的单元测试和复杂的功能测试。pytest具有简洁易读的语法和丰富的插件系统,使得测试编写、执行和扩展都变得简单高效。
2. 安装
使用pip可以轻松安装pytest:
pip install pytest3. 基本用法
创建一个测试文件,以test_开头或者以_test结尾。在测试文件中,编写以test_开头的函数作为测试用例。运行pytest命令来执行测试。
4. 常见方法
4.1 断言方法
•assert:这是最基本的断言,如果其后面的条件为假,测试就会失败。
def test_addition():
assert 1 + 1 == 2
•pytest.approx():用于浮点数精度的处理。
def test_floating_point_addition():
assert 0.1 + 0.2 == pytest.approx(0.3)4.2 跳过测试
• 使用pytest.skip()跳过当前测试。
def test_skipped_test():
pytest.skip("Skipping this test")4.3 预期失败
• 使用pytest.xfail()标记预期失败的测试。def test_not_implemented_yet():
pytest.xfail("This feature is not implemented yet")
4.4 测试参数化4.5 设置和拆收
• 使用setup_module(),teardown_module(),setup_function(),teardown_function(),setup_method(),teardown_method(),setup_class(),teardown_class()来进行测试的设置和拆收。
def setup_module():
print("Setup for the whole module")
def teardown_module():
print("Teardown for the whole module")
def test_example():
assert True4.6 Fixtures
• Fixtures是pytest中更灵活、更强大的设置和拆收机制。
@pytest.fixture
def database():
db = Database()
yield db
db.close()
def test_example(database):
assert database.is_connected()5. 运行测试
在命令行中,使用pytest命令来运行测试。可以加上各种选项来定制测试行为,例如-v用于输出详细结果,-x在遇到第一个失败的测试时停止运行。
pytest -v test_example.py6. 插件和扩展
pytest的强大之处在于其插件系统,通过安装和使用插件,可以扩展pytest的功能,例如添加测试覆盖率报告、生成HTML测试报告等。
6.1 生成html报告
• 插件pytest-html
6.1.1 安装
pip install pytest-html6.1.2 快速使用
# terminal命令行下执行
pytest --html=report.html6.1.3 生产使用
上面命令生成的报告,css是独立的,分享报告的时候样式会丢失,为了更好的分享发邮件展示报告,可以把css样式合并到html里
pytest --html=report.html --self-contained-html6.2 生成测试代码覆盖率报告
• 插件pytest-cov
6.2.1 安装
pip install pytest-cov6.2.2 使用
# terminal命令行下执行
pytest —cov —cov-report=html
pytest 后面选择性的参数如下
• run – 运行Python脚本并测试脚本代码覆盖率。
• report – 报告脚本运行的覆盖率结果。
• html –生成html格式的代码覆盖率报告文件。
• xml – 生成xml格式的代码覆盖率报告文件。
• annotate – 用覆盖结果注释源文件。
• erase – 删除之前收集的覆盖率数据。
• combine – 将多个覆盖率文件合并成一个。
• debug – 调试模式。
Coverage.py使用多种指令实现覆盖率测量任务。可以采用--help子指令来查看指令的具体用法,
例如coverage run –help。7. pytest.ini文件
工作中一般是通过配置文件pytest.ini文件来配置单元测试相关配置的,如生成html报告,覆盖报告,下面提供一个范例。
# pytest.ini文件
[pytest]
python_files = test_*.py *_test.py
python_classes = Test*
python_functions = test_*
addopts= -vs --html=./status/report.html --capture=sys --self-contained-html --cov=../ --cov-report=html --cov-report=term-missing -p no:warnings
8. 总结
pytest是一个功能强大的Python测试框架,通过学习和掌握其常见方法,可以更加高效地编写和管理测试用例。此外,通过安装和使用插件,可以进一步扩展pytest的功能,满足各种测试需求。
领取专属 10元无门槛券
私享最新 技术干货