安装与入门
Python支持版本: Python 2.6,2.7,3.3,3.4,3.5, Jython, PyPy-2.3
支持的平台: Unix/Posix and Windows
PyPI包名: pytest
依赖项: py, colorama (Windows), argparse (py26), ordereddict (py26).
PDF文档: 下载最新版本文档
安装
安装:
pip install -U pytest
检查您安装的版本是否正确:
$ pytest --version
This is pytest version 3.x.y, imported from $PYTHON_PREFIX/lib/python3.5/site-packages/pytest.py
我们的第一个测试
让我们使用一个简单的测试函数创建一个测试文件:
# test_sample.py的内容
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
搞定. 你可以开始运行这个测试文件了:
$ pytest
======= test session starts ========
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y
rootdir: $REGENDOC_TMPDIR, inifile:
collected 1 item
test_sample.py F
======= 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.12 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()
这次使用"quite"报告模式来运行:
$ pytest -q test_sysexit.py
.
1 passed in 0.12 seconds
在class中将多个测试进行分组
一旦您开始有了更多的测试时,在逻辑上,在类和模块中进行分组测试是有意义的。让我们写一个包含两个测试的类:
# content of test_class.py
class TestClass(object):
def test_one(self):
x = "this"
assert 'h' in x
def test_two(self):
x = "hello"
assert hasattr(x, 'check')
这两个test被发现是因为这个标准—— Python测试发现机制约定. 不需要子类化任何东西。我们可以简单地通过传递它的文件名来运行这个模块:
$ 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 AssertionError: assert False
E + where False = hasattr('hello', 'check')
test_class.py:8: AssertionError
1 failed, 1 passed in 0.12 seconds
第一个test通过了,第二个test失败了。同样,我们可以很容易地看到断言中使用的中间值,有助于我们理解失败的原因。
功能:请求一个唯一的临时目录
对于功能测试,通常需要创建一些文件并将它们传递给应用程序对象. pytest提供 内置的 fixtures/function 参数 允许任意请求的资源,例如一个独特的临时目录:
# content of test_tmpdir.py
def test_needsfiles(tmpdir):
print (tmpdir)
assert 0
我们在测试函数签名中列出了tmpdir
,在执行测试函数调用之前,pytest
将查找并调用一个fixture工厂来创建资源。让我们来运行它:
$ pytest -q test_tmpdir.py
F
======= FAILURES ========
_______ test_needsfiles ________
tmpdir = local('PYTEST_TMPDIR/test_needsfiles0')
def test_needsfiles(tmpdir):
print (tmpdir)
> assert 0
E assert 0
test_tmpdir.py:3: AssertionError
--------------------------- Captured stdout call ---------------------------
PYTEST_TMPDIR/test_needsfiles0
1 failed in 0.12 seconds
在test运行之前,创建了一个惟一的测试调用临时目录.
输入以下内容可以查看内置的pytest fixtures:明确的、模块化的、可伸缩的:
pytest --fixtures # shows builtin and custom fixtures
下一步去哪
下面是一些建议:
- 通过 python -m pytest运行 pytest 对于命令行调用示例
- 良好的实践 virtualenv,测试布局
- 通过现成的测试套件使用pytest用于已经存在的测试
- pytest fixtures: explicit, modular, scalable 为您的测试提供一个功能基线
- 编写插件 管理和编写插件