如果未通过,Pytest 会跳过寻找间接参数吗?

Posted

技术标签:

【中文标题】如果未通过,Pytest 会跳过寻找间接参数吗?【英文标题】:Pytest skip looking for indirect parameter if not passed? 【发布时间】:2021-04-26 22:59:02 【问题描述】:

假设我有 2 个文件 conftest.pytestcases.py。在conftest.py 中,我有一个@pytest.fixture 函数,它接受从testcases.py 中的函数间接传递的参数(参见下面的示例)。

conftest.py

    @pytest.fixture()
    def func_in_conftest(passed_parameter):
        if passed_parameter == something:
           do_something()

testcases.py

      @pytest.mark.parametrize('passed_parameter', ['some_scenario'])
      def test1(func_in_conftest):
          some_testing
    
      

      def test2(func_in_conftest):
          some_testing2

当我在test2 中没有通过passed_parameter 时,测试失败。我想知道是否有办法检查 passed_parameter 是否存在,如果不存在 -> 跳过 if 检查。

我尝试的另一个解决方案是在我不需要它的测试中使用通用值传递这个参数。它部分工作,但如果我的测试依赖于另一个测试,它们就会被跳过。我不明白为什么?示例(conftest.py 保持不变):

testcases.py

  @pytest.mark.parametrize('passed_parameter', ['all'])
  @pytest.mark.dependency()
  def test1(func_in_conftest):
      some_testing


  @pytest.mark.dependency(depends=["test1"])
  def test2(func_in_conftest):
      some_testing2

如果我将@pytest.mark.parametrize(passed_parameter, [all]) 添加到test2,它仍然会被跳过。我找不到任何解决方案,所以我决定发布。 我正在使用 pytest 5.4.1 和 pythton 3.7.7

【问题讨论】:

【参考方案1】:

夹具参数设置在request.param,所以可以检查它们是否存在,例如:


@pytest.fixture
def passed_parameter(request):
    if hasattr(request, 'param'):
        if request.param == 'one':
            yield request.param + '_changed'
        else:
            yield request.param * 2
    else:
        yield 42

@pytest.mark.parametrize('passed_parameter', ['one', 'two'], indirect=True)
def test1(passed_parameter):
    print(passed_parameter)
    # first test prints "one_changed", second prints "twotwo"

def test2(passed_parameter):
    print(passed_parameter)
    # prints 42

请注意,如果这是您的意图,您不能将参数作为固定参数传递。传递给夹具的参数必须是其他(现有)夹具。 另请注意,在这种情况下,参数名称必须与夹具名称匹配。

编辑:将示例更改为使用间接参数,以便能够产生与参数不同的夹具结果,并使其独立。

【讨论】:

是的,这是有道理的,但问题是我在 passed_parameter 中存储了一些其他信息,我需要在 test1 中使用这些信息,如果我按照您的示例中所示进行操作,我就不再可以访问原始的passed_parameter,它的值正好等于onetwo。我在这个passed_parameter 中使用了yield,所以我可以在test1 中使用它,如下所示:passed_parameter.call_some_function 我将示例更改为使用间接参数 - 检查这是否是您需要的。

以上是关于如果未通过,Pytest 会跳过寻找间接参数吗?的主要内容,如果未能解决你的问题,请参考以下文章

pytest 不跳过未标记的测试

pytest如何跳过参数化excel里面某些条件的数据

DataGrip 在执行期间跳过行

pytest文档77 - parametrize 参数化跳过部分用例(pytest.param)

如果定义了构造函数,py.test 会跳过测试类

pytest