pytest 安装和入门
Posted lmx0621
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest 安装和入门相关的知识,希望对你有一定的参考价值。
安装pytest
1、在命令行中运行以下命令:
pip install -U pytest
2、检查已经安装的版本:
pytest --version This is pytest version 3.7.2, imported from c:python27libsite-packagespytest.pyc
创建第一个测试用例
使用四行代码创建一个简单的测试函数:
# content of test_sample.py def func(x): return x + 1 def test_answer(): assert func(3) == 5
执行测试用例:
D: estDemoDemoPytest>py.test -q 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:7: AssertionError 1 failed in 0.04 seconds
结果返回了一个失败的报告,因为func(3)不返回5。
注意:可以使用assert语句来验证测试的期望结果。 pytest的断言会自动断言出表达式的结果值,避免使用许多JUnit的方法。
运行多个测试
pytest会在当前目录及其子目录下运行test _ * .py或* _test.py形式的所有文件。 断言会抛出异常,使用raises可以查看某些代码引发的异常:
# content of test_sysexit.py import pytest def f(): raise SystemExit(1) def test_mytest(): with pytest.raises(SystemExit): f()
使用“quiet”报告模式执行测试功能:
D: estDemoDemoPytest>py.test -q test_sysexit.py . [100%] 1 passed in 0.89 seconds
一个类中存在多个测试用例
一旦设计了多个测试用例,且你希望将它们分组到一个类中。 pytest使创建类,使类中包含多个测试用例:
import 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会运作python规则下的所有test,它发现有两个test_前缀的用例,所以我们通过传文件名来运行类中所有的测试用例。
D: estDemoDemoPytest>py.test -q test_class.py .F [100%] ================================== FAILURES =================================== _____________________________ TestClass.test_two ______________________________ self = <Pytest.test_class.TestClass instance at 0x00000000039BC448> def test_two(self): x = "hello" > assert hasattr(x, ‘check‘) E AssertionError: assert False E + where False = hasattr(‘hello‘, ‘check‘) test_class.py:10: AssertionError 1 failed, 1 passed in 0.05 seconds
第一次测试通过,第二次测试失败。 可以在断言中轻松查看到结果值,来判断失败的原因,来定位问题
请求唯一临时目录的测试用例
pytest提供了Builtin fixture / function参数来请求任意资源,比如一个唯一的临时目录:
# content of test_tmpdir.py def test_needsfiles(tmpdir): print (tmpdir) assert 0
pytest将查找并调用fixture工厂来创建执行测试函数调用之前的资源,在测试运行之前,pytest会为每次测试运行调用创建一个独特的临时目录
D: estDemoDemoPytest>py.test -q test_tmpdir.py F [100%] ================================== FAILURES =================================== _______________________________ test_needsfiles _______________________________ tmpdir = local(‘c:\users\admini~1\appdata\local\temp\pytest-of-Administrator\pytest-2\test_needsfiles0‘) def test_needsfiles(tmpdir): print (tmpdir) > assert 0 E assert 0 test_tmpdir.py:4: AssertionError ---------------------------- Captured stdout call ----------------------------- c:usersadmini~1appdatalocal emppytest-of-Administratorpytest-2 est_needsfiles0 1 failed in 0.05 seconds D: estDemoDemoPytest>py.test -q test_tmpdir.py F [100%] ================================== FAILURES =================================== _______________________________ test_needsfiles _______________________________ tmpdir = local(‘c:\users\admini~1\appdata\local\temp\pytest-of-Administrator\pytest-3\test_needsfiles0‘) def test_needsfiles(tmpdir): print (tmpdir) > assert 0 E assert 0 test_tmpdir.py:4: AssertionError ---------------------------- Captured stdout call ----------------------------- c:usersadmini~1appdatalocal emppytest-of-Administratorpytest-3 est_needsfiles0 1 failed in 0.05 seconds
显示内置和自定义的fixtures
pytest --fixtures # shows builtin and custom fixtures
内置和自定义的fixtures如下:
D: estDemoDemoPytest>pytest --fixtures ============================= test session starts ============================= platform win32 -- Python 2.7.12, pytest-3.7.2, py-1.5.4, pluggy-0.7.1 rootdir: D: estDemoDemoPytest, inifile: collected 13 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 capturing of writes to ``sys.stdout`` and ``sys.stderr`` and make captured output available via ``capsys.readouterr()`` method calls which return a ``(out, err)`` namedtuple. ``out`` and ``err`` will be ``text`` objects. capsysbinary Enable capturing of writes to ``sys.stdout`` and ``sys.stderr`` and make captured output available via ``capsys.readouterr()`` method calls which return a ``(out, err)`` tuple. ``out`` and ``err`` will be ``bytes`` objects. capfd Enable capturing of writes to file descriptors ``1`` and ``2`` and make captured output available via ``capfd.readouterr()`` method calls which return a ``(out, err)`` tuple. ``out`` and ``err`` will be ``text`` objects. capfdbinary Enable capturing of write to file descriptors 1 and 2 and make captured output available via ``capfdbinary.readouterr`` method calls which return a ``(out, err)`` tuple. ``out`` and ``err`` will be ``bytes`` objects. doctest_namespace Fixture that returns a :py:class:`dict` that will be injected into the namespace of doctests. pytestconfig Session-scoped fixture that returns the :class:`_pytest.config.Config` object. Example:: def test_foo(pytestconfig): if pytestconfig.getoption("verbose"): ... 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_property (Deprecated) use record_property. 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 caplog Access and control log capturing. Captured logs are available through the following 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 Return a TempdirFactory 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 ======================== no tests ran in 0.08 seconds =========================
请注意,除非添加-v选项,否则此命令将省略带有前导_的fixtures
D: estDemoDemoPytest>pytest -v --fixtures ============================= test session starts ============================= platform win32 -- Python 2.7.12, pytest-3.7.2, py-1.5.4, pluggy-0.7.1 -- c:python27python.exe cachedir: .pytest_cache rootdir: D: estDemoDemoPytest, inifile: collected 13 items cache -- c:python27libsite-packages\_pytestcacheprovider.py:298 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 -- c:python27libsite-packages\_pytestcapture.py:205 Enable capturing of writes to ``sys.stdout`` and ``sys.stderr`` and make captured output available via ``capsys.readouterr()`` method calls which return a ``(out, err)`` namedtuple. ``out`` and ``err`` will be ``text`` objects. capsysbinary -- c:python27libsite-packages\_pytestcapture.py:217 Enable capturing of writes to ``sys.stdout`` and ``sys.stderr`` and make captured output available via ``capsys.readouterr()`` method calls which return a ``(out, err)`` tuple. ``out`` and ``err`` will be ``bytes`` objects. capfd -- c:python27libsite-packages\_pytestcapture.py:233 Enable capturing of writes to file descriptors ``1`` and ``2`` and make captured output available via ``capfd.readouterr()`` method calls which return a ``(out, err)`` tuple. ``out`` and ``err`` will be ``text`` objects. capfdbinary -- c:python27libsite-packages\_pytestcapture.py:249 Enable capturing of write to file descriptors 1 and 2 and make captured output available via ``capfdbinary.readouterr`` method calls which return a ``(out, err)`` tuple. ``out`` and ``err`` will be ``bytes`` objects. doctest_namespace -- c:python27libsite-packages\_pytestdoctest.py:507 Fixture that returns a :py:class:`dict` that will be injected into the namespace of doctests. pytestconfig -- c:python27libsite-packages\_pytestfixtures.py:1079 Session-scoped fixture that returns the :class:`_pytest.config.Config` object. Example:: def test_foo(pytestconfig): if pytestconfig.getoption("verbose"): ... record_property -- c:python27libsite-packages\_pytestjunitxml.py:241 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_property -- c:python27libsite-packages\_pytestjunitxml.py:261 (Deprecated) use record_property. record_xml_attribute -- c:python27libsite-packages\_pytestjunitxml.py:272 Add extra xml attributes to the tag for the calling test. The fixture is callable with ``(name, value)``, with value being automatically xml-encoded caplog -- c:python27libsite-packages\_pytestlogging.py:328 Access and control log capturing. Captured logs are available through the following 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 -- c:python27libsite-packages\_pytestmonkeypatch.py:16 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 -- c:python27libsite-packages\_pytest ecwarn.py:18 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 -- c:python27libsite-packages\_pytest mpdir.py:109 Return a TempdirFactory instance for the test session. tmpdir -- c:python27libsite-packages\_pytest mpdir.py:116 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 ======================== no tests ran in 0.09 seconds =========================
以上是关于pytest 安装和入门的主要内容,如果未能解决你的问题,请参考以下文章