簡體   English   中英

Python Pytest 解包夾具

[英]Python Pytest unpack fixture

我有一個夾具,可以在測試期間創建項目列表。 我想要另一個夾具,它使用第一個夾具生成的值進行參數化。

示例代碼

import random
import pytest

@pytest.fixture
def values():
    return [random.randint(0, 100) for _ in range(10)]


@pytest.fixture
def value(request):
    return request.param


@pytest.mark.parametrize("value", params=values):
def test_function(value):
    assert value > 0

上面代碼的問題是values是一個函數而不是一個列表。 我做了很多挖掘,但沒有找到任何方法來解壓夾具來參數化另一個夾具。

我知道我可以傳遞values固定裝置並在測試中對其進行迭代,但這不是一個好的解決方案,因為我想查看哪些值導致測試失敗。

我也對替代解決方案持開放態度,例如,如果可以從開始的測試運行子測試。

這似乎是對夾具概念及其與參數概念的區別的誤解。

Pytest 有兩個主要階段:

  • 收集階段,其目標是創建要運行的測試“節點”列表。 一個測試“節點”對應一個測試 id,表示每個參數一個值。 在此階段不執行夾具,僅讀取裝飾器標記(包含參數)。 因此,只有在裝飾器中聲明參數才能影響這個階段。

  • 運行每個測試節點的執行階段 在運行之前,所有尚未設置的必需燈具都已設置。 因此,夾具功能在此階段執行,並且僅在此階段執行。 他們的結果不能修改前一階段已經完成的測試列表。

在您的示例中,您希望夾具設置(階段 B)的結果更改要創建的測試列表(階段 A):這在設計上是不可能的。 你必須在pytest別的地方創建這個列表,例如初始化鈎conftest.py或簡單地在您的任何測試模塊的共享變量,是指它在測試或夾具的參數。

另請參閱這個非常相似的問題: 參數化測試取決於 pytest 中的參數化值

請注意,為了補充hoefling 對您的問題的評論,您現在可以在參數列表中使用參數化裝置:我已在我的pytest-cases插件中添加了此功能以進行評估,以便我們最終可以建議將其合並到 pytest 中(請參閱此討論,所以不要猶豫提供反饋!)。 但不幸的是,由於上述根本原因,這並不能解決您在本文中描述的確切問題。

暫無
暫無

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

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