簡體   English   中英

您如何處理嚴重依賴數據庫的測試應用程序?

[英]How do you handle testing applications that are heavily dependent on databases?

在工作中,我們發現我們的測試套件已經到了重復運行的速度太慢,我真的不喜歡它。 整個套件至少需要5分鍾,后端數據對象測試需要3分鍾以上。 所以,我很想知道人們如何進行測試。

目前,我們有一個具有實時架構和_test架構的數據庫服務器。 當測試運行時,它首先運行一個SQL腳本,該腳本說明如何填充測試數據庫(並清除可能妨礙的任何舊數據)。 幾乎所有測試都會發生這種情況 從我所看到的,這是我們測試中最大的瓶頸 - 我剛剛介紹了一個測試,設置數據庫需要大約800ms,然后每個后續測試運行大約10ms。

我一直試圖找出一些解決方案,這是我到目前為止所發現的:

  • 將測試模式填充一次,並在每次測試結束時回滾更改。

    這似乎是最簡單的解決方案,但它確實意味着我們將不得不添加一些特殊情況來測試依賴於回滾的事情(即錯誤處理測試)。

  • 盡可能模擬數據庫

    我們將為正在測試的數據對象設置數據庫,但是模擬它依賴的任何東西。 對我而言,由於兩個原因,這似乎並不出色。 首先,當我們設置數據庫時,由於外鍵依賴性,我們仍然(通常)會得到更多的行。 其次,大多數數據對象模型並不真正與其他模型交互,它們只是做JOIN。

  • 運行相同的系統,但使用轉儲和RAMFS

    我們不是運行大型SQL查詢,而是加載數據庫轉儲。 測試服務器將在RAMFS分區上運行,並希望帶來一些速度優勢。

    我無法測試這個,因為我在OSX上,從我所看到的,沒有ramfs支持。

還有其他一些選擇,比如使用SQLite,但這不是我們的選擇,因為我們依賴於一些PostgreSQL特定的擴展。

HALP! :)

一個有趣的問題。 通過你試圖對數據庫進行單元測試的事情的聲音,這是一個壞主意。 您希望這些測試盡可能快。 如果您正在使用數據層,那么您可能會考慮將其模擬出來以使其在內存中運行。 針對模擬數據層進行測試。

不要放棄你當前的測試,它們肯定是有價值的,應該作為每晚的一部分運行,或者在不減速的開發盒中構建。

編輯

在回答你的評論時,確實沒有一種加速測試的好方法。 將測試分成兩組,一組對於開發人員來說很快,另一組對於連續構建來說更合適也許是最好的選擇。 你可以扔更快的硬件,SSD或RAM磁盤將是一個很好的起點。

在亞音速項目(.net的ORM)中,我們遇到了同樣的問題,我們的測試需要花費一分鍾,因為他們不僅要打一個數據庫,還要打我們當前支持的每個數據庫的實例。 我們采取了這些測試,而不是針對數據庫運行它們,看看它們是否返回了我們預期的數據,我們假設數據庫將返回正確的結果,並且只是對生成的SQL進行了字符串比較。 當我們進行紅綠色開發時,我們只運行字符串比較單元測試。 在提交之前和構建服務器上,我們運行完整的套件。

編輯第二個

我發現自己需要針對數據庫運行測試以確認我的查詢是正確的。 我所做的是在內存中建立SQLite數據庫並對其運行查詢。 性能非常好,它確實可以很好地模擬真實數據庫,因為它是一個。

有效地使用遺留代碼時 ,Michael Feathers寫道(第10頁)

單元測試運行得很快。 如果它們沒有快速運行,它們就不是單元測試。

其他類型的測試通常偽裝成單元測試。 在以下情況下,測試不是單元測試:

  1. 它與數據庫進行對話。
  2. 它通過網絡進行通信。
  3. 它觸及文件系統。
  4. 您必須對您的環境執行特殊操作(例如編輯配置文件)才能運行它。

做這些事情的測試也不錯。 通常他們值得寫作,你通常會將它們寫在單元測試中。 但是,能夠將它們與真正的單元測試分開是很重要的,這樣您就可以保留一組測試,以便在進行更改時可以快速運行。

如果你不能快速保持你的單元測試,它們會失去價值,因為開發人員不會一直運行它們。 具體而言,Feathers將慢速單元測試定義為需要十分之一秒或更長時間才能執行的測試。

保持您的集成測試實際與數據庫通信,觸摸文件系統等,在他們自己的測試套件中與您的單元測試分開。 這些仍然需要盡可能頻繁地運行以保持反饋回路短路,但是你可以逃避運行它們,比如說,每天只運行幾次。

不要擱置您的集成測試而忘記它們! 自動執行和報告結果。 如果您正在使用持續集成服務器,請添加另一個除了定期運行測試之外什么都不做的項目。

在單元測試中,對數據庫層使用模擬或偽造。 必須重復相同的工作將變得乏味,並且避免它的願望將傾向於通過將數據庫訪問集中在幾個類中並將您的邏輯推入域模型來改進您的設計,這是您想要測試的內容的地方是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM