pytest
是一个能够简化测试系统构建、方便测试规模扩展的框架,它让测试变得更具表现力和可读性--模版代码不再是必需的。
只需要几分钟的时间,就可以对你的应用开始一个简单的单元测试或者复杂的功能测试。
1. 安装
2. 创建你的第一个测试用例
它只有四行代码:
通过以下命令执行测试:
pytest
返回一个失败的测试报告,因为func(3)
不等于5
。
3. 执行多个测试用例
执行pipenv run pytest
命令,它会执行当前及其子文件夹中,所有命名符合test_*.py
或者*_test.py
规则的文件;
4. 触发一个指定异常的断言
使用raises
可以检查代码是否抛出一个指定的异常:
执行这个测试用例时,加上-q
选项可以查看精简版的测试报告:
5. 在一个类中组织多个测试用例
pytest
可以让你很容易的通过创建一个测试类来包含多个测试用例:
现在我们来执行这个测试用例:
从输出的报告中我们可以看到:
test_one
测试通过,用.
表示;test_two
测试失败,用F
表示;
- 清除的看到,
test_two
失败的原因是:False = hasattr('hello', 'check')
;
注意:
测试类要符合特定的规则,pytest
才能发现它:
- 测试类的命令要符合
Test*
规则;
- 测试类中不能有
__init__()
方法;
6. 申请一个唯一的临时目录
pytest
提供一些内置的fixtures
,可以用来请求一些系统的资源。例如,一个唯一的临时性目录:
在测试用例中,以形参的方式使用内置的tempdir fixture
,pytest
会事先创建一个目录,并将一个py.path.local
对象作为实参传入;
现在,我们来执行这个测试用例:
可以使用如下命令查看所有可用的fixtures
,如果想同时查看以_
开头的fixtures
,需要添加-v
选项:
λ pipenv run 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 =============================
GitHub仓库地址:https://github.com/luizyao/pytest-chinese-doc