此文已由做者吴琪惠受权网易云社区发布。
html
欢迎访问网易云社区,了解更多网易技术产品运营经验。python
纯官网译文而已。。。
linux
pytest是一个成熟的、全功能的python测试工具。json
pytest框架编写测试用例时,小的用例会变得更容易编写,但对于复杂的应用或者库应该更谨慎选择。session
特征:架构
1.断言失败以后具有详细的失败信息(不无需记住self.asseer*的名字)app
2.自动失败测试模块和方法框架
3.模块化组件,可用于管理小的或者参数化长时间存活的测试资源ide
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 clashes 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+款云产品!
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 iOS 安装包瘦身 (上篇)
【推荐】 爬虫开发python工具包介绍 (2)
【推荐】 使用Phaser开发你的第一个H5游戏(一)