首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pytest-xdist跨主节点和工作节点访问共享资源

使用pytest-xdist跨主节点和工作节点访问共享资源
EN

Stack Overflow用户
提问于 2019-08-19 15:00:20
回答 1查看 1.2K关注 0票数 2

我正在尝试在主节点和工作节点之间共享数据库中的随机条目列表(我对共享资源的定义),并使用pytest-xdist并行化测试。我的代码遵循以下结构:

代码语言:javascript
复制
## in conftest.py
def get_db_entries():
   connect to db
   run a query with group by and random
   returns one random entry per group as a list of dictionaries.

我采用了https://hackebrot.github.io/pytest-tricks/shared_directory_xdist/提供的建议,以便在主节点和工作节点之间共享数据库条目:

代码语言:javascript
复制
# in conftest.py
def pytest_configure(config):
    if is_master(config):
        # share db_entries across master and worker nodes.
        config.db_samples = get_db_entries()

def pytest_configure_node(node):
    """xdist hook"""
    node.slaveinput['db_entries'] = node.config.db_samples

def is_master(config):
    """True if the code running the given pytest.config object is running in a xdist master
    node or not running xdist at all.
    """
    return not hasattr(config, 'slaveinput')

@pytest.fixture
def db_samples(request):
    """Returns a unique and temporary directory which can be shared by
    master or worker nodes in xdist runs.
    """
    if is_master(request.config):
        return request.config.db_samples
    else:
        return request.config.slaveinput['db_entries']

我可以使用上面的方法在master和worker之间共享这些db条目,如下所示:

代码语言:javascript
复制
# in test-db.py
def test_db(db_samples):
    for sample in samples:
       # test each sample.

到目前为止,还没有测试用例的并行化。我只是在主节点和工作节点之间共享相同的数据库条目。

我的问题是:如何参数化共享资源状态(数据库条目),以便可以使用pytest-xdist并行执行这些测试?

我想做一些事情,大致如下:

代码语言:javascript
复制
# in conftest.py
samples = db_samples() # will FAIL coz fixture can't be invoked directly.

@pytest.fixture(params=samples)
def get_sample(request):
   return request.param

# in test-db.py
def test_db(get_sample):
    # test one sample.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-20 04:01:57

多亏了@hoefling的建议,我能够使用pytest-xdist钩子和pytest_generate_tests来获得一个有效的解决方案。

代码语言:javascript
复制
# in conftest.py
def pytest_configure(config):
    if is_master(config):
        # share db_entries across master and worker nodes.
        config.db_samples = get_db_entries()

def pytest_configure_node(node):
    """xdist hook"""
    node.slaveinput['db_entries'] = node.config.db_samples

def is_master(config):
    """True if the code running the given pytest.config object is running in a xdist master
    node or not running xdist at all.
    """
    return not hasattr(config, 'slaveinput')

def pytest_generate_tests(metafunc):
    if 'sample' in metafunc.fixturenames:
        if is_master(metafunc.config):
            samples = metafunc.config.db_samples
        else:
            samples = metafunc.config.slaveinput['db_entries']
        metafunc.parametrize("sample", samples)

@pytest.fixture
def sample(request):
    return request.param

# in test-db.py
def test_db(sample):
    # test one sample.

@hoefling建议使用pytest_generate_tests钩子是缺失的一部分。使用这个钩子参数化测试夹具有助于解决这个问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57551837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档