pytest是第三方开发的一个python测试模块,可以轻松地编写小型测试,而且可以扩展以支持应用程序和库的复杂功能测试,帮助我们编写更好的程序。
安装pytest
先在命令行中运行pytest的安装命令:
$ pip install -U pytest
安装完成后,检查是否安装了正确的版本:
$ pytest --version
简单的测试
我们从一个简单的测试例子开始了解pytest,新建一个test_sample.py文件,输入以下代码:
def inc(x):
return x + 1
def test_answer():
assert inc(3) == 5
在test_sample.py文件的目录下,执行pytest
命令,pytest将运行当前目录及其子目录下所有名称为“test_*.py”或“*_test.py”的文件:
$ pytest
我们使用了assert语句来验证测试期望值,pytest中有一种断言反思机制,能智能地报告assert表达式的中间值,使我们不必再使用传统的JUnit方法。这个测试返回了一个失败报告,因为inc(3)没有返回5,如下图所示:
断言引发异常
使用raises
可以帮助我们断言某些代码会引发某个异常,新建一个test_sysexit.py文件,输入以下代码:
import pytest
def f():
raise SystemExit(1)
def test_mytest():
with pytest.raises(SystemExit):
f()
这样在出现该异常的时候,这个测试用例也不会标记为失败,以quiet
报告模式执行测试功能:
$ pytest -q test_sysexit.py
这个测试返回了一个成功报告,如下图所示:
执行多个测试
当我们开发了多个测试时,可能会把它们分组到一个类中,我们现在可以使用pytest创建一个包含多个测试的类,新建一个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')
pytest会发现所有“test_*”命名的函数,没有必要继承任何东西,我们可以简单地通过传递它的文件名来运行测试:
$ pytest -q test_class.py
第一个测试通过,第二个测试失败,我们可以轻松地看到断言中的中间值,以帮助我们了解失败的原因,如下图所示:
使用内置fixture
fixture是pytest中的一个特性,fixture可以请求任意资源,用文字不太好理解,我们就通过实例来理解吧。首先,通过以下命令可以找出所有pytest内置的fixture:
$ pytest --fixtures
我们就以tmpdir
这个内置的fixture来演示,tmpdir
能返回一个唯一的临时目录路径,新建一个test_tmpdir.py文件,输入以下代码:
def test_needsfiles(tmpdir):
print (tmpdir)
assert 0
在测试函数的参数中列出tmpdir
,pytest将在执行测试函数之前查找并调用fixture工厂来创建资源:
$ pytest -q test_tmpdir.py
在测试运行之前,pytest会创建一个唯一的,供每个测试调用的临时目录,如下图所示: