我最爱的测试框架:详解PyTest

Python中有许多测试框架,但其中最受欢迎的就是PyTest。PyTest是一个强大而灵活的测试框架,它提供了许多先进的功能,可以让你的测试更加简洁、易读。

一、PyTest 简介

PyTest是一个开源的Python测试框架,用于编写简单而丰富的测试套件。它的功能特性包括:参数化、设置/拆解函数、假对象和钩子函数等。PyTest也被设计用来支持大型的测试集合,特别是适合进行回归测试。

二、PyTest 示例

接下来,我将通过以下10个示例,详细介绍如何使用PyTest。

1. 基础测试

PyTest的测试是通过编写函数并使用assert关键字进行断言的。以下是一个简单的测试示例

  1. def test_addition():

  2. assert 1 + 1 == 2

2. 测试异常

如果你希望一个特定的异常被抛出,可以使用pytest.raises上下文管理器:

  1. def test_addition():

  2. assert 1 + 1 == 2

3. 参数化测试

如果你有多组输入和期望的输出,可以使用pytest.mark.parametrize装饰器:


import pytest


@pytest.mark.parametrize("a,b,expected", [(1, 2, 3), (4, 5, 9), (7, 8, 15)])

def test_addition(a, b, expected):

assert a + b == expected

4. 使用setup和teardown

对于需要前置和后置操作的测试,你可以使用setup和teardown函数:


def setup_function(function):

if function == test_needs_resource_a:

setup_resource_a()


def teardown_function(function):

if function == test_needs_resource_a:

teardown_resource_a()


def test_needs_resource_a():

assert use_resource_a()

5. 使用fixtures

PyTest的fixtures功能允许你定义一些设置代码,这些代码可以被多个测试函数重用:


import pytest


@pytest.fixture

def resource_a():

setup_resource_a()

yield use_resource_a()

teardown_resource_a()


def test_needs_resource_a(resource_a):

assert resource_a

6. 使用mocks

你可以使用PyTest的unittest.mock模块创建假的对象,模拟函数或对象的行为:


from unittest.mock import MagicMock


def test_with_mock():

my_mock = MagicMock(return_value=3)

assert my_mock(1, 2, 3) == 3

my_mock.assert_called_once_with(1, 2, 3)

7. 测试私有函数

虽然一般来说我们应该避免测试私有函数,但有时这也是有用的:


def test__private_function():

from my_module import _private_function

assert _private_function(1, 2) == 3

在这个示例中,我们测试了一个名为_private_function的私有函数。这个函数接受两个参数并返回它们的和。我们使用了assert语句来确认返回的结果是否与预期的结果相符。注意,这个例子仅作为示例,实际上我们应尽量避免对私有函数进行单独测试,因为它们的实现可能会随着时间而改变。在大多数情况下,我们应该专注于测试公共接口,这样可以保证即使实现细节发生改变,测试仍然有效。

8. 跳过某些测试

如果有些测试你不希望执行,你可以使用pytest.mark.skippytest.mark.skipif来跳过这些测试:


import pytest


@pytest.mark.skip(reason="This test is currently being debugged.")

def test_in_debugging():

assert 1 + 1 == 2

9. 使用pytest的命令行参数

PyTest提供了许多命令行参数,可以帮助你更有效地运行测试。例如,你可以使用-k参数来运行名称匹配某个模式的测试:

pytest -k "addition"

10. 分组测试

你可以使用pytest.mark来给你的测试分组:


import pytest


@pytest.mark.slow

def test_slow_function():

# This is a slow test...

pass


@pytest.mark.fast

def test_fast_function():

# This is a fast test...

pass

然后你可以只运行某个分组的测试:

pytest -m slow

11. 使用assert进行多种条件检查

PyTest的assert可以被用来进行多种条件检查。例如,我们可以使用assert来检查是否一个值在一个列表中:


def test_in_list():

assert 1 in [1, 2, 3]

12. 使用xfail标记预期失败的测试

如果你知道某个测试目前不能通过,但你仍然希望执行它并记录结果,可以使用pytest.mark.xfail


import pytest


@pytest.mark.xfail(reason="This test is expected to fail.")

def test_failing():

assert 1 == 2

13. 使用capsysfixture捕获标准输出

如果你的函数会打印到标准输出,你可以使用capsysfixture来捕获这些输出,然后在你的测试中进行检查:


def test_print_output(capsys):

print("Hello")

captured = capsys.readouterr()

assert captured.out == "Hello\n"

14. 使用tmp_pathfixture创建临时文件

如果你的测试需要创建临时文件,你可以使用tmp_pathfixture:


def test_create_file(tmp_path):

d = tmp_path / "sub"

d.mkdir()

p = d / "hello.txt"

p.write_text("Hello, World!")

assert p.read_text() == "Hello, World!"

15. 与doctest结合

如果你的函数或者模块包含doctest,PyTest可以直接运行这些doctest:​​​​​​​


def add(a, b):

"""

This function adds two numbers.


>>> add(1, 2)

3

"""

return a + b
然后你可以使用pytest --doctest-modules命令来运行这些doctest。

三、结论

以上就是PyTest的一些基本功能和示例。总的来说,PyTest是一个非常强大的测试框架,无论你是在编写简单的单元测试,还是复杂的集成测试,都可以使用PyTest来简化你的工作。通过学习和掌握PyTest,你将能够更有效地编写和维护你的测试代码。

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值