在pytest中測試預期的異常使用pytest.raises。
with pytest.raises(TypeError): tasks.add(task='not a Task object')
上面這個語句的意思是:無論什么時候,當tasks.add(task='not a Task object')拋出TypeError時,測試通過;當tasks.add(task='not a Task object')沒有拋出異常,或者拋出的異常不是TypeError類的異常時,都是失敗的。
with pytest.raises(ValueError) as excinfo: tasks.start_tasks_db('some/great/path', 'mysql')
注:在包含pytest.raises()的with語句塊中,要拋出異常的語句一定是最后一個語句,如果不是,拋出異常語句后面的語句不會執行;上例中,在tasks.start_tasks_db('some/great/path', 'mysql')后面如果有其他語句的話,都不會執行;(更多詳細信息使用help(pytest.raises)查看,使用前先import pytest)
with pytest.raises(ValueError) :使用with語句進行上下文管理,調用pytest的raises方法可以得到一個ExceptionInfo類型的返回值,這個返回值包含了ValueError異常發生時的所有上下文信息,我們可以使用他們來判斷異常的發生是否符合預期。
exception_msg = excinfo.value.args[0] assert exception_msg == "db_type must be a 'tiny' or 'mongo'"
注:ExceptionInfo類型繼承自Python的基本異常類Exception,它主要使用的3個屬性是:type,value和traceback;上例中就是讀取了value屬性中的args屬性(捕獲異常提供的參數列表)。python基礎異常類Exception的默認行為是接受所有傳遞的參數並將它們以元組形式存儲在 .args 屬性中。
關於python使用基本異常類Exception的args屬性的補充說明;詳見URL:https://blog.csdn.net/Enjolras_fuu/article/details/83629064
以下實例說明了Exceptioninfo類型常用的三個屬性(value、type和traceback)的用法:
運行:pytest -s -k "raise" test_pytest_example.py
說明:
type屬性:是指捕獲的異常是那種類型如:ValueError,TypeError等
Value屬性:記錄了捕獲的異常返回的信息,它的args屬性是一個列表用於讀取異常信息
traceback屬性:捕獲異常的運行跟蹤信息。