還是一篇關於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,供測試用例發起請求,斷言等使用。
三、執行測試
執行測試用例,可以看到最終的運行過程:
參數分別執行,並且在對應測試用例的開始跟結尾做好測試數據的插入和刪除工作。