Pytest:根据config.ini中指定的次数运行所有测试

时间:2019-01-17 23:50:08

标签: python python-3.x pytest

这是我编写测试的方式:

**config.ini**
idlist: 1

Class MyConfig:
   def __init__(self):
      self.id = config.idlist
      ....

**conftest.py**
@pytest.fixture(scope='module')
def obj()
    myobj = new MyConfig()
    yield myobj

@pytest.fixture(scope='module')
def get_id(obj)
    yield obj.id

**test_mytests.py**
def test_a_sample_test(get_id):
     assert get_id == 1

def test_a_sample_even test(get_id):
     assert get_id % 2 == 0

现在,我想将idlist(从config.ini)更改为如下所示的数字列表 idlist = [1、2、3、4 ....]

我希望能够根据ID列表中ID的数目自动触发运行以test_开头的所有测试的运行。如下图

new config.ini
idlist: id1, id2, id3, id4, ... idN

def get_id(obj):
    for anId in obj.id
        yield anId          **<--- notice that the id's change.**

最后测试。

**test_mytests.py**
def test_a_sample_test(get_id):
     assert get_id == 1

def test_a_sample_even test(get_id):
     assert get_id % 2 == 0

我要:

  1. 每次调用get_id为我产生一个不同的ID
  2. 由于id更改,因此应针对get_id“产生”的每个id运行2个测试。 (基本上为每个ID重复整个测试套件/会话)

我该怎么做?

我不知道ID的列表,因为ID的变化并且不是恒定的,因此在每次测试之前都要做pytest.mark.parameterize()。

2 个答案:

答案 0 :(得分:0)

pytest.fixtures带有一个params列表:

  

params –可选的参数列表,它将导致对夹具功能和使用该功能的所有测试进行多次调用。

Examples Here

答案 1 :(得分:0)

您可以使用@pytest.mark.parametrize参数化测试功能:

  

内置的pytest.mark.parametrize装饰器为测试功能启用参数的参数化。这是一个测试功能的典型示例,该功能实现检查某些输入是否导致预期的输出

# take the following example and adjust to your needs

import pytest
@pytest.mark.parametrize("_id,expected", [
    (1, False),
    (2, True),
    (3, False),
])
def test_a_sample_even(_id, expected):
    assert expected == is_even(_id)