如何使用设置夹具外部夹具的变量

2024-10-03 19:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在setupone夹具的外部使用产品变量。我想在skipif标记中的test_title.py中使用它来进行条件跳过(如果产品名称满足,则运行测试用例)。 conftest.py

def pytest_addoption(parser):
    parser.addoption("--browser_name", action="store", default="chrome")
    parser.addoption("--env", action="store", default="Production")
    parser.addoption("--product_name", nargs = '*', type = str, action ="store", default="chitale")

products_list = getProductList()

@pytest.fixture(scope='class', params = products_list)
def setupone(request):
    browser = request.config.getoption("browser_name")
    env_name = request.config.getoption("env")
    product = request.param

(getProductList()返回存储在产品列表中的[“product1”、“product2”、“product3”)

BaseOne.py

@pytest.mark.usefixtures("setupone")
class BaseOne:
    pass

测试标题.py

from conftest import prod

class TestStoreTitle(BaseOne):

    @pytest.mark.skipif(prod not in ["product1", "product2", "product3"], reason="test case doesn't apply for desired product")
    def test_Store_Title(self):
        pass

我想在函数之外使用来自setupone的产品,如:

def pytest_addoption(parser):
    parser.addoption("--browser_name", action="store", default="chrome")
    parser.addoption("--env", action="store", default="Production")
    parser.addoption("--product_name", nargs = '*', type = str, action ="store", default="chitale")

products_list = getProductList()

@pytest.fixture(scope='class', params = products_list)
def setupone(request):
    browser = request.config.getoption("browser_name")
    env_name = request.config.getoption("env")
    product = request.param

prod = product

Tags: storenamepybrowserenvdefaultparserpytest
1条回答
网友
1楼 · 发布于 2024-10-03 19:28:14

另一种方法是仅从其夹具setupone访问产品

  • 从夹具返回产品值setupone
  • 定义一个autouse夹具,该夹具将通过get_closest_marker()自动处理产品的跳过标记,下面是skip_product_not_in_list
  • 将所需产品列表传递给markskip_product_not_in_list
  • 如果来自setupone的当前产品不在通缉名单中,请通过pytest.skip()跳过它
import pytest

products_list = ["product1", "product2", "product3"]


@pytest.fixture(scope='class', params=products_list)
def setupone(request):
    product = request.param
    return product


@pytest.fixture(autouse=True)
def skip_non_applicable_products(request, setupone):
    if product_marker := request.node.get_closest_marker("skip_product_not_in_list"):
        if setupone not in product_marker.args[0]:
            # Option 1
            # pytest.skip(product_marker.kwargs.get('reason'))
            # Option 2
            pytest.skip(f"{product_marker.kwargs.get('reason') or 'Skipped'} {setupone}")


def test_Store_Title_all_products(setupone):
    print("test_Store_Title_all_products:", setupone)


@pytest.mark.skip_product_not_in_list(["product1", "product3"], reason="test case doesn't apply for desired product")
def test_Store_Title_skip_products(setupone):
    print("test_Store_Title_skip_products:", setupone)

输出

$ pytest -rPS test_src.py
============================================== PASSES ===============================================
______________________________ test_Store_Title_all_products[product1] ______________________________
                   - Captured stdout call                     
test_Store_Title_all_products: product1
_____________________________ test_Store_Title_skip_products[product1] ______________________________
                   - Captured stdout call                     
test_Store_Title_skip_products: product1
______________________________ test_Store_Title_all_products[product2] ______________________________
                   - Captured stdout call                     
test_Store_Title_all_products: product2
______________________________ test_Store_Title_all_products[product3] ______________________________
                   - Captured stdout call                     
test_Store_Title_all_products: product3
_____________________________ test_Store_Title_skip_products[product3] ______________________________
                   - Captured stdout call                     
test_Store_Title_skip_products: product3
====================================== short test summary info ======================================
SKIPPED [1] test_src.py:19: test case doesn't apply for desired product product2
============================== 5 passed, 1 skipped, 1 warning in 0.08s ==============================
  • 对于test_Store_Title_all_products,它测试了所有产品。对于test_Store_Title_skip_products,我们在其中定义了一个自定义列表,我们可以看到它跳过了"product2",因为它不在列表中

相关问题:

相关问题 更多 >