2011-05-10 68 views
13

很多時候人們寫測試時,他們會在狀態混亂後自行清理。通常這並不重要,因爲對於大多數測試來說對象傾向於被拆除和重新創建,但是有一些不幸的情況是對象的全局狀態會持續整個測試運行,並且當您運行測試時依賴於並修改那個全球國家,按照一定的順序,它們失敗了。有沒有一種很好的方法來調試RSpec(RSpec2)中依賴於順序的測試失敗?

這些測試和可能的實現顯然需要修復,但試圖找出在相互影響的測試可能不是完整測試套件中唯一的東西時導致失敗的原因是一件很痛苦的事情。當最初並不清楚故障是否與訂單相關時尤爲困難,並且可能間歇性地或在一臺機器上而不是在另一臺機器上故障。例如:

rspec test1_spec.rb test2_spec.rb # failures in test2 
rspec test2_spec.rb test1_spec.rb # no failures 

在RSpec的1有some options (--reverse, --loadby)訂購的測試運行,但那些已經在RSpec 2消失,只是在調試反正這些問題的最低限度的幫助。

我不確定RSpec 1或RSpec 2默認使用的順序,但是我過去使用的一個自定義設計的測試套件在每次運行時隨機地對測試進行排序,以便更快地發現這些故障。在測試輸出中,用於確定排序的種子與結果一起打印,因此即使您必須做一些工作來縮小套件中引起它們的各個測試的範圍,也很容易重現故障。然後有一些選項允許您在任何給定的測試文件中按順序啓動和停止,這使您可以輕鬆地進行二分查找以找到問題測試。

我還沒有在RSpec中找到任何這樣的實用程序,所以我在這裏問:人們發現調試這些類型的順序依賴測試失敗有什麼好方法?

+0

這是非常修辭。你能嘗試簡化這個問題嗎? – 2011-05-10 06:32:38

+1

這就是標題/標題的用途。最後一句話。其餘的是澄清我的意思是「順序依賴測試失敗」,因爲我沒有找到其他問題處理,然後試圖描述我在尋找什麼樣的解決方案。如果這兩者對於閱讀這個問題的其他人都是顯而易見的,那麼我同意其他的verbage過於誇張,但我不確定這是否明顯。 – mmrobins 2011-05-10 06:44:25

回答

4

我不會說我有一個很好的答案,我很想在這裏比我的一些更好的解決方案。這說...

我唯一真正的技術,我調試這些問題是添加一個全球性(通過spec_helper)鉤打印某些方面的數據庫狀態(我通常的罪魁禍首)之前和之後每個測試(條件檢查是否我關心與否)。最近的一個例子是在我的spec_helper.rb中添加了這樣的內容。

Spec::Runner.configure do |config| 
    config.before(:each) do 
    $label_count = Label.count 
    end 

    config.after(:each) do 
    label_diff = Label.count - $label_count 
    $label_count = Label.count 
    puts "#{self.class.description} #{description} altered label count by #{label_diff}" if label_diff != 0 
    end 
end 
+0

感謝您的回答,但它並不能幫助我,因爲軟件我測試不會有一個數據庫,以及訂單相關的故障是沒有這麼預見,一個print語句這一般會幫我:-( – mmrobins 2011-05-20 04:05:50

1

我們對自己的持續集成的設置是水珠一個Rails應用程序的規範/目錄並運行它們不受對方一個測試。

需要很多時間,但我們發現5或6個依賴關係。

+4

你有代碼爲方便?這聽起來相當有用。 – 2012-04-23 00:27:28

+5

[古人的智慧...](https://xkcd.com/979/) – Brian 2014-04-15 12:18:55

0

它最有可能的一些狀態持續在測試之間,所以確保您的數據庫和任何其他數據存儲(包括類var和全局變量)在每次測試後重置。 database_cleaner寶石可能會有所幫助。

1

下面是一些快速髒的劇本我寫的調試命令相關的故障 - https://gist.github.com/biomancer/ddf59bd841dbf0c448f7

它由兩個部分組成。

第一個旨在多次使用不同的種子和轉儲結果運行rspec訴訟到當前目錄中的rspec_[ok|fail]_[seed].txt文件以收集統計信息。

第二部分遍歷所有這些文件,提取測試組名稱並分析它們對受影響測試的位置,以便對依賴關係進行假設並形成一些「風險」組 - 安全,不安全等。腳本輸出解釋其他細節和組意義。

該腳本將正常工作只爲簡單的依賴關係,並只有在受影響的試驗失敗了一些種子,並通過另一個的,但我認爲它仍然是聊勝於無。 在我的情況是複雜的依賴關係時的效果,可以通過另一個測試取消,但這個劇本讓我來運行其分析在不同的組轉儲的一部分多次後得到的方向,特別是只對那些失敗(我剛搬到「OK」轉出當前目錄)。

8

現在有一個--bisect標誌,會發現最小的一組測試運行重現故障。請嘗試:

$ rspec --bisect=verbose 

使用--fail-fast標誌也可能有用。

+0

這項工作是一個了不起的功能。完美地解決了我的問題。謝謝!應該是最好的答案。 – 2016-08-23 12:22:47

相關問題