安装和快速入门
- 安装
$ pip install -U pytest
$ pytest --version
This is pytest version 4.3.1, imported from /opt/anaconda3/lib/python3.7/site-packages/pytest.py
setuptools registered plugins:
pytest-remotedata-0.3.1 at /opt/anaconda3/lib/python3.7/site-packages/pytest_remotedata/plugin.py
pytest-openfiles-0.3.2 at /opt/anaconda3/lib/python3.7/site-packages/pytest_openfiles/plugin.py
pytest-metadata-1.8.0 at /opt/anaconda3/lib/python3.7/site-packages/pytest_metadata/plugin.py
pytest-html-1.20.0 at /opt/anaconda3/lib/python3.7/site-packages/pytest_html/plugin.py
pytest-doctestplus-0.3.0 at /opt/anaconda3/lib/python3.7/site-packages/pytest_doctestplus/plugin.py
pytest-arraydiff-0.3 at /opt/anaconda3/lib/python3.7/site-packages/pytest_arraydiff/plugin.py
jython的安装可能要生成脚本,参见:http://pytest.org/latest/getting-started.html
- 第一个实例:
代码:
# content of test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
在当前目录执行:
$ pytest test_sample.py
====================================================================== test session starts ======================================================================
platform linux -- Python 3.7.3, pytest-4.3.1, py-1.8.0, pluggy-0.9.0
rootdir: /home/andrew/code/pytest_tmp, inifile:
plugins: remotedata-0.3.1, openfiles-0.3.2, metadata-1.8.0, html-1.20.0, doctestplus-0.3.0, arraydiff-0.3
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.13 seconds ====================================================================
我们得到了一个故障报告,因为我们调用func(3)没有返回5。pytest的高级內省断言会智能报告assert的中间值,不需要记住那些JUnit传统方法。
- 执行多个测试
pytest会执行当前目录及其子目录的test_.py 或_test.py。
- 异常断言
代码:
# content of test_sysexit.py
import pytest
def f():
raise SystemExit(1)
def test_mytest():
with pytest.raises(SystemExit):
f()
执行结果:
$ py.test -q test_sysexit.py
.
1 passed in 0.01 seconds
-q表示静默模式:
-q, --quiet decrease verbosity.
- 在类中分组用例
代码
# 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 test_class.py
====================================================================== test session starts ======================================================================
platform linux -- Python 3.7.3, pytest-4.3.1, py-1.8.0, pluggy-0.9.0
rootdir: /home/andrew/code/pytest_tmp, inifile:
plugins: remotedata-0.3.1, openfiles-0.3.2, metadata-1.8.0, html-1.20.0, doctestplus-0.3.0, arraydiff-0.3
collected 2 items
test_class.py .F [100%]
=========================================================================== FAILURES ============================================================================
______________________________________________________________________ TestClass.test_two _______________________________________________________________________
self = <test_class.TestClass object at 0x7f759fd3b780>
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.14 seconds ===============================================================
- 功能测试示例:生成唯一的临时目录
功能测试经常需要创建一些文件,并将其传递给应用程序对象。pytest提供 Builtin fixtures/function 参数允许请求任意资源,例如唯一的临时目录:
# content of test_tmpdir.py
def test_needsfiles(tmpdir):
print (tmpdir)
assert 0
执行结果:
$ pytest -q test_tmpdir.py
F [100%]
=========================================================================== FAILURES ============================================================================
________________________________________________________________________ test_needsfiles ________________________________________________________________________
tmpdir = local('/tmp/pytest-of-andrew/pytest-2/test_needsfiles0')
def test_needsfiles(tmpdir):
print (tmpdir)
> assert 0
E assert 0
test_tmpdir.py:3: AssertionError
--------------------------------------------------------------------- Captured stdout call ----------------------------------------------------------------------
/tmp/pytest-of-andrew/pytest-2/test_needsfiles0
1 failed in 0.14 seconds
断言的前面的print内容也会打印出来,测试时可以多加print语句,保证异常时输出一些有用的信息。
下面方式可以查看内置功能
$ pytest --fixtures
====================================================================== test session starts ======================================================================
platform linux -- Python 3.7.3, pytest-4.3.1, py-1.8.0, pluggy-0.9.0
rootdir: /home/andrew/code/pytest_tmp, inifile:
plugins: remotedata-0.3.1, openfiles-0.3.2, metadata-1.8.0, html-1.20.0, doctestplus-0.3.0, arraydiff-0.3
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 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_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 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
Return a :class:`_pytest.tmpdir.TempdirFactory` instance for the test session.
tmp_path_factory
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
--------------------------------------------------------- fixtures defined from pytest_metadata.plugin ----------------------------------------------------------
metadata
Provide test session metadata
================================================================= no tests ran in 0.07 seconds ==================================================================
参考资料
- python测试开发项目实战-目录
- python工具书籍下载-持续更新
- python 3.7极速入门教程 - 目录
- 讨论qq群630011153 144081101
- 原文地址
- 本文涉及的python测试开发库 谢谢点赞!
- [本文相关海量书籍下载](https://github.com/china-testing/python-api-tesing/blob/master/books.md
某通信公司的pytest demo
#! /usr/bin/env python
#coding=utf-8
import pytest
@pytest.fixture(scope="module")
def host():
print "set up"
import snmp
host = snmp.Snmp()
host.snmp_connect(hostname='127.0.0.1', version=2, community='private')
def close():
print ("tear down" )
del host
return host
@pytest.mark.webtest
@pytest.mark.high
def test_ntp(host):
host.snmp_connect(hostname='127.0.0.1', version=2, community='private')
for ip in ('33.33.1.2', '172.22.1.8'):
host.snmp_set_check('ntpPrimaryServer.0=' + ip)
for ntpClientEnabled in ('true', 'false'):
host.snmp_set_check('ntpClientEnabled.0=' + ntpClientEnabled)
@pytest.mark.high
def test_something_quick(host):
assert 1 == 1
print "\n test_something_quick"
def test_another():
pass
#pytest.main("robot_test.py -sv")
参数化:pytest_data_driver.py
import pytest
@pytest.mark.parametrize(("slot_type", "slot_num"), [('ge_10s', '1'), ('xg_1x', '2')])
def test_a(slot_type, slot_num):
print(slot_type, slot_num)
生成html报告
安装
$ sudo pip install pytest-html
执行:
$ pytest -q test_sysexit.py --html=report.html
. [100%]
------------------------------------------------- generated html file: /home/andrew/code/pytest_tmp/report.html -------------------------------------------------
1 passed in 0.03 seconds
image.png
网友评论