我正在使用Python和Webtest來測試WSGI應用程序。我發現,在處理程序代碼引起的異常往往被WebTest的被吞噬,然後提出了一個通用的:在Webtest測試失敗中找到真正的錯誤
AppError: Bad response: 500 Internal Server Error
我怎麼告訴它提高或打印導致原來這個錯誤?
我正在使用Python和Webtest來測試WSGI應用程序。我發現,在處理程序代碼引起的異常往往被WebTest的被吞噬,然後提出了一個通用的:在Webtest測試失敗中找到真正的錯誤
AppError: Bad response: 500 Internal Server Error
我怎麼告訴它提高或打印導致原來這個錯誤?
您的WSGI框架和服務器包含處理程序,它們捕獲異常並執行某些操作(在主體中呈現堆棧跟蹤,將回溯記錄到日誌文件等)。默認情況下,Webtest不會顯示實際的響應,如果您的框架在正文中呈現堆棧跟蹤,這可能會非常有用。我用下面的擴展WebTest的,當我需要看一下響應的正文:
class BetterTestApp(webtest.TestApp):
"""A testapp that prints the body when status does not match."""
def _check_status(self, status, res):
if status is not None and status != res.status_int:
raise webtest.AppError(
"Bad response: %s (not %s)\n%s", res.status, status, res)
super(BetterTestApp, self)._check_status(status, res)
獲得了發生了什麼異常取決於你使用的是什麼框架和服務器的控制。對於內置的wsgiref
模塊,您可能可以覆蓋error_output以實現您想要的效果。
報告上游:https://github.com/Pylons/webtest/issues/176 –
儘管clj的答案肯定有效,但您仍然可能想要在測試用例中訪問響應。爲此,當您向TestApp發出請求時,可以使用expect_errors=True
(來自webtest documentation),這樣就不會引發AppError。這裏是一個我期待403錯誤的例子:
# attempt to access secure page without logging in
response = testapp.get('/secure_page_url', expect_errors=True)
# now you can assert an expected http code,
# and print the response if the code doesn't match
self.assertEqual(403, response.status_int, msg=str(response))
感謝您的支持!我沒有在我的測試中捕獲其他異常,直到看到expect_errors arg。 –
在WSGI配置中會有'error'重定向到某個文件。您可以檢查某些文件是否有錯誤。 – Nilesh