安装和入门¶
** Python ** :Python 3.6,3.7,3.8,3.9,PyPy3
平台 :Linux和Windows
PYPI包名称 : pytest
PDF文档 : download latest
pytest
是一个使构建简单和可伸缩的测试变得容易的框架。测试具有表达性和可读性,不需要样板代码。几分钟后就可以开始对应用程序或库进行小的单元测试或复杂的功能测试。
创建第一个测试¶
用四行代码创建一个简单的测试函数:
# content of test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
就是这样。现在可以执行测试功能:
$ pytest
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-6.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR
collected 1 item
test_sample.py F [100%]
================================= FAILURES =================================
_______________________________ test_answer ________________________________
def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + where 4 = func(3)
test_sample.py:6: AssertionError
========================= short test summary info ==========================
FAILED test_sample.py::test_answer - assert 4 == 5
============================ 1 failed in 0.12s =============================
这个 [100%]
指运行所有测试用例的总体进度。完成后,pytest会显示一个失败报告,因为 func(3)
不返 5
.
注解
你可以使用 assert
验证测试期望的声明。皮特试验 Advanced assertion introspection 将智能地报告断言表达式的中间值,以便避免使用多个名称 of JUnit legacy methods .
运行多个测试¶
pytest
将运行窗体测试的所有文件_ *.py or * _当前目录及其子目录中的test.py。一般来说,它是 standard test discovery rules .
断言引发了某个异常¶
使用 raises 助手来断言某些代码引发异常:
# content of test_sysexit.py
import pytest
def f():
raise SystemExit(1)
def test_mytest():
with pytest.raises(SystemExit):
f()
以“安静”报告模式执行测试功能:
$ pytest -q test_sysexit.py
. [100%]
1 passed in 0.12s
注解
这个 -q/--quiet
flag在本例和下面的示例中保持输出简短。
将一个类中的多个测试分组¶
一旦开发了多个测试,您可能需要将它们分组到一个类中。pytest使创建包含多个测试的类变得很容易:
# content of test_class.py
class TestClass:
def test_one(self):
x = "this"
assert "h" in x
def test_two(self):
x = "hello"
assert hasattr(x, "check")
pytest
发现以下所有测试 Conventions for Python test discovery ,所以它发现 test_
前缀函数。没有必要对任何东西进行子类化,但是要确保在类前面加上 Test
否则将跳过该类。我们只需传递其文件名即可运行该模块:
$ pytest -q test_class.py
.F [100%]
================================= FAILURES =================================
____________________________ TestClass.test_two ____________________________
self = <test_class.TestClass object at 0xdeadbeef>
def test_two(self):
x = "hello"
> assert hasattr(x, "check")
E AssertionError: assert False
E + where False = hasattr('hello', 'check')
test_class.py:8: AssertionError
========================= short test summary info ==========================
FAILED test_class.py::TestClass::test_two - AssertionError: assert False
1 failed, 1 passed in 0.12s
第一次测试通过,第二次失败。您可以很容易地看到断言中的中间值,以帮助您理解失败的原因。
将测试分组在类中是有益的,原因如下:
试验机构
仅在该特定类中共享测试夹具
在类级别应用标记并将其隐式应用于所有测试
在类中对测试分组时需要注意的是,每个测试都有一个唯一的类实例。让每个测试共享同一个类实例将非常不利于测试隔离,并且会导致不良的测试实践。概述如下:
# content of test_class_demo.py
class TestClassDemoInstance:
def test_one(self):
assert 0
def test_two(self):
assert 0
$ pytest -k TestClassDemoInstance -q
FF [100%]
================================= FAILURES =================================
______________________ TestClassDemoInstance.test_one ______________________
self = <test_class_demo.TestClassDemoInstance object at 0xdeadbeef>
def test_one(self):
> assert 0
E assert 0
test_class_demo.py:3: AssertionError
______________________ TestClassDemoInstance.test_two ______________________
self = <test_class_demo.TestClassDemoInstance object at 0xdeadbeef>
def test_two(self):
> assert 0
E assert 0
test_class_demo.py:6: AssertionError
========================= short test summary info ==========================
FAILED test_class_demo.py::TestClassDemoInstance::test_one - assert 0
FAILED test_class_demo.py::TestClassDemoInstance::test_two - assert 0
2 failed in 0.12s
请求功能测试的唯一临时目录¶
pytest
提供 Builtin fixtures/function arguments 要请求任意资源,例如唯一的临时目录,请执行以下操作:
# content of test_tmpdir.py
def test_needsfiles(tmpdir):
print(tmpdir)
assert 0
列出名字 tmpdir
在测试函数签名和 pytest
将在执行测试函数调用之前查找并调用fixture工厂以创建资源。在测试运行之前, pytest
创建唯一的每个测试调用临时目录:
$ pytest -q test_tmpdir.py
F [100%]
================================= FAILURES =================================
_____________________________ test_needsfiles ______________________________
tmpdir = local('PYTEST_TMPDIR/test_needsfiles0')
def test_needsfiles(tmpdir):
print(tmpdir)
> assert 0
E assert 0
test_tmpdir.py:3: AssertionError
--------------------------- Captured stdout call ---------------------------
PYTEST_TMPDIR/test_needsfiles0
========================= short test summary info ==========================
FAILED test_tmpdir.py::test_needsfiles - assert 0
1 failed in 0.12s
有关TMPDIR处理的更多信息,请访问 Temporary directories and files .
找出什么样的内置 pytest fixtures 使用以下命令存在:
pytest --fixtures # shows builtin and custom fixtures
注意,这个命令省略了前导的fixtures _
除非 -v
选项已添加。
继续阅读¶
查看其他Pytest资源以帮助您为独特的工作流自定义测试:
“ 通过调用pytest python -m pytest”,用于命令行调用示例
“ 在现有测试套件中使用pytest”,用于处理预先存在的测试
“ 用属性标记测试函数”以获取有关
pytest.mark
机制“ Pytest夹具:显式、模块化、可扩展”,用于为测试提供功能基线
“ :ref:'plugins`'用于管理和写入插件”
“ :ref:'goodpractices`'用于virtualenv和测试布局”