我正在用 pycharm 中的 pytest 撰寫測驗。測驗分為不同的類別。
我想指定必須在其他類之前運行的某些類。
我已經看到有關 stackoverflow 的各種問題(例如指定 pytest 測驗從檔案運行以及如何在所有其他測驗之前運行方法)。
這些和其他各種問題都想選擇特定的功能來按順序運行。據我了解,這可以使用fixturesor with來完成pytest ordering。
我不在乎每個類中的哪些函式首先運行。我只關心這些類按照我指定的順序運行。這可能嗎?
uj5u.com熱心網友回復:
方法
您可以使用pytest_collection_modifyitems鉤子來修改收集的測驗的順序 ( items)。這具有不必安裝任何第三方庫的額外好處。
使用一些自定義邏輯,這允許按類排序。
完整示例
假設我們有三個測驗類:
TestExtractTestTransformTestLoad
還要說,默認情況下,執行的測驗順序將按字母順序排列,即:
TestExtract-> TestLoad->TestTransform
由于測驗類的相互依賴性,這對我們不起作用。
我們可以添加如下內容來強制執行我們想要的執行順序pytest_collection_modifyitems:conftest.py
#conftest.py
def pytest_collection_modifyitems(items):
"""Modifies in place test items to execute test classes in a given order."""
CLASS_ORDER = ["TestExtract", "TestTransform", "TestLoad"]
# Enforce class order by iteratively pushing tests in a class to
# the end of the execution queue
sorted_items = items.copy()
for class_ in CLASS_ORDER:
items_class = [item.cls.__name__ for item in sorted_items]
first_index = items_class.index(class_)
last_index = len(items_class) - items_class[::-1].index(class_)
sorted_items = (
sorted_items[:first_index]
sorted_items[last_index:]
sorted_items[first_index:last_index]
)
items[:] = sorted_items
關于實作細節的一些評論:
items_class映射每個類itemfirst_index并last_index參考屬于正在考慮的測驗類別的專案的第一個和最后一個索引- 假設測驗類具有唯一的名稱
- 測驗類可以存在于不同的模塊中
CLASS_ORDER不必詳盡無遺。您可以只重新排序要強制執行訂單的那些類(但請注意:如果重新排序,任何未重新排序的類將在任何重新排序的類之前執行)- 類內的測驗順序保持不變
- 排序演算法可能沒有它應有的效率(但老實說,我還沒有找到一個測驗套件,這可能很重要)
items必須就地修改,因此最終items[:]分配
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/416017.html
標籤:
