2013-01-04 78 views
2

我也問過這個,但是對答案並不滿意。代碼推送給Jenkins時的隨機測試失敗

我用什麼:

  • 工作的Django/Python的網站。
  • 開發在本地執行python虛擬環境。
  • 使用Git爲我的SCM
  • 部署了針對GIT
  • 開發與生產分公司使用詹金斯CI持續集成獨立的虛擬服務器。單獨的虛擬服務器部署詹金斯

工作:

  • 我有單元測試,冒煙測試和集成測試的網站。 Jenkins已經設置好了,只要代碼從我的本地git分支被推到git倉庫的Developer和Production分支上,Jenkins就會觸發構建。

問題:

  • 我的測試是在本地傳遞時,我做了「蟒蛇manage.py測試」
  • 隨機試驗(主要是單元測試)無法在詹金斯時碼推到其他分(開發和生產)。
  • 在測試失敗後,如果通過在Jenkins中按下「立即生成」按鈕來手動執行構建,測試通常會通過並且構建成功。
  • 有時候,當代碼沒有改變,代碼仍然被推送到這些分支時,測試在Jenkins中隨機失敗。

一些常見錯誤:

  • 的AssertionError:302 = 200
  • 類型錯誤:!NoneType'對象未標化的
  • IndexError:列表索引超出範圍
  • 的AssertionError:日期時間.datetime(2012,12,5,0,0,27,218397)!= datetime.datetime(2012,12,5,0,27,239884)
  • AssertionError:響應重定向到'x'期望的' Y」

故障排除,直到日期:

  • 然本地所有的測試我的機器上,並在虛擬服務器上。他們運行良好。
  • 在本地和在虛擬服務器上運行單個失敗測試。他們運行良好。
  • 試圖重新創建失敗的條件,但截至目前,測試正在通過。

我看到的唯一問題是,無論何時將代碼推送給開發人員和生產brnaches,隨機測試失敗都會啓動。某些測試重複失敗。

任何人都可以告訴我,我可以做些什麼來解決這個問題。我試圖用Google搜索這個問題,但徒勞無功。我知道xunitpatterns網站對不穩定的測試行爲有一些很好的見解,但它並沒有幫助,因爲我嘗試了大部分的東西。

+0

連結您的其他問題,你已經張貼? –

+0

[上一個問題](http://stackoverflow.com/questions/14105745/random-test-failures-in-jenkins/14105839#comment19518597_14105839) – SaurabhM

+0

詹金斯可能會改變你的測試運行的順序。如果你的測試不是'不是真正的單位測試,而是可能在導致這些問題的測試之間持續存在的東西。 –

回答

1

這是一個很難回答的問題。

django開發者可能會遇到一些常見的陷阱,但我不知道。

以外的是,這只是正常的調試:

  1. 找到一個方法來重現故障。如果你可以讓自己的筆記本電腦失敗,那很好。如果你不能,你必須在失敗的機器上進行調試。

  2. 獲取更多信息。斷言可以在失敗時打印自定義消息。打印相關變量的值。將調試打印輸出添加到您的代碼和測試中。看看事情不是他們應該的方式。 Google如何使用Python調試器。

保持開放的態度。該錯誤可以在任何地方:硬件,軟件環境,代碼或測試代碼中。但除非你是上帝,否則Linus Torvalds或者Brian Kernighan這是一個安全的第一個假設,這個錯誤來自你的鍵盤和座位後面的某個地方。 (以上所有三個黑客都犯了錯誤)

0

對於問題 - AssertionError:datetime.datetime(2012,12,5,0,27,218397)!= datetime.datetime(2012, 12,5,0,27,239884)

我已經使用freezegun庫來使日期時間更可預測。 我不知道爲什麼會出現這個問題,但凍結日期和時間有一定幫助。

例如:

from freezegun import freeze_time 
import datetime 
import unittest 


@freeze_time("2012-01-14") 

def test(): 

assert datetime.datetime.now() == datetime.datetime(2012, 1, 14) 
+0

這只是一種解決方法還是解決了問題? – zeropublix