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() 返回存储在 product_list 中的 ["product1", "product2", "product3"])
BaseOne.py
@pytest.mark.usefixtures("setupone")
class BaseOne:
pass
test_title.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
解决方案
另一种方法是仅从其夹具访问产品setupone
。
- 从夹具返回产品的值
setupone
- 定义一个 autouse-fixture,它将通过get_closest_marker()自动处理产品的跳过标记,如下所示
skip_product_not_in_list
- 将通缉产品清单传递给标记
skip_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"
因为它不在列表中。
相关问题:
推荐阅读
- r - 根据另一个值填写列
- mysql - 我是编程新手,我的表是存在的,但它显示未知列
- r - 可能使用两种色标(解决方法)?
- php - $_POST 返回空数组
- javascript - 为什么组件之间的angular2单向绑定对对象不起作用?
- mysql - mysql2:系统升级后在 /usr/local/Cellar/mysql@5.6/5.6.42/bin/mysql_config 找不到 mysql_config
- python - 获取'str'对象对于peewee DateTimeField没有属性'isoformat'
- jquery - Jquery滚动没有循环
- node.js - 在关闭节点 js 服务器之前清除事件循环
- normalization - 使用 Data Fusion 将 BigQuery 表(源,包含 ARRAY/STRUCT)通过将“Wrangler”转换为相应的“规范化”BigQuery 表