[翻译]pytest测试框架(一)


此文已由作者吴琪惠授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。


纯官网译文而已。。。

pytest是一个成熟的、全功能的python测试工具。

pytest框架编写测试用例时,小的用例会变得更容易编写,但对于复杂的应用或者库应该更谨慎选择。


特征:

1.断言失败之后具备详细的失败信息(不无需记住self.asseer*的名字)

2.自动失败测试模块和方法

3.模块化组件,可用于管理小的或者参数化长时间存活的测试资源

4.可以在box外运行uniitest和nose测试组件

5.支持Python2.6+, Python3.3+, PyPy-2.3, Jython-2.5 (未测试)

6.丰富的插件架构,拥有超过150+个外部插件和人气活动的论坛社区


安装:

支持的python版本:Python 2.6,2.7,3.3,3.4,3.5, Jython, PyPy-2.3

支持的平台:Unix/Posix ,Windows

Pypi连接:pytest

安装命令:

pip install -U pytest

检查安装结果:

$ pytest --version
This is pytest version 3.0.6, imported from $PYTHON_PREFIX/lib/python3.5/site-packages/pytest.py


第一次运行一个简单的例子:

# content of test_sample.pydef inc(x):
    return x + 1def test_answer():
    assert inc(3) == 5

运行结果:

$ pytest
======= test session starts ========
platform linux -- Python 3.5.2, pytest-3.0.6, py-1.4.33, pluggy-0.4.0rootdir: $REGENDOC_TMPDIR, inifile:
collected 1 items

test_sample.py F

======= FAILURES ========
_______ test_answer ________    def test_answer():>       assert inc(3) == 5E       assert 4 == 5E        +  where 4 = inc(3)

test_sample.py:5: AssertionError
======= 1 failed in 0.12 seconds ========

上面的例子失败是因为func(3)不应该返回5,而是4

提示:你可以简单的使用 assert 语句来进行测试是否异常,pytest内置了详尽的断言,可只能的识别 assert表达式的中间项,你无需记住JUint那么多的传统方法


运行多个测试用例:

pytest会运行当前路径以及其子路径下的所有格式如 test_*.py 或者 *_test.py文件,通常遵循标准试验发现规则。


异常断言:

如果你想要assert一些抛出异常的代码,你可以使用raises,运行脚本,使用“quiet”静默模式(-q):

# content of test_sysexit.pyimport pytestdef f():
    raise SystemExit(1)def test_mytest():
    with pytest.raises(SystemExit):
        f()

运行结果:

$ pytest -q test_sysexit.py
.1 passed in 0.12 seconds


在一个类中分组用例:

实际场景中,会遇到一个类中或者一个模块下有一些逻辑上有关联的用例组,举个例子:

# content of test_class.pyclass TestClass:
    def test_one(self):
        x = "this"
        assert 'h' in x

    def test_two(self):
        x = "hello"
        assert hasattr(x, 'check')

上面两个用例,没有子类,因此我们可以直接使用文件名来运行:

$ pytest -q test_class.py
.F
======= FAILURES ========
_______ TestClass.test_two ________

self = <test_class.TestClass object at 0xdeadbeef>    def test_two(self):
        x = "hello">       assert hasattr(x, 'check')
E       assert FalseE        +  where False = hasattr('hello', 'check')

test_class.py:8: AssertionError1 failed, 1 passed in 0.12 seconds

第一个用例passed,第二个failed,并且我们可以情况的看着断言中的一些中间值,帮助我们理解错误原因。


功能测试用例:生成唯一的临时目录

功能测试经常需要创建一些文件,并将其传递给应用程序对象。pytest提供 Builtin fixtures/function 参数允许请求任意资源,例如唯一的临时目录:

# content of test_tmpdir.pydef test_needsfiles(tmpdir):
    print (tmpdir)
    assert 0

在函数中打印了参数 tmpdir,pytest会在执行测试方法之前,查找和调用一个fixture factory来创建资源。运行例子:

$ pytest -q test_tmpdir.py
F
======= FAILURES ========
_______ test_needsfiles ________

tmpdir = local('PYTEST_TMPDIR/test_needsfiles0')    def test_needsfiles(tmpdir):
        print (tmpdir)
>       assert 0E       assert 0test_tmpdir.py:3: AssertionError
--------------------------- Captured stdout call ---------------------------
PYTEST_TMPDIR/test_needsfiles01 failed in 0.12 seconds

在测试执行之前,一个 唯一的-单独的-测试-执行 临时路径被创建。


断言的前面的print内容也会打印出来,测试时可以多加print语句,保证异常时输出一些有用的信息。

以下命令可以看到更多的内置函数:

pytest --fixtures   # shows builtin and custom fixtures
E:\0WORKS\MyPytest>py.test --fixtures
============================= test session starts =============================
platform win32 -- Python 2.7.10, pytest-3.0.4, py-1.4.31, pluggy-0.4.0rootdir: E:\0WORKS\MyPytest, inifile:plugins: html-1.11.0, rerunfailures-2.1.0collected 1 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 *****es with other cache users.

    Values can be any object handled by the json stdlib module.
capsys
    Enable capturing of writes to sys.stdout/sys.stderr and make
    captured output available via ``capsys.readouterr()`` method calls
    which return a ``(out, err)`` tuple.
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.
doctest_namespace
    Inject names into the doctest namespace.
pytestconfig
    the pytest config object with access to command line opts.
record_xml_property
    Add extra xml properties to the tag for the calling test.
    The fixture is callable with ``(name, value)``, with value being automatical
ly
    xml-encoded.
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, value, 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 WarningsRecorder instance that provides these methods:

    * ``pop(category=None)``: return last warning matching the category.
    * ``clear()``: clear list of warnings

    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.

------------------ fixtures defined from pytest_html.plugin -------------------
environment
    Provide environment details for HTML report

======================== no tests ran in 0.21 seconds =========================

 


网易云免费体验馆,0成本体验20+款云产品! 

更多网易技术、产品、运营经验分享请点击




相关文章:
【推荐】 Kubernetes在网易云中的落地优化实践

posted @ 2018-10-19 09:21  tianshidan1998  阅读(426)  评论(0)    收藏  举报