上一篇文章已经介绍了pytest的fixture强大之处,但都是我们自己定义的fixture。下面来一起看下pytest内置的fixture。
1. tmpdir和tmpdir_factory
tmpdir
和 tmpdir_factory
负责在测试开始之前创建临时目录和文件,并且在结束的时候删除,也就是创建临时目录文件供测试使用,用完即销毁,不会对测试所在系统产生影响。
tmpdir
tmpdir
的作用范围是函数级别,建议在单个测试的时候使用 tmpdir
。如果每个测试函数都要重新创建目录或文件,也建议使用 tmpdir
def test_tmpdir(tmpdir):
# tmpdir.join():创建临时文件
a_file = tmpdir.join('something.txt')
# tmpdir.mkdir():创建临时目录
a_sub_dir = tmpdir.mkdir('anything')
another_file = a_sub_dir.join('something_else.txt')
a_file.write('contents may settle during shipping')
another_file.write('something different')
assert a_file.read() == 'contents may settle during shipping'
assert another_file.read() == 'something different'
测试结果(在需要的时候使用 -q
参数简化结果输出)
$ pytest -q test_tmpdir.py::test_tmpdir
. [100%]
1 passed in 0.02s
测试结果很满意。tmpdir
的返回值是 py.path.local
类型的一个对象(关于 py.path.local 的解释 ),但是需要注意 tmpdir
的作用范围是函数级别,所以只能针对于测试函数,如果需要更高级别的作用范围,就需要使用到 tmpdir_factory
tmpdir_factory
tmpdir_factory
和 tmpdir
用法很像,但是他们还是有不同的接口。它会作用于类、模块以及会话级别的测试。在会话级别的 fixture 中,创建的资源可以持续到测试结束。
下面通过代码来展示两者之间不同的用法
def test_tmpdir_factory(tmpdir_factory):
# 这里返回的还是一个 py.path.local 对象,tmpdir_factory.mktemp():创建临时目录
a_dir = tmpdir_factory.mktemp('mydir')
a_file = a_dir.join('something.txt')
a_sub_dir = a_dir.mkdir('anything')
another_file = a_sub_dir.join('something_else.txt')
a_file.write('contents may settle during shipping')
another_file.write('something different')
assert a_file.read() == 'contents may settle during shipping'
assert another_file.read() == 'something different'
下面是运行结果
$ pytest -q test_tmpdir.py::test_tmpdir_factory
. [100%]
1 passed in 0.03s
因为 tmpdir_factory
的作用范围是会话级别,如果我们需要模块或者类级别的作用范围的目录,这时就需要我们自己在定义一个 fixture 了。
import json
import pytest
@pytest.fixture(scope='module')
def some_json(tmpdir_factory):
json_data = {
'Nancy': {
'City': 'Hangzhou'},
'Petter': {
'City': 'Beijing'},
'Jim': {
'City': 'Shanghai'}
}
file = tmpdir_factory.mktemp('data').join('friends.json')
print('file:{}'.format(str(file)))
with file.open('w') as f:
json.dump(json_data, f)
return file
这样我们创建的这个 fixture 就会创建一个临时目录 data,然后将需要测试的内容写入 friends.json
文件,因为我们在定义的时候 scope="module"
,所以该 json 文件只会在每个模块运行的时候创建一次。
tmpdir_factory
还有很多其他方法在这里没有展示,有兴趣的同学可以去翻一番代码。
2. pytestconfig
内置的 pytestconfig
可以通过命令行参数、选项、配置文件、插件、运行目录等等方式来控制pytest的运行。
直接来看代码
# conftest.py
def pytest_addoption(parser):
# parser.addoption():为pytest添加命令行参数
parser.addoption("--testopt", action="store_true",
help="this is test msg")
parser.addoption("--free", action="store", default="beer",
help="free: beer or people")
需要注意的是, conftest.py
需要在顶层目录下,不能处于测试子目录下
接下来我们测试上述代码
import pytest
def test_option(pytestconfig):
print