pytest中文使用文档----1、安装和入门

pytest是一个能够简化测试系统构建、方便测试规模扩展的框架,它让测试变得更具表现力和可读性–模版代码不再是必需的。

只需要几分钟的时间,就可以对你的应用开始一个简单的单元测试或者复杂的功能测试。

1. 安装

  • 命令行执行如下命令:pip install pytest==5.1.3

  • 查看安装的版本信息:pytest --version

2. 创建你的第一个测试用例

它只有四行代码:

# src/chapter-1/test_sample.py

def func(x):
    return x + 1


def test_sample():
    assert func(3) == 5

通过以下命令执行测试:

λ pytest src/chapter-1/test_sample.py
============================= test session starts ============================== 
platform win32 -- Python 3.7.3, pytest-5.1.3, py-1.8.0, pluggy-0.13.0
rootdir: D:\Personal Files\Projects\pytest-chinese-doc
collected 1 item

src\chapter-1\test_sample.py F                                            [100%]

=================================== FAILURES =================================== 
_________________________________ test_sample __________________________________

    def test_sample():
>       assert func(3) == 5
E       assert 4 == 5
E        +  where 4 = func(3)

src\chapter-1\test_sample.py:28: AssertionError
============================== 1 failed in 0.05s ===============================

pytest返回一个失败的测试报告,因为func(3)不等于5

3. 执行多个测试用例

执行pytest命令,它会执行当前及其子文件夹中,所有命名符合test_*.py或者*_test.py规则的文件;

4. 触发一个指定异常的断言

使用raises可以检查代码是否抛出一个指定的异常:

# src/chapter-1/test_sysexit.py

import pytest


def f():
    # 解释器请求退出
    raise SystemExit(1)


def test_mytest():
    with pytest.raises(SystemExit):
        f()

执行这个测试用例时,加上-q选项可以查看精简版的测试报告:

λ pytest -q src/chapter-1/test_sysexit.py
.                                                                         [100%] 
1 passed in 0.01s

5. 在一个类中组织多个测试用例

pytest可以让你很容易的通过创建一个测试类来包含多个测试用例:

# src/chapter-1/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 -q src/chapter-1/test_class.py
.F                                                                        [100%] 
=================================== FAILURES =================================== 
______________________________ TestClass.test_two ______________________________

self = <test_class.TestClass object at 0x000001D364778E48>

    def test_two(self):
        x = 'hello'
>       assert hasattr(x, 'check')
E       AssertionError: assert False
E        +  where False = hasattr('hello', 'check')

src\chapter-1\test_class.py:30: AssertionError
1 failed, 1 passed in 0.05s

从输出的报告中我们可以看到:

  • test_one测试通过,用.表示;test_two测试失败,用F表示;
  • 清楚的看到,test_two失败的原因是:False = hasattr('hello', 'check')

注意:

测试类要符合特定的规则,pytest才能发现它:

  • 测试类的命令要符合Test*规则;
  • 测试类中不能有__init__()方法;

6. 申请一个唯一的临时目录

pytest提供一些内置的fixtures,可以用来请求一些系统的资源。例如,一个唯一的临时性目录:

# src/chapter-1/test_tmpdir.py

def test_needsfiles(tmpdir):
    print(tmpdir)
    assert 0

在测试用例中,以形参的方式使用内置的tempdir fixturepytest会事先创建一个目录,并将一个py.path.local对象作为实参传入;

现在,我们来执行这个测试用例:

λ pytest -q src/chapter-1/test_tmpdir.py
F                                                                         [100%] 
=================================== FAILURES =================================== 
_______________________________ test_needsfiles ________________________________

tmpdir = local('C:\\Users\\luyao\\AppData\\Local\\Temp\\pytest-of-luyao\\pytest-1\\test_needsfiles0')

    def test_needsfiles(tmpdir):
        print(tmpdir)
>       assert 0
E       assert 0

