匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

【Python 代码测试】如何用 Pytest 进行 Python 代码测试?

【Python 代码测试】如何用 Pytest 进行 Python 代码测试?

在开发 Python 代码时,测试是不可或缺的一部分,因为测试可以帮助我们在开发过程中及时发现和修复错误,确保代码的质量和可靠性。而在 Python 中,有很多测试框架可供选择,其中最为常用的就是 pytest。

本文将为大家介绍如何使用 pytest 进行 Python 代码测试,涵盖 pytest 的基础知识、使用方法和一些实用技巧。

一、Pytest 的基础知识

1. Pytest 是一个 Python 的测试框架,它可以支持基于函数、类和模块的测试,同时也支持参数化测试、测试报告生成等功能。

2. Pytest 遵循一些约定来发现和运行测试。比如,测试文件和测试函数都必须以 test 开头,测试类必须以 Test 开头,并且测试函数可以使用 assert 语句进行断言。

3. Pytest 的安装非常简单,可以使用 pip 命令进行安装。例如,在 Windows 平台下,可以使用以下命令安装 pytest:

```
pip install pytest
```

二、Pytest 的使用

1. 编写测试函数

首先,我们需要编写测试函数来测试我们的代码是否正确。在编写测试函数时,我们需要遵循 pytest 的约定来命名测试函数,并使用 assert 语句进行断言。

比如,我们有一个名为 my_sum() 的函数,它可以计算两个数的和。我们现在需要编写一个测试函数来测试该函数是否正确:

```python
# test_my_sum.py

def test_my_sum():
    assert my_sum(1, 2) == 3
```

在上面的代码中,我们定义了一个名为 test_my_sum() 的测试函数,并使用 assert 语句来断言 my_sum(1, 2) 的结果是否等于 3。

2. 运行测试

在编写了测试函数后,我们就可以使用 pytest 来运行测试了。

在命令行中进入测试文件所在的目录,然后运行以下命令:

```
pytest
```

这将会自动发现以“test_”开头的测试文件和测试函数,并运行它们。如果所有测试都通过,将会输出以下信息:

```
============================= test session starts =============================
platform win32 -- Python 3.8.5, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: D:\projects\pytest-demo
collected 1 item

test_my_sum.py .                                                     [100%]

============================== 1 passed in 0.06s ==============================
```

可以看到,我们的测试已经通过了!

3. 参数化测试

有时候我们需要测试一个函数在不同输入下的行为,这时候就可以使用 pytest 的参数化测试功能。参数化测试可以让我们轻松地对一个函数进行多组参数的测试。

使用 @pytest.mark.parametrize 装饰器来实现参数化测试。比如,我们有一个名为 calc() 的函数,它可以对两个数进行加、减、乘、除的计算。我们可以对该函数进行参数化测试,如下所示:

```python
# test_calc.py

import pytest
from calc import calc

@pytest.mark.parametrize('a, b, op, result', [
    (1, 2, '+', 3),
    (3, 4, '-', -1),
    (2, 5, '*', 10),
    (10, 2, '/', 5)
])
def test_calc(a, b, op, result):
    assert calc(a, b, op) == result
```

在上面的代码中,我们使用了 @pytest.mark.parametrize 装饰器,对 test_calc() 函数进行了参数化测试。这里我们定义了四组参数,分别对应加、减、乘、除四种运算,以及对应的结果。

4. 测试报告生成

在进行测试后,我们可能需要生成测试报告来查看测试的结果。Pytest 提供了一些插件可以用来生成测试报告,例如 pytest-html 插件可以生成 HTML 格式的测试报告。

要使用 pytest-html 插件,需要先安装 pytest-html:

```
pip install pytest-html
```

然后在运行测试时加上 --html 参数,如下所示:

```
pytest --html=report.html
```

这将会生成一个名为 report.html 的测试报告文件。

三、Pytest 的实用技巧

1. 使用 fixtures

在进行测试时,我们可能需要一些共享的数据或者对象,这时候可以使用 fixtures。pytest 中的 fixture 是一种函数,它可以为测试函数提供一些必要的数据或者对象。

比如,我们有一个需要连接数据库进行测试的函数,我们可以通过一个 fixture 来创建数据库连接,并在测试函数中使用该连接:

```python
@pytest.fixture
def db():
    conn = create_db_connection()
    yield conn
    conn.close()

def test_database(db):
    # 使用 db 进行测试
    pass
```

在上面的代码中,我们定义了一个名为 db 的 fixture,它创建了一个数据库连接,并在测试函数中使用该连接。在测试结束后,fixture 会自动关闭数据库连接。

2. 使用 mark

在 pytest 中,我们可以使用 mark 来为测试函数打上标记。标记可以用来区分不同的测试场景,也可以用来控制测试的行为。

比如,我们可以使用 @pytest.mark.skipif 标记来跳过某些测试:

```python
@pytest.mark.skipif(sys.platform == 'win32', reason='does not run on windows')
def test_unix_only_function():
    assert unix_only_function() == expected_result
```

在上面的代码中,我们定义了一个名为 test_unix_only_function() 的测试函数,并使用 @pytest.mark.skipif 标记来跳过在 Windows 平台下的运行。

3. 使用 monkeypatch

在进行测试时,我们可能需要模拟一些模块的行为,这时候可以使用 monkeypatch 来修改模块的行为。

比如,我们有一个函数,它会调用 requests.get() 函数来获取某个 URL 的内容。在测试时,我们可以使用 monkeypatch 来模拟 requests.get() 函数的返回值:

```python
def test_get_url(monkeypatch):
    def mock_get(url):
        return 'mock response'

    monkeypatch.setattr(requests, 'get', mock_get)
    assert get_url(url) == 'mock response'
```

在上面的代码中,我们使用了 monkeypatch.setattr() 方法来将 requests.get() 函数替换为 mock_get() 函数,从而模拟 requests.get() 函数的行为。

总结

本文介绍了如何使用 pytest 进行 Python 代码测试,包括 pytest 的基础知识、使用方法和一些实用技巧。使用 pytest 可以让我们轻松地进行 Python 代码测试,提高代码的质量和可靠性。