使用pytest管理测试数据的正确方法是什么?

时间:2019-01-23 15:41:56

标签: python testing design-patterns automated-tests pytest

我需要为多个相关应用创建自动化测试,并且在测试之间面临测试数据管理的一个问题。 问题在于,必须在多个应用程序和/或不同的API之间共享相同的数据。 现在,我有了pytest的下一个结构,该结构对我来说很好,但是我怀疑在conftest.py中使用测试数据管理是正确的方法:

总体结构如下:

tests/
    conftest.py
    app1/
        conftest.py
        test_1.py
        test_2.py
    app2/
        conftest.py
        test_1.py
        test_2.py
test_data/
    test_data_shared.py
    test_data_app1.py
    test_data_app2.py

以下是tests / conftest.py中测试数据的示例:

from test_data.test_data_shared import test_data_generator, default_data

@pytest.fixture
def random_email():
    email = test_data_generator.generate_random_email()
    yield email
    delete_user_by_email(email)

@pytest.fixture()
def sign_up_api_test_data(environment, random_email):
"""
environment is also fixture, capture value from pytest options
"""
    data = {"email": random_email, "other_data": default_data.get_required_data(), "hash": test_data_generator.generate_hash(environment)}
    yield data
    do_some_things_with_data(data)

为此使用夹具非常舒适,因为后置条件,范围和其他好处(请注意,应用程序具有很多逻辑和关系,因此我不能简单地对数据进行硬编码或将其迁移到json文件中) 对于相应地在app1和app 2中使用的数据,可以在tests / app1 / conftest.py和tests / app2 / conftest.py中找到类似的内容。

因此,这里有两个问题: 1. conftest.py变成了很多代码的怪物 2.据我所知,对测试数据使用conftest是一种不好的方法,或者我错了?

谢谢!

2 个答案:

答案 0 :(得分:2)

我将conftest.py用于测试数据。
夹具是向测试提供测试数据的推荐方法。
推荐使用conftest.py在多个测试文件之间共享灯具。

至于#2。我认为可以使用conftest.py来测试数据。

现在#1,“ conftest.py变得太大”。

尤其是对于顶级conftest.py文件,在test / conftest.py,您可以将该内容移动到一个或多个pytest插件中。由于conftest.py文件可以被视为“本地插件”,因此将它们转换为插件的过程并不难。

请参见https://docs.pytest.org/en/latest/writing_plugins.html

答案 1 :(得分:0)

您可能对查看pytest-cases感兴趣:它实际上是为解决这个问题而设计的。您会在文档中找到很多示例,案例可以放在专用模块,类或测试文件中-这实际上取决于您的需求。例如,将两种测试数据生成器放在同一模块中:

from pytest_cases import parametrize_with_cases, parametrize

def data_a():
    return 'a'

@parametrize("hello", [True, False])
def data_b(hello):
    return "hello" if hello else "world"

def user_bob():
    return "bob"

@parametrize_with_cases("data", cases='.', prefix="data_")
@parametrize_with_cases("user", cases='.', prefix="user_")
def test_with_data(data, user):
    assert data in ('a', "hello", "world")
    assert user == 'bob'

有关详细信息,请参见documentation。我是作者;)