2015-08-21 97 views
0

我的團隊在這個問題上幾個星期以來一直困惑不解。我們有一個使用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容器。

失敗的測試是一系列子測試,每個子測試都測試我們擁有的過濾搜索功能;每個子測試都是一個不同的過濾器查詢。每個子測試的順序是:

  1. 查找過濾搜索欄元素
  2. 發送過濾查詢(一個字符串,即像"function = int main()"
  3. 模擬瀏覽器點擊執行查詢
  4. 對於該組數據上的特定過濾器(該組數據在整個分測驗中是一致的),斷言返回結果的長度與該特定過濾器的預期匹配度

當在Travis CI中運行時,經常會通過此測試,並且如前所述,此測試在本地運行時始終通過。在網絡瀏覽器中手動與網站進行交互時,無法再現錯誤。然而,一旦在一段時間,這種錯誤會出現在特拉維斯CI測試輸出:

- Broken pipe from ('127.0.0.1', 39000) 
- Broken pipe from ('127.0.0.1', 39313) 

3900039313並不總是號碼 - 這些改變每一個新的特拉維斯CI構建運行時間。這些看起來像端口號,雖然我不確定它們實際是什麼。

在獲取過濾器結果列表之前,我們有time.sleep(sec)行。增加睡眠時間通常會與破損管道錯誤的臨時修復相關聯。然而,測試非常易變,改變睡眠時間可能與修復錯誤無關;有些時候睡眠時間已經減少或者從一個分測試中取出,並且測試會通過。在任何情況下,由於管道損壞,過濾器無法執行,斷言失敗。

一個潛在有趣的細節是,無論子測試的順序如何,它總是第一個子測試失敗,如果發生管道故障錯誤。但是,如果第一個子測試通過,那麼所有子測試總是會通過。

所以,我的問題是:這裏究竟發生了什麼,我們如何確保這個隨機錯誤停止發生?道歉,如果這是一個模糊/令人困惑的問題,但不幸的是,這是問題的本質。

+0

你能得到性能日誌您的應用程序嗎?你的應用程序可能失敗了嗎? – Arran

+0

因爲所有其他測試都通過,所以無法想象它會失敗。就像我說的,測試通過特拉維斯100%的時間,錯誤不能通過正常使用網站來重現。在特拉維斯,測試依然通過比較多。性能日誌是什麼意思?該應用程序有與數據庫查詢相關的時間日誌,但我無法想象這樣的事情有助於診斷問題。 –

回答

1

看起來您的問題可能與this fellow遇到的問題類似。這可能是您的超時問題。您可能希望使用明確的等待,或者在比較數據之前嘗試等待加載特定的元素。我和我的測試有類似的問題,我的Selenium測試會在頁面加載完成之前嘗試輪詢圖像以查看它是否存在。就像我說的,這可能不是同一個問題,但可能有幫助。祝你好運!

+0

最初我對這個答案持懷疑態度,因爲我們已經做了大量的顯式等待的擺弄,沒有實際效果。然而,似乎有一個子測試有足夠長的顯式等待時間('time.sleep')終於實現了。本來它根本沒有這種等待。然而,在加入了足夠長的等待時間並經歷了11次Travis構建之後,沒有失敗,所以它似乎已經修復了! –

0

我剛剛遇到了這個問題,這是由於django的內置服務器沒有使用python的日誌記錄系統造成的。這已被固定在1.10,但在撰寫本文時尚未發佈。在我的情況下,可以將消息保留在日誌中,直到需要升級;比添加超時和增加構建時間更好。

相關問題