1

我有一個Rails測試套件,它使用DatabaseCleaner,FactoryGirlCapybara-Webkit。在運行套件時,我所有的測試都通過我的機器,包括並行運行它們(parallel_rspec)。使用集成和單元測試的整個測試套件的FactoryGirl和DatabaseCleaner最佳實踐

當我推到CI(circleci)時,我總是在我的集成測試中失敗。我懷疑這是因爲我在單元測試(控制器,服務,視圖等)中使用了transaction策略。也許這是一個不好的做法,但是如果我需要一個模型在我的控制器中(例如),我一直在做FactoryGirl.create(:my_model)。但是我懷疑我使用FactoryGirl創建模型的每個地方都應該在DatabaseCleaner中使用truncation策略進行測試。

我剛剛標記了我的整個套件,使用truncation並推送到CI,它是綠色的,這很棒,但現在套件的運行時間延長了50%。

所以,用實例FactoryGirlActiveRecord模型時,我應該總是標誌着這些測試使用truncation

感謝您的任何和所有反饋。

回答

0

需要標記爲使用截斷(或刪除)的測試是通過多個連接訪問數據庫的測試。當使用Capybara進行功能測試時,通常是使用除機架測試以外的驅動程序進行的任何測試,因爲它們在單獨的線程中運行應用程序,該應用程序將自己連接到數據庫,並由推薦的database_cleaner配置來處理 - 使用append_after對於開始清理的塊非常重要)

其他類型的測試通常不會創建多個線程或連接,因此通常不需要截斷(並且這些測試中所需的數據通常是使用FactoryGirl build_stubbed方法與find嘲笑返回存根對象並完全繞過數據庫)。

此外,如果測試通過您的機器,它們應該通過CI,因爲我認爲您的計算機上使用的是與CI相同的數據庫清理方法,所以我猜測這更像是計時問題。

0

同樣對於DatabaseCleaner,一旦你在CI容器中設置了方法,它就是爲整個運行設置的,所以最好在單獨的容器中運行你的單元測試而不是你的特性/系統測試。