Pytest 是一个非常流行的 Python 测试框架,它简单易用,功能强大。Pytest 能够帮助你编写简单而可扩展的测试代码,让你的项目更加健壮和可靠。
一、Pytest 简介
Pytest 是由德国软件工程师 Holger Krekel 开发的一个 Python 测试框架。它支持简单的单元测试和复杂的功能测试,具有易于上手、强大的功能、灵活的配置等特点,已经成为 Python 社区中最流行的测试框架之一。
二、安装 Pytest
要使用 Pytest,首先需要安装它。你可以使用 pip 来安装 Pytest:
pip install pytest
如果你使用的是 Python 3,并且系统中同时存在 Python 2 和 Python 3,可能需要使用 pip3
来代替 pip
。
三、Pytest 的基本使用方法
1. 编写测试用例
Pytest 使用测试文件来组织测试用例。测试文件通常以 test_
开头,或者以 _test
结尾。测试函数也应该以 test
开头。下面是一个简单的测试用例的例子:
# 文件名:test_example.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 4
在这个例子中,我们定义了一个函数 func
,它接受一个参数 x
并返回 x + 1
。然后我们定义了一个测试函数 test_answer
,它调用 func
函数并使用 assert
来断言 func(3)
应该返回 4。
2. 运行测试用例
在命令行中,你可以使用 pytest
命令来运行测试用例。如果你在当前目录下运行 pytest
,它会自动发现并运行所有的测试用例:
pytest
你也可以指定要运行的测试文件或测试函数:
pytest test_example.py
pytest test_example.py::test_answer
3. 使用断言
在 Pytest 中,你可以使用 assert
来进行断言。如果 assert
后面的条件为真,测试会继续执行;如果条件为假,Pytest 会抛出一个 AssertionError
。 除了 assert
,Pytest 还提供了一些其他的断言方法,例如 assertEqual
、assertTrue
、assertFalse
等,这些方法可以让你编写更清晰、更可读的测试代码。
4. 测试类
Pytest 也支持使用类来组织测试用例。每个类的名称应该以 Test
开头,每个测试方法也应该以 test
开头。下面是一个使用类来组织测试用例的例子:
# 文件名:test_class_example.py
class TestClass:
def test_one(self):
x = "this"
assert 'h' in x
def test_two(self):
x = "hello"
assert hasattr(x, 'check')
在这个例子中,我们定义了一个名为 TestClass
的测试类,它包含两个测试方法:test_one
和 test_two
。这些测试方法都使用 assert
来进行断言。
5. 参数化测试
Pytest 提供了一种参数化测试的功能,让你可以使用不同的参数多次运行同一个测试函数。你可以使用 @pytest.mark.parametrize
装饰器来实现参数化测试。 下面是一个参数化测试的例子:
# 文件名:test_parametrize_example.py
import pytest
@pytest.mark.parametrize("test_input,expected", [
("3+5", 8),
("2+4", 6),
("6*9", 42),
])
def test_eval(test_input, expected):
assert eval(test_input) == expected
在这个例子中,我们定义了一个名为 test_eval
的测试函数,它接受两个参数:test_input
和 expected
。我们使用 @pytest.mark.parametrize
装饰器来指定要使用的参数。Pytest 会使用这些参数多次运行 test_eval
函数。
四、Pytest 的常用接口
1. Fixtures
Fixtures 是 Pytest 中一个非常重要的特性,它可以让你定义一个测试环境,然后在多个测试用例中使用这个环境。你可以在测试文件中定义一个 fixture,然后在其他测试文件中导入并使用它。 下面是一个定义和使用 fixture 的例子: 抱歉,上一条回答被意外截断了。让我们继续讨论 Pytest 的常用接口,包括 fixtures 的使用。
# 文件名:test_fixture_example.py
import pytest
@pytest.fixture
def supply_AA_BB_CC():
aa = 25
bb = 35
cc = 45
return [aa, bb, cc]
def test_compare_with_AA(supply_AA_BB_CC):
zz = 35
assert supply_AA_BB_CC[0] == zz
def test_compare_with_BB(supply_AA_BB_CC):
zz = 35
assert supply_AA_BB_CC[1] == zz
def test_compare_with_CC(supply_AA_BB_CC):
zz = 35
assert supply_AA_BB_CC[2] == zz
在这个例子中,我们定义了一个名为 supply_AA_BB_CC
的 fixture,它返回一个包含三个数值的列表。然后我们在三个测试函数中使用这个 fixture,分别与不同的值进行比较。
2. Markers
Markers 是 Pytest 中用于标记测试用例的一种机制。你可以定义自己的 markers,并在测试用例中应用它们。Markers 可以用于分类、过滤或执行特定的测试用例。 下面是一个定义和使用 marker 的例子:
# 文件名:test_marker_example.py
import pytest
@pytest.mark.skip(reason="skipping this test for now")
def test_function():
pass
@pytest.mark.parametrize("test_input,expected", [
("3+5", 8),
("2+4", 6),
("6*9", 42),
])
def test_eval(test_input, expected):
assert eval(test_input) == expected
在这个例子中,我们使用 @pytest.mark.skip
装饰器来跳过 test_function
测试。我们还使用 @pytest.mark.parametrize
装饰器来参数化 test_eval
测试。
3. Plugins
Pytest 支持插件,这意味着你可以扩展 Pytest 的功能。有很多第三方插件可以添加到 Pytest 中,例如用于并行测试、测试覆盖率报告、测试结果图形化等。 要使用插件,你需要安装它们,然后在 Pytest 命令中指定它们。例如,要使用 pytest-xdist
插件来进行并行测试,你需要先安装它:
pip install pytest-xdist
然后你可以在运行测试时指定这个插件:
pytest -n NUM # NUM 是并行测试的并发数
五、异常报错
当你的测试用例失败时,Pytest 会报告一个异常。最常见的异常是 AssertionError
,它发生在 assert
语句失败时。Pytest 还会报告其他类型的异常,例如 KeyError
、IndexError
等,这些通常发生在你的代码中有错误时。 你可以使用 try
和 except
语句来捕获和处理这些异常,以便在测试用例中执行特定的操作。例如:
def test_exception():
try:
1 / 0
except ZeroDivisionError:
assert True
在这个例子中,我们尝试执行一个除以零的操作,期望捕获 ZeroDivisionError
异常,并断言测试为真。
六、Pytest 的官网
Pytest 的官方网站提供了大量的文档和资源,帮助你更好地了解和使用 Pytest。你可以访问官网来查找更多信息:
https://docs.pytest.org/en/stable/
在官网上,你可以找到安装指南、快速入门、高级功能、插件列表等。
七、总结
Pytest 是一个功能强大、灵活且易于使用的 Python 测试框架。它提供了丰富的接口和插件,可以帮助你编写高效、可靠的测试代码。无论你是单元测试的新手还是有经验的开发者,Pytest 都是一个值得尝试的工具。通过这篇文章,你应该对 Pytest 的基本用法有了深入的了解,可以开始在你的项目中使用它了。