2009-01-29 40 views
4

我的應用程序(使用Shoulda)有357個測試(534個斷言)。整個測試套件在大約80秒內運行。這次好嗎?我只是好奇,因爲這是我的第一個應用程序,我廣泛地編寫測試。沒有花哨的東西在我的應用程序。在Rails中運行測試套件的速度

順便說一句:我想在內存中的sqlite3數據庫中使用,但結果令人驚訝的糟糕(約83秒)。這裏有什麼線索?

我使用MacBook配備2GB的RAM和2GHz的Intel Core Duo處理器作爲我的開發機。

回答

1

這真的取決於你的測試都在做。測試代碼可以有效或不完全與其他代碼完全相同。在許多情況下

一個明顯的優化是編寫測試代碼以這樣的方式,一切(或儘可能)在內存中完成,而不是多讀/寫入到數據庫中。但是,您可能必須更改您的應用程序代碼才能使用正確的接口來實現此目的。

+0

正如我在我的問題中提到的,我試圖在內存數據庫中使用,但不幸沒有成功。 :( – 2009-01-29 14:44:06

+0

即使數據庫在內存中,也可能會有開銷讀取和寫入它 – DanSingerman 2009-01-29 14:55:39

+0

db有多大? - 如果在內存中放入更多內容會降低速度,可能是系統正在分頁。 – 2009-01-30 10:54:12

2

我不覺得這個問題是特定的軌道,所以我會插入內容。

有關測試的主要問題是,它應該是足夠快,您可以運行他們很多(如,所有的時間)。此外,您可能希望將測試分爲幾個不同的集合,特別是「長時間運行測試」和「單元測試」。

最後一個值得考慮的選擇,如果你的數據庫的設置是費時,將通過從備份中恢復,而不是做了一大堆插件創建您的域名。

祝你好運!

1

大型測試套件,可能需要一些時間來運行。

我開發時,一般使用「autospec -f」,這種只運行上次運行以來已更改的功能 - 使得它更有效,讓您的測試運行。

當然,如果你真的是認真的,你會遇到一個持續集成設置像巡航控制系統 - 這將自動化構建過程,並在後臺運行,檢查您的最新構建和運行套件。

+0

我已經使用了很長時間的自動測試,並在幾天前建立了一臺CI服務器,我對此很滿意 – 2009-01-29 14:50:08

0

至於相反在內存中的SQLite,你可以把一個MySQL數據庫上RAMDISK(在Windows上)或在Linux上的tmpfs。

MySQL有一個非常有效的緩衝,所以把數據庫中存儲不有很大的幫助,直到你真的經常更新了大量的數據。

更多顯著是測試隔離並且對於每個測試數據準備的方法。

您可以使用交易裝置。這意味着每個測試都會被包裝到事務中,因此下一次測試將從初始階段開始。

這比每次測試前清理數據庫更快。

還有,當你想使用這兩種交易和明確的數據擦除的情況下,這裏是一個關於它的好文章:http://www.3hv.co.uk/blog/2009/05/08/switching-off-transactions-for-a-single-spec-when-using-rspec/

0

您可以預加載燈具實驗,但將難以維持,而且,恕我直言,不值得它的速度改進(我認爲最大值是20%,但它取決於)

已知SQLite比mysql/pgsql慢,除了非常小,很小的DB。正如有人已經說過的,你可以將MySQL(或其他數據庫)數據文件放在某種RAMDisk上(我在linux上使用tmpfs)。 PS:我們現在有1319個Rspec的例子,它在C2D-3Ghz-4GRam上運行了230秒,我認爲它很好。所以,你的也很好。