src\chapter-1\test_tmpdir.py:25: AssertionError
----------------------------- Captured stdout call ----------------------------- C:\Users\luyao\AppData\Local\Temp\pytest-of-luyao\pytest-1\test_needsfiles0
1 failed in 0.05s

可以使用如下命令查看所有可用的fixtures,如果想同时查看以_开头的fixtures,需要添加-v选项:

λ pytest -q -v --fixtures
============================= test session starts ============================== 
platform win32 -- Python 3.7.3, pytest-5.1.3, py-1.8.0, pluggy-0.13.0
rootdir: D:\Personal Files\Projects\pytest-chinese-doc
collected 5 items
cache
    Return a cache object that can persist state between testing sessions.

    cache.get(key, default)
    cache.set(key, value)

    Keys must be a ``/`` separated value, where the first part is usually the
    name of your plugin or application to avoid clashes with other cache users.

    Values can be any object handled by the json stdlib module.

capsys
    Enable text capturing of writes to ``sys.stdout`` and ``sys.stderr``.

    The captured output is made available via ``capsys.readouterr()`` method
    calls, which return a ``(out, err)`` namedtuple.
    ``out`` and ``err`` will be ``text`` objects.

capsysbinary
    Enable bytes capturing of writes to ``sys.stdout`` and ``sys.stderr``.

    The captured output is made available via ``capsysbinary.readouterr()``
    method calls, which return a ``(out, err)`` namedtuple.
    ``out`` and ``err`` will be ``bytes`` objects.

capfd
    Enable text capturing of writes to file descriptors ``1`` and ``2``.

    The captured output is made available via ``capfd.readouterr()`` method
    calls, which return a ``(out, err)`` namedtuple.
    ``out`` and ``err`` will be ``text`` objects.

capfdbinary
    Enable bytes capturing of writes to file descriptors ``1`` and ``2``.

    The captured output is made available via ``capfd.readouterr()`` method
    calls, which return a ``(out, err)`` namedtuple.
    ``out`` and ``err`` will be ``byte`` objects.

doctest_namespace [session scope]
    Fixture that returns a :py:class:`dict` that will be injected into the namespace of doctests.

pytestconfig [session scope]
    Session-scoped fixture that returns the :class:`_pytest.config.Config` object.

    Example::

        def test_foo(pytestconfig):
            if pytestconfig.getoption("verbose") > 0:
                ...

record_property
    Add an extra properties the calling test.
    User properties become part of the test report and are available to the
    configured reporters, like JUnit XML.
    The fixture is callable with ``(name, value)``, with value being automatically
    xml-encoded.

    Example::

        def test_function(record_property):
            record_property("example_key", 1)

record_xml_attribute
    Add extra xml attributes to the tag for the calling test.
    The fixture is callable with ``(name, value)``, with value being
    automatically xml-encoded

record_testsuite_property [session scope]
    Records a new ``<property>`` tag as child of the root ``<testsuite>``. This is suitable to
    writing global information regarding the entire test suite, and is compatible with ``xunit2`` JUnit family.

    This is a ``session``-scoped fixture which is called with ``(name, value)``. Example:

    .. code-block:: python

        def test_foo(record_testsuite_property):
            record_testsuite_property("ARCH", "PPC")
            record_testsuite_property("STORAGE_TYPE", "CEPH")

    ``name`` must be a string, ``value`` will be converted to a string and properly xml-escaped.

caplog
    Access and control log capturing.

    Captured logs are available through the following properties/methods::

    * caplog.text            -> string containing formatted log output
    * caplog.records         -> list of logging.LogRecord instances
    * caplog.record_tuples   -> list of (logger_name, level, message) tuples
    * caplog.clear()         -> clear captured records and formatted log output string

