安装和入门

** Python ** :python 3.5、3.6、3.7、pypypy3

平台 :Linux和Windows

PYPI包名称pytest

PDF文档download latest

pytest 是一个使构建简单和可伸缩的测试变得容易的框架。测试具有表达性和可读性,不需要样板代码。几分钟后就可以开始对应用程序或库进行小的单元测试或复杂的功能测试。

安装 pytest

  1. 在命令行中运行以下命令:

pip install -U pytest
  1. 检查是否安装了正确的版本:

$ pytest --version
This is pytest version 5.x.y, imported from $PYTHON_PREFIX/lib/python3.6/site-packages/pytest.py

创建第一个测试

用四行代码创建一个简单的测试函数:

# 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-5.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:5: AssertionError
========================= 1 failed in 0.12 seconds =========================

此测试返回失败报告,因为 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.12 seconds

将一个类中的多个测试分组

一旦开发了多个测试,您可能希望将它们分组到一个类中。pytest使创建包含多个测试的类变得容易:

# content of test_class.py
class TestClass(object):
    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_ 带前缀的函数。不需要对任何内容进行子类化。我们只需通过传递模块的文件名来运行它:

$ 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
1 failed, 1 passed in 0.12 seconds

第一次测试通过,第二次失败。您可以很容易地看到断言中的中间值,以帮助您理解失败的原因。

请求功能测试的唯一临时目录

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
1 failed in 0.12 seconds

有关TMPDIR处理的更多信息,请访问 Temporary directories and files .

找出什么样的内置 pytest fixtures 使用以下命令存在:

pytest --fixtures   # shows builtin and custom fixtures

注意,这个命令省略了前导的fixtures _ 除非 -v 选项已添加。

继续阅读

查看其他Pytest资源以帮助您为独特的工作流自定义测试: