簡體   English   中英

pytest_generate_tests 中的 pytest.skip 跳過模塊中的所有測試函數而不是特定測試

[英]pytest.skip within pytest_generate_tests skips all test functions in module instead of specific tests

我正在使用 pytest_generate_tests 掛鈎使用在外部 YAML 文件中定義的變量對 pytest 測試進行參數化。 變量文件的名稱在 pytest 命令行 (--params_file) 中指定。 只有模塊中的一些測試函數被參數化並且需要此文件中的變量。 因此,定義變量的命令行選項是一個可選參數。 如果命令行中省略了可選參數,那么我希望 pytest 只“跳過”那些需要外部參數化變量的測試函數,只運行未參數化的“其他”測試。 問題是,如果省略命令行選項,pytest 將跳過所有測試函數,而不僅僅是需要參數的測試函數。

這是測試模塊文件:

def test_network_validate_1(logger, device_connections,):

  ### Test code omitted.....


def test_lsp_throttle_timers(params_file, logger, device_connections):

  ### Test code omitted.....

def test_network_validate_2(logger, device_connections,):

  ### Test code omitted.....

conftest.py 中的 pytest_generate_tests 鈎子:

# Note, I tried scope at function level as well but that did not help
@pytest.fixture(scope='session')
def params_file(request):
    pass

def pytest_generate_tests(metafunc):
  
    ### Get Pytest rootdir
    rootdir = metafunc.config.rootdir

    print(f"*********** Test Function: {metafunc.function.__name__}")

    if "params_file" in metafunc.fixturenames:
        print("*********** Hello Silver ****************")
        if metafunc.config.getoption("--params_file"):

            #################################################################
            # Params file now located as a separate command line argument for
            # greater flexibility
            #################################################################
            params_file = metafunc.config.getoption("--params_file")
            params_doc = dnet_generic.open_yaml_file(Path(rootdir, params_file),
                                                    loader_type=yaml.Loader)

            test_module = metafunc.module.__name__
            test_function = metafunc.function.__name__
            names,values = dnet_generic.get_test_parameters(test_module,
                                                            test_function,
                                                            params_doc,)

            metafunc.parametrize(names, values )
        else:
            pytest.skip("This test requires the params_file argument")

當存在 params_file 選項時,一切正常:

pytest isis/test_isis_lsp_throttle.py --testinfo topoA_r28.yml --ulog -s --params_file common/topoA_params.yml  --collect-only
===================================================================================== test session starts =====================================================================================
platform linux -- Python 3.7.4, pytest-3.7.0, py-1.8.0, pluggy-0.13.0
rootdir: /home/as2863/pythonProjects/p1-automation, inifile: pytest.ini
plugins: csv-2.0.1, check-0.3.5, pylama-7.6.6, dependency-0.4.0, instafail-0.4.0, ordering-0.6, repeat-0.7.0, reportportal-5.0.3
collecting 0 items                                                                                                                                                                            *********** Test Function: test_network_validate_1
*********** Test Function: test_lsp_throttle_timers
*********** Test Function: test_network_validate_2
collected 3 items
<Package '/home/as2863/pythonProjects/p1-automation/isis'>
  <Module 'test_isis_lsp_throttle.py'>
    <Function 'test_network_validate_1'>
    <Function 'test_lsp_throttle_timers'>
    <Function 'test_network_validate_2'>

================================================================================ no tests ran in 0.02 seconds =================================================================================                                                                                                                                                                            

當 params_file 選項被省略時,您可以看到沒有運行任何測試,打印語句顯示它甚至沒有嘗試在“test.network_validate_2”上運行 pytest_generate_tests

pytest isis/test_isis_lsp_throttle.py --testinfo topoA_r28.yml --ulog -s  --collect-only                         ===================================================================================== test session starts =====================================================================================
platform linux -- Python 3.7.4, pytest-3.7.0, py-1.8.0, pluggy-0.13.0
rootdir: /home/as2863/pythonProjects/p1-automation, inifile: pytest.ini
plugins: csv-2.0.1, check-0.3.5, pylama-7.6.6, dependency-0.4.0, instafail-0.4.0, ordering-0.6, repeat-0.7.0, reportportal-5.0.3
collecting 0 items

*********** Test Function: test_network_validate_1
*********** Test Function: test_lsp_throttle_timers
*********** Hello Silver ****************
collected 0 items / 1 skipped

================================================================================== 1 skipped in 0.11 seconds ==================================================================================

正如在討論中發現的評論,你不能使用pytest.skippytest_generate_tests ,因為它會在模塊的范圍內工作。 要跳過具體測試,您可以執行以下操作:

@pytest.fixture
def skip_test():
    pytest.skip('Some reason')

def pytest_generate_tests(metafunc):
    if "params_file" in metafunc.fixturenames:
        if metafunc.config.getoption("--params_file"):
            ...
            metafunc.parametrize(names, values )
        else:
            metafunc.fixturenames.insert(0, 'skip_test')

例如,您引入了一個將跳過具體測試的夾具,並將此夾具添加到測試中。 確保將其作為第一個夾具插入,因此不會執行其他夾具。

雖然 MrBean Bremen 的答案可能有效,但根據 pytest 作者的說法,動態更改燈具列表並不是他們真正想要支持的。 然而,這種方法得到了更多支持。

# This is "auto used", but doesn't always skip the test unless the test parameters require it
@pytest.fixture(autouse=True)
def skip_test(request):
    # For some reason this is only conditionally set if a param is passed
    # https://github.com/pytest-dev/pytest/blob/791b51d0faea365aa9474bb83f9cd964fe265c21/src/_pytest/fixtures.py#L762
    if not hasattr(request, 'param'):
        return

    pytest.skip(f"Test skipped: {request.param}")

在您的測試模塊中:

def _add_flag_parameter(metafunc: pytest.Metafunc, name: str):
    if name not in metafunc.fixturenames:
        return

    flag_value = metafunc.config.getoption(name)
    if flag_value:
        metafunc.parametrize(name, [flag_value])
    else:
        metafunc.parametrize("skip_test", ["Missing flag '{name}'"], indirect=True)

def pytest_generate_tests(metafunc: pytest.Metafunc):
    _add_flag_parameter(metafunc, "params_file")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM