pytest 安裝和入門
阿新 • • 發佈:2018-08-29
dem vid htm eth let call tput keyerror nvi
安裝pytest
1、在命令行中運行以下命令:
pip install -U pytest
2、檢查已經安裝的版本:
pytest --version This is pytest version 3.7.2, imported from c:\python27\lib\site-packages\pytest.pyc
創建第一個測試用例
使用四行代碼創建一個簡單的測試函數:
# content of test_sample.py def func(x): return x + 1 def test_answer(): assert func(3) == 5
執行測試用例:
D:\test\Demo\Demo\Pytest>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:\test\Demo\Demo\Pytest>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:\test\Demo\Demo\Pytest>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:\test\Demo\Demo\Pytest>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:\users\admini~1\appdata\local\temp\pytest-of-Administrator\pytest-2\test_needsfiles0 1 failed in 0.05 seconds D:\test\Demo\Demo\Pytest>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:\users\admini~1\appdata\local\temp\pytest-of-Administrator\pytest-3\test_needsfiles0 1 failed in 0.05 seconds
顯示內置和自定義的fixtures
pytest --fixtures # shows builtin and custom fixtures
內置和自定義的fixtures如下:
D:\test\Demo\Demo\Pytest>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:\test\Demo\Demo\Pytest, 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:\test\Demo\Demo\Pytest>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:\python27\python.exe cachedir: .pytest_cache rootdir: D:\test\Demo\Demo\Pytest, inifile: collected 13 items cache -- c:\python27\lib\site-packages\_pytest\cacheprovider.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:\python27\lib\site-packages\_pytest\capture.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:\python27\lib\site-packages\_pytest\capture.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:\python27\lib\site-packages\_pytest\capture.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:\python27\lib\site-packages\_pytest\capture.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:\python27\lib\site-packages\_pytest\doctest.py:507 Fixture that returns a :py:class:`dict` that will be injected into the namespace of doctests. pytestconfig -- c:\python27\lib\site-packages\_pytest\fixtures.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:\python27\lib\site-packages\_pytest\junitxml.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:\python27\lib\site-packages\_pytest\junitxml.py:261 (Deprecated) use record_property. record_xml_attribute -- c:\python27\lib\site-packages\_pytest\junitxml.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:\python27\lib\site-packages\_pytest\logging.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:\python27\lib\site-packages\_pytest\monkeypatch.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:\python27\lib\site-packages\_pytest\recwarn.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:\python27\lib\site-packages\_pytest\tmpdir.py:109 Return a TempdirFactory instance for the test session. tmpdir -- c:\python27\lib\site-packages\_pytest\tmpdir.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 安裝和入門