python-pytest内置fixture

上一篇文章已经介绍了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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值