【pytest】(十二)參數化測試用例中的setup和teardown要怎麼寫?

還是一篇關於pytest的fixture在實際使用場景的分享。

fixture我用來最多的就是寫setup跟teardown了,那麼現在有一個用例是測試一個列表接口,參數化了不同的狀態值傳參,來進行測試。

那麼對於這個用例的setup跟teardown,我就要在setup裏插入不同狀態的測試數據,並且在測試完成後,在teardown裏清除掉插入的數據。

一、setup

不過在插入數據的時候,我不想要一次性的把所有狀態的數據都插入進去。比如1,2,3,4,5 有5個狀態的參數,我想執行1的時候,插入狀態
1的數據,測試完成後,刪除剛纔插入的這條數據,後面以此類推。

那麼,這裏還是要用到參數傳遞的一個效果了,這個在之前的文章裏也講過,有興趣可以去看下,這裏不再贅述。

@pytest.fixture(params=[1, 2, 3, 4, 5])
def init_allot_task_status(request):
    status = request.param
    db = DB()
    insert_allot_task_sql = """
    INSERT INTO purchase_allot (`id`, `allot_sn`... )
    """.format(10000086, status)
    db.exec_sql(insert_allot_task_sql)
    yield status #這裏把參數給出去,供測試用例使用
    delete_sql = "DELETE from sm_purchase_allot WHERE id = {}".format(10000086)
    print("執行delete-sql:", delete_sql)
    db.exec_sql(delete_sql)
    db.close()

yield之前,其實做的就是插入數據,並且通過yield把request.param拿到的參數給出去,給測試用例使用。

二、teardown

yield之後,則就是刪除之前插入的數據了,這裏我爲了方便,插入的測試數據id取了一個單獨的,所以刪除的時候直接刪除這個id的數據即可。

再來看一下測試用例

def test_allot_list_query_by_status(init_allot_task_status):
    """
    測試不同狀態的列表查詢
    在fixture中做了參數化
    1-待處理、2-處理中、3-已發貨、4-已完成、5已取消
    """
    payload = {"status": init_allot_task_status} # 因爲fixture中的yield做了參數的返回,這裏可以直接使用
    r = requests.post(QA_URL + API_URL, json=payload, headers=HEADER)
    result = r.json()

    assert result["result"] == "ok"
    assert result["errmsg"] == "success"
    assert result["row"]["taskListOfPage"]["resultData"][0]["status"] == init_allot_task_status # 因爲fixture中的yield做了參數的返回,這裏可以直接使用

將fixture init_allot_task_status傳入測試case中,這樣的話 在case執行的時候會先執行fixture方法,而fixture在執行的時候,則會進行參數化,並且把每次使用的參數
返回給測試case,供測試用例發起請求,斷言等使用。

三、執行測試

執行測試用例,可以看到最終的運行過程:

參數分別執行,並且在對應測試用例的開始跟結尾做好測試數據的插入和刪除工作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章