簡體   English   中英

如何使用PHP SimpleTest框架設置數據庫測試

[英]How do you set up database testing using the PHP SimpleTest framework

我正在使用SimpleTest,一個基於PHP的單元測試框架。 我正在測試新代碼,它將處理從數據庫中存儲和檢索網站注釋。 我對如何構建項目來測試數據庫訪問代碼感到茫然。

我正在尋找有關在PHP應用程序中測試db代碼的最佳實踐的任何建議。 例子真的很棒。 進一步閱讀的網站很棒。

非常感謝你。 :)

這是一個老問題,但我想我會添加一些我們對此有的具體經驗。

其他海報在技術上是正確的,這是一種集成測試的形式,但從我坐在那里的MySQL經常有太多的邏輯在單元測試中被刪除。 如果您像我們一樣擁有大量復雜的服務,這些服務嚴重依賴於MySQL(通常每個服務有幾個表),那么擁有一個包含測試查詢邏輯的強大測試框架非常方便。 我們在單元測試中模擬了大量的依賴項,但不是MySQL。

我們有一組包裝simpletest的類來提供這個功能。 它的工作原理如下:

  • 創建每個數據庫表的指令存儲在tests/etc/schemas/table.sql中的文件中。 它包含架構數據以及測試期望找到的所有固定數據的插入。
  • 每個需要數據庫的測試都會擴展一個Test_DbCase類,該類提供構建表的功能。
  • 引導類負責在構造和銷毀時創建和刪除數據庫。
  • 在運行時,測試調用setUp方法中的loadTables('foo', 'bar')來執行foo.sqlbar.sql的sql命令。
  • 對罐裝數據進行測試......其余的顯而易見。

我們擁有的另一個工具是bash腳本,可以更輕松地創建table.sql文件。 這非常方便,因為否則我們會手動編寫SQL - 您可以使用現有的一組表,在MySQL中設置所有數據,然后將其導出以基本創建測試文件。

這對我們來說非常有效,盡管我們最終不得不自己滾動很多。

我有一個本地數據庫,專門用於使用已知名稱和數據庫用戶名/密碼進行單元測試。 單元測試被硬編碼到該位置,但不同的開發人員可以根據需要覆蓋這些變量。

然后在每次測試之前,您TRUNCATE每個表進行TRUNCATE 這比刪除/創建表或數據庫本身快得多。

注:測試后, 不要截斷! 這樣,如果測試失敗,您將擁有數據庫的當前狀態,這通常有助於診斷問題。

您可能希望允許PHP創建數據並將數據提供給臨時表/數據庫並在該表/數據庫上進行測試。 然后,您不必手動重置數據庫。 大多數框架都有數據庫操作庫,以使其更容易。 前端可能需要一些時間,但是稍后當您進行更改時,可以讓您更快地進行測試。

針對數據庫的測試通常表明測試結果不好,可能是由於測試代碼中缺少封裝。 您應該嘗試盡可能地將與數據庫交互的代碼與其余代碼隔離開來,使這個交互層保持如此簡單,以至於您可以通過一些非常基本的測試來逃避。

換一種說法; 處理注釋的代碼不應與處理數據庫交互的代碼相同。 例如,您可以編寫一個通用表模塊,您的注釋模型將使用該模塊來訪問數據庫。 您仍然需要測試表模塊,但這應該與注釋代碼隔離。

在測試數據庫代碼時,總是擁有與起點相同的數據庫是件好事。 特別是如果你進行單元測試(我假設這是這里的情況)。 其中一種方法是按照Jason的建議截斷所有表格,但我更喜歡在其中包含一些起始數據。 您知道,您始終需要擁有每個數據庫中存在的一些“默認”數據。

此外,某些測試僅對完整數據庫有意義。 因此,為這些測試創建一個特殊的數據庫實例。 在運行某些測試之前,我有大約3或4個不同的數據庫,我插件(只是復制文件)。 每次都有相同的起點確保可重復性。

因此,只需准備一些好的“起點”並備份它們的數據庫狀態。 在運行每組測試之前,請還原相應的數據庫,然后運行它。

我建議您不要嘗試使用SimpleTest測試數據庫訪問代碼。

相反,使用例如Selenium為您的應用程序創建功能測試:當您從已知的數據庫狀態開始時記錄測試用例; 然后添加注釋並檢查(使用Selenium的斷言)內容確實存在。

這樣做: - 更容易設置和維護 - 您不僅可以驗證數據庫層,還可以驗證表示層

也就是說,如果你的數據庫中有存儲過程, 使用SimpleTest - 我已經成功完成了它。 基本上,創建從已知數據庫狀態開始的SimpleTests,然后執行一些INSERTS / UPDATES,然后運行存儲過程並確保數據庫的狀態是您所期望的。

如果你真的想對數據庫進行測試,我建議在每次測試之前導入數據/創建表。 這樣,您的數據庫就會在每次測試時從已知狀態開始。 由於這在性能上相當昂貴,因此您可以在setUp啟動事務(前提是您的rdms支持它),並在tearDown回滾。 MySql(可能是您正在使用的RDBMS)不支持嵌套事務,因此如果測試中的代碼使用事務,則可能會遇到麻煩。 你可以使用保存點解決這個問題。 在測試之前設置保存點,並在測試后回滾到保存點。

我還是會堅持認為,如果你需要這么多,你應該考慮你的測試試圖告訴你什么的可能性。

我認為你應該使用ORM,並為此編寫一些集成測試。 如果集成測試顯示它在實際環境下運行良好,那么只有在更改環境(數據庫,php版本,平台等等)時才需要再次測試它。 之后,您可以模擬ORM對象,而不需要連接到數據庫。

所以我認為這是最好的方法,但是如果你不想使用ORM,那么你可以創建一個測試數據庫並模擬數據庫連接(PDO)對象。 在這種情況下,您可以在testCases的setUp和tearDown部分中創建和刪除測試表。 重要的是這些是集成測試,而不是單元測試,所以你不需要總是運行它們,只有當PHP和SQL服務器之間發生了某些變化時。 在使用集成測試測試數據訪問對象后,必須在單元測試中對其進行模擬。

暫無
暫無

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

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