使python py.test单元测试独立于执行py.test的位置运行



假设我的代码看起来像这个

import pytest
import json
@pytest.fixture
def test_item():
    test_item = json.load(open('./directory/sample_item_for_test.json','rb'))
    return test_item
def test_fun(test_document):
    assert  type(test_item.description[0]) == unicode

我想通过Py.Test运行这个测试

如果我从Py.test所在的目录运行它,那就没问题了。但是如果我从上面的目录运行它,它会因为找不到"sample_item_for_test.json"而失败。无论我在哪里执行Py.test,都有办法让这个测试正确运行吗?

魔术属性__file__是文件系统上python文件的路径。因此,您可以使用os中的一些魔术来获取当前目录。。。

import pytest
import json
import os
_HERE = os.path.dirname(__file__)
_TEST_JSON_FILENAME = os.path.join(_HERE, 'directory', 'sample_item_for_test.json')
@pytest.fixture
def test_item():
    with open(_TEST_JSON_FILENAME, 'rb') as file_input:
        return json.load(file_input)

当我迁移到py.test时,我有一大组遗留测试,这些测试习惯于在测试文件所在的目录中执行。我没有跟踪每一个测试失败,而是在每次测试开始前,在conftest.py-chdir的测试目录中添加了一个pytest钩子:

import os
import functools
def pytest_runtest_setup(item):
    """
    Execute each test in the directory where the test file lives.
    """
    starting_directory = os.getcwd()
    test_directory = os.path.dirname(str(item.fspath))
    os.chdir(test_directory)
    teardown = functools.partial(os.chdir, starting_directory)
    # There's probably a cleaner way than accessing a private member.
    item.session._setupstate.addfinalizer(teardown, item)

最新更新