仅因为参数不同而防止测试代码的“重复”

时间:2018-05-21 12:16:51

标签: python python-3.x pytest

在我的测试套件中,我对集成和稳定性进行了不同的测试。

例如,

@pytest.mark.integration
def test_integration_total_devices(settings, total_devices):
    assert total_devices == settings['integration']['nodes']['total']

@pytest.mark.stability
def test_stability_total_devices(settings, total_devices):
    assert total_devices == settings['stability']['nodes']['total']

正如您所注意到的,它与完全相同的代码,只是从配置中读取不同的参数。

如何防止这种重复代码的情况?设置的值不同,所以我不能只是:

@pytest.mark.integration
@pytest.mark.stability
def test_integration_total_devices(settings, total_devices):
    assert total_devices == settings['nodes']['total']

我忘了提及(感谢@dzejdzej提醒我),似乎pytest parametrize没有做到这一点。当我想要运行两个“标记”时它起作用,但标记的目的是能够独立地运行其中一个的测试,例如pytest -m integration。但是,据我测试,每当我设置参数化时,它都会运行。

@pytest.mark.parametrize('type', (
    pytest.param('stability', marks=pytest.mark.stability),
    pytest.param('integration', marks=pytest.mark.integration),
))
@pytest.mark.integration
@pytest.mark.stability
def test_total_devices(settings, total_devices, type):
    assert total_devices == settings[type]['nodes']['total']

1 个答案:

答案 0 :(得分:3)

请查看pytest parametrize https://docs.pytest.org/en/latest/parametrize.html

应该可以这样做:

@pytest.mark.parametrize('area,total_devices', (
    pytest.param('stability', 10, marks=pytest.mark.stability),
    pytest.param('integration', 15, marks=pytest.mark.integration),
))
def test_integration_total_devices(area, total_devices):
    assert total_devices == settings.get(area)['nodes']['total']