如何使用pytest进行Python单元测试

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的基本用法,并且通过不断练习提高自己的单元测试能力。

后端开发标签