我的團隊在這個問題上幾個星期以來一直困惑不解。我們有一個使用LiveServerTestCase
的測試套件,可以運行我們所有的基於Selenium的測試。特別是一個測試看起來會隨機無故失時 - 我可以在另一個文件中更改註釋,並且測試會失敗。改變一些其他評論會再次修復測試。我們使用Firefox網絡驅動程序進行Selenium測試:Django Selenium測試在特拉維斯CI中有時會失敗
self.driver = Firefox()
在我們的Docker容器中進行本地測試不會再現錯誤。這很可能是由於以下事實:當tests.py
在Travis CI之外運行時,將使用與Firefox()
不同的網絡驅動程序。 Web驅動程序是這樣的:
self.driver = WebDriver("http://selenium:4444/wd/hub", desired_capabilities={'browserName':'firefox'})
對於本地測試,我們使用Selenium容器。
失敗的測試是一系列子測試,每個子測試都測試我們擁有的過濾搜索功能;每個子測試都是一個不同的過濾器查詢。每個子測試的順序是:
- 查找過濾搜索欄元素
- 發送過濾查詢(一個字符串,即像
"function = int main()"
) - 模擬瀏覽器點擊執行查詢
- 對於該組數據上的特定過濾器(該組數據在整個分測驗中是一致的),斷言返回結果的長度與該特定過濾器的預期匹配度
當在Travis CI中運行時,經常會通過此測試,並且如前所述,此測試在本地運行時始終通過。在網絡瀏覽器中手動與網站進行交互時,無法再現錯誤。然而,一旦在一段時間,這種錯誤會出現在特拉維斯CI測試輸出:
- Broken pipe from ('127.0.0.1', 39000)
- Broken pipe from ('127.0.0.1', 39313)
39000
和39313
並不總是號碼 - 這些改變每一個新的特拉維斯CI構建運行時間。這些看起來像端口號,雖然我不確定它們實際是什麼。
在獲取過濾器結果列表之前,我們有time.sleep(sec)
行。增加睡眠時間通常會與破損管道錯誤的臨時修復相關聯。然而,測試非常易變,改變睡眠時間可能與修復錯誤無關;有些時候睡眠時間已經減少或者從一個分測試中取出,並且測試會通過。在任何情況下,由於管道損壞,過濾器無法執行,斷言失敗。
一個潛在有趣的細節是,無論子測試的順序如何,它總是第一個子測試失敗,如果發生管道故障錯誤。但是,如果第一個子測試通過,那麼所有子測試總是會通過。
所以,我的問題是:這裏究竟發生了什麼,我們如何確保這個隨機錯誤停止發生?道歉,如果這是一個模糊/令人困惑的問題,但不幸的是,這是問題的本質。
你能得到性能日誌您的應用程序嗎?你的應用程序可能失敗了嗎? – Arran
因爲所有其他測試都通過,所以無法想象它會失敗。就像我說的,測試通過特拉維斯100%的時間,錯誤不能通過正常使用網站來重現。在特拉維斯,測試依然通過比較多。性能日誌是什麼意思?該應用程序有與數據庫查詢相關的時間日誌,但我無法想象這樣的事情有助於診斷問題。 –