1. 什么是pytest
在开始讲解如何使用pytest进行Python单元测试之前,我们先来了解一下什么是pytest。pytest是一个基于Python语言的单元测试框架,它可以帮助我们更方便地编写和执行测试代码,同时也提供了丰富的插件和扩展功能。pytest的特点包括:
简单易用,可以使用Python自带的assert语句编写测试用例
支持自动发现和执行测试用例,无需手动编写测试套件
具有丰富的插件和扩展机制,可以灵活地定制测试流程
2. 安装pytest
在使用pytest进行单元测试之前,我们首先需要安装pytest。可以使用pip命令进行安装:
pip install pytest
安装完成后,我们可以使用以下命令验证pytest是否安装成功:
pytest --version
如果能够正常输出pytest的版本信息,则说明安装成功。
3. 编写测试用例
在使用pytest进行单元测试时,我们需要编写测试用例。pytest可以自动发现和执行以test_或_test前缀命名的函数,因此我们只需要编写符合命名规范的函数即可。例如:
def test_add():
assert 1 + 1 == 2
def test_sub():
assert 1 - 1 == 0
上面的代码定义了两个测试用例,分别测试加法和减法的结果是否正确。在每个测试用例中,我们使用assert语句断言测试的结果是否符合预期。如果结果不正确,则会抛出AssertionError异常。
3.1. 断言方法
pytest提供了丰富的断言方法,用于比较结果是否符合预期。常用的断言方法包括:
assert a == b:判断a是否等于b
assert a != b:判断a是否不等于b
assert a < b:判断a是否小于b
assert a > b:判断a是否大于b
assert a <= b:判断a是否小于等于b
assert a >= b:判断a是否大于等于b
assert a in b:判断a是否在b中
assert a not in b:判断a是否不在b中
4. 执行测试用例
在编写完成测试用例后,我们可以使用pytest命令执行测试。pytest会自动发现并执行以test_或_test前缀命名的函数。可以执行以下命令:
pytest
如果所有测试用例执行通过,则会输出类似以下信息:
========================= test session starts =========================
platform darwin -- Python 3.8.8, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: /path/to/project
collected 2 items
test_demo.py .. [100%]
========================== 2 passed in 0.01s ==========================
如果有测试用例执行失败,则会输出类似以下信息:
========================= test session starts =========================
platform darwin -- Python 3.8.8, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: /path/to/project
collected 2 items
test_demo.py .F [100%]
================================== FAILURES ===================================
_______________________________ test_subtract _______________________________
def test_subtract():
> assert 2 - 1 == 1
E assert (2 - 1) == 1
test_demo.py:6: AssertionError
=========================== short test summary info ===========================
FAILED test_demo.py::test_subtract - assert (2 - 1) == 1
========================= 1 failed, 1 passed in 0.01s =========================
可以看到,失败的测试用例会输出详细的错误信息,帮助我们更快地定位问题所在。
5. 使用pytest参数
pytest提供了多个参数,可以用于设置测试用例的范围、并发执行、输出格式等。常用的参数包括:
5.1. 选择文件或目录
可以使用以下命令选择特定的文件或目录执行测试:
pytest path/to/test_file.py # 执行特定的测试文件
pytest path/to/test_directory/ # 执行特定的测试目录
5.2. 指定用例名字匹配规则
可以使用以下命令选择特定名称的测试:
pytest -k "test_subtract" # 执行名称中包含"test_subtract"的测试
pytest -k "test_add or test_sub" # 执行名称中包含"test_add"或"test_sub"的测试
5.3. 并发执行
可以使用以下命令开启并发执行多个测试用例:
pytest -n auto # 自动分配进程数执行测试
pytest -n 4 # 使用4个进程执行测试
5.4. 输出格式
可以使用以下命令设置输出格式:
pytest --junitxml=result.xml # 将测试结果输出为JUnit XML格式
pytest --cov=path/to/package # 计算测试覆盖率并输出报告
pytest --pdb # 在测试用例失败时进入调试模式
6. 使用pytest插件
pytest提供了丰富的插件系统,可以扩展pytest的功能。可以使用以下命令列出所有已安装的插件:
pytest --list-plugins
常用的插件包括:
6.1. pytest-cov
pytest-cov是一个测试覆盖率插件,可以让我们更方便地计算测试代码的覆盖率并输出报告。可以使用以下命令安装pytest-cov:
pip install pytest-cov
安装完成后,我们可以使用以下命令执行测试并生成测试覆盖率报告:
pytest --cov=path/to/package
执行完成后,pytest会自动生成覆盖率报告,显示覆盖情况。例如:
----------- coverage: platform darwin, python 3.7.0-final-0 -----------
Name Stmts Miss Cover
---------------------------------------------
path/to/package/__init__ 0 0 100%
path/to/package/module1 11 1 91%
path/to/package/module2 16 0 100%
---------------------------------------------
TOTAL 27 1 96%
6.2. pytest-html
pytest-html是一个测试报告生成插件,可以让我们更方便地生成漂亮的HTML格式测试报告。可以使用以下命令安装pytest-html:
pip install pytest-html
安装完成后,我们可以使用以下命令执行测试并生成测试报告:
pytest --html=report.html
执行完成后,pytest会自动生成HTML格式的测试报告,并保存到report.html文件中。可以通过浏览器打开此文件查看测试报告。例如:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>pytest report</title>
<link rel="stylesheet" href="_static/css/report.css" type="text/css" />
</head>
<body>
<div id="header" class="header">
<h1>pytest report</h1>
</div>
<div id="summary" class="summary">
<table class="summary" id="results">
<thead>
<tr>
<th colspan="2">Summary</th>
</tr>
</thead>
<tbody>
<tr class="row-result skip">
<td class="col-status">skipped</td>
<td class="col-name">test_skip.py::test_skip</td>
</tr>
<tr class="row-result fail">
<td class="col-status">failed</td>
<td class="col-name">test_fail.py::test_fail</td>
</tr>
<tr class="row-result pass">
<td class="col-status">passed</td>
<td class="col-name">test_pass.py::test_pass</td>
</tr>
</tbody>
</table>
</div>
<div id="details" class="details">
<table class="details" id="results">
<tbody>
<tr class="row-result skip">
<td class="col-status">skipped</td>
<td class="col-name">test_skip.py::test_skip</td>
<td class="col-longrepr"></td>
</tr>
<tr class="row-result fail">
<td class="col-status">failed</td>
<td class="col-name">test_fail.py::test_fail</td>
<td class="col-longrepr"></td>
</tr>
<tr class="row-result pass">
<td class="col-status">passed</td>
<td class="col-name">test_pass.py::test_pass</td>
<td class="col-longrepr"></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
7. 总结
本文介绍了如何使用pytest进行Python单元测试。我们首先了解了pytest的特点和安装方法,然后讲解了如何编写测试用例、执行测试用例、使用pytest参数和插件。希望读者能够掌握pytest的基本用法,并且通过不断练习提高自己的单元测试能力。