monkeypatch
    The returned ``monkeypatch`` fixture provides these
    helper methods to modify objects, dictionaries or os.environ::

        monkeypatch.setattr(obj, name, value, raising=True)
        monkeypatch.delattr(obj, name, raising=True)
        monkeypatch.setitem(mapping, name, value)
        monkeypatch.delitem(obj, name, raising=True)
        monkeypatch.setenv(name, value, prepend=False)
        monkeypatch.delenv(name, raising=True)
        monkeypatch.syspath_prepend(path)
        monkeypatch.chdir(path)

    All modifications will be undone after the requesting
    test function or fixture has finished. The ``raising``
    parameter determines if a KeyError or AttributeError
    will be raised if the set/deletion operation has no target.

recwarn
    Return a :class:`WarningsRecorder` instance that records all warnings emitted by test functions.

    See http://docs.python.org/library/warnings.html for information
    on warning categories.

tmpdir_factory [session scope]
    Return a :class:`_pytest.tmpdir.TempdirFactory` instance for the test session.

tmp_path_factory [session scope]
    Return a :class:`_pytest.tmpdir.TempPathFactory` instance for the test session.

tmpdir
    Return a temporary directory path object
    which is unique to each test function invocation,
    created as a sub directory of the base temporary
    directory.  The returned object is a `py.path.local`_
    path object.

    .. _`py.path.local`: https://py.readthedocs.io/en/latest/path.html

tmp_path
    Return a temporary directory path object
    which is unique to each test function invocation,
    created as a sub directory of the base temporary
    directory.  The returned object is a :class:`pathlib.Path`
    object.

    .. note::

        in python < 3.6 this is a pathlib2.Path


============================ no tests ran in 0.10s =============================
安装 `pytest` 测试框架可以通过多种方式完成,具体取决于你的操作系统开发环境。以下是几种常见的安装方法: ### 使用 pip 安装 pytest `pip` 是 Python 的包管理工具,适用于大多数操作系统(如 Windows、macOS Linux)。你可以通过以下命令安装 `pytest`: ```bash pip install pytest ``` 如果你在国内使用 `pip` 安装时遇到网络问题,可以尝试使用国内镜像源加速安装过程。例如,可以使用清华大学的镜像源: ```bash pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest ``` 如果你使用的是 Python 3,并且系统中同时安装了 Python 2 Python 3,建议使用 `pip3` 来确保安装到正确的 Python 版本环境中: ```bash pip3 install pytest ``` ### 使用 Homebrew 安装 pytest(macOS 用户) 如果你使用的是 macOS 系统,并且已经安装了 [Homebrew](https://brew.sh/) 包管理器,可以通过以下命令安装 `pytest`: ```bash brew install pytest ``` 如果你在国内,并且希望使用国内的 Homebrew 镜像来加速安装过程,可以运行以下命令来安装 Homebrew 的国内镜像脚本: ```bash /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" ``` 安装完成后,再运行 `brew install pytest` 即可[^3]。 ### 验证安装 安装完成后,可以通过以下命令验证 `pytest` 是否安装成功: ```bash pytest --version ``` 如果安装成功,你将看到类似以下的输出: ``` This is pytest version 7.4.0, imported from /usr/local/lib/python3.9/site-packages/pytest.py ``` ### 其他注意事项 1. **Python 环境要求**:`pytest` 支持 Python 2.6 及以上版本 Python 3.3 及以上版本。如果你使用的是较旧的 Python 版本,建议升级到 Python 3.x 以获得更好的兼容性支持。 2. **虚拟环境**:建议在虚拟环境中安装 `pytest`,以避免与全局 Python 环境中的其他包发生冲突。可以使用 `venv` 或 `virtualenv` 创建虚拟环境。 #### 创建虚拟环境并安装 pytest ```bash # 创建虚拟环境 python -m venv venv # 激活虚拟环境 source venv/bin/activate # Linux/macOS venv\Scripts\activate # Windows # 安装 pytest pip install pytest ``` 通过以上方法,你应该能够顺利安装 `pytest` 并开始使用它进行自动化测试。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值