2017-04-08 47 views
-1

我在集成測試中有一個非常特殊的情況。可以在集成測試中打到數據庫嗎?

我正在開發一個由少量使用spring引導的微服務組成的Rest API。這些服務中的一些基本上具有crud操作,可以由UI應用程序訪問或用於內部驗證/查詢。

所有的數據庫操作都是通過遺留庫(無jpa)的過程完成的,我使用的是非標準數據庫。我知道好的做法說不使用真正的數據庫,但在這種情況下,我無法想象如何在測試時間內使用虛擬數據庫(如dbunit或h2)。這樣:

1 - 可以在集成測試中打真正的數據庫嗎?

如果1是確定的,我還有一個問題:

通常情況下,我們不改變單位/集成測試的數據狀態;並且測試應該是彼此獨立的。

但是,在我的情況下,我只知道post方法的響應中的實體id是什麼,使得難以實現get/put/delete方法。當然,在get/put/delete方法中,我可以先插入然後再進行另一個操作,但從這個角度來看,最後,我將在測試開始時的一個不同狀態的數據庫中。這樣,我的另一個問題是:

2 - 如何在測試之前將數據庫恢復到相同狀態?

我知道它可能是一個特定的情況,但我真的很感謝任何幫助,找到一個優雅的方式來測試這種情況。

在此先感謝。

+1

集成測試*將*打到真正的數據庫 - 因爲它是*集成*測試。播種數據庫的方法很多,例如DbUnit,但還有其他的方法。 –

+0

只需帶數據的數據庫副本,並在完成集成測試後,使用它 –

+0

您是否想使用實時數據?在運行測試時,其他人可以訪問數據嗎?如果您修改數據庫並且其他人可能正在訪問您的測試數據並認爲它是真實數據,那麼可能會導致哪些問題? – ajb

回答

0

您可以指定內存H2數據庫進行接口集成測試,並根據特定測試的需要填充它。當您在Jenkins或類似單元測試系統上擁有數據庫的情況下運行時,這非常有用。這實際上取決於您正在測試的內容,即端到端集成或更細粒度的集成。

+0

不知道我是否清楚。但在我的情況下,使用像h2這樣的內存數據庫來進行測試並不那麼簡單。 1 - 我沒有使用標準數據庫(這意味着db的元語言不完全遵循ansi sql。),並且可以爲每個表和過程定義2個定義; 2 - 我沒有使用jpa和我的'db庫',它只准備通過過程查詢目標數據庫。 –

+0

Mockito是另一種選擇,但更多的單元測試重點。它也可以在這種情況下工作。 – Jason

+0

我需要測試我的程序調用。所有的應用程序都旨在使用這種方法。 Mockito和dbunit/h2非常酷,只要嘲笑結果即可。這不是我的情況,我需要做一個點到點驗證。 –

1

你應該以不同的方式提問:對生產數據庫運行測試可以接受的風險是什麼?

含義:如果您的測試只發現代碼中的問題,那麼每個人都會很高興。

但是,如果你搞砸了,數據庫被嚴重破壞,並且整個站點需要關閉以備最初失敗的備份......所以你的業務離線2天,你認爲你的經理會如何像那樣?

長話短說:這要看。如果你能控制風險 - 是的。但是,如果沒有,尋找其他的選擇。至少:確保你的經理明白你在做什麼。

+0

坦率地說,我對在生產環境中運行這些測試並不感到興奮,因爲您總是必須承擔所有'生產測試'的風險。理想情況下,他們不應該打破所有的數據庫(這只是一些粗暴的操作),但在我看來最好將數據庫恢復到初始狀態。 不確定,但配置集成環境可能是避免針對生產運行的替代方案。 無論如何,我正在尋找替代品,因爲這種類型的os測試在使用jpa時非常容易,您可以在虛擬數據庫中模擬數據源。 –

0

集成測試很好,只要不在生產環境中運行,我就會說。它允許測試整個應用程序以及如何處理響應,序列化和反序列化。你的測試用例應該處理你期望的生產數據庫中的內容,並且每個測試測試都應該被隔離,並且你在測試用例中創建的內容必須在它返回到原始狀態後刪除它,否則你可能會碰撞測試用例。在本地數據庫或專用測試數據庫中測試集成測試。