明顯的測驗崩潰...我想如果你想要一個稍微短一點的單字並且感覺很傾向於,你可以省略 -db- 部分。
Test-DB-Acle 是一個 PHP 函式庫,有助於為資料庫層編寫簡單而簡潔的測試。
我相信編寫測試對於開發人員來說應該盡可能容易,並且對於其他開發人員來說也應該盡可能容易閱讀。
這意味著測試中的任何測試資料都應該僅與測試場景相關。然而,大多數資料庫表都有非空列,需要您輸入虛擬數據,這只會給測試帶來認知噪音。
Test-Db-Acle 旨在減輕開發人員的這項負擔。測試框架不會對資料庫層類別的工作方式做出任何假設,如果它們使用像 Doctrine、預存程序或直接 SQL 這樣的 ORM,原理總是相同的,在某些時候代碼與資料庫表中的資料進行交互,我們確實需要對此進行測試。
透過作曲家安裝
停用資料庫中的外鍵檢查
自動處理非空列
當斷言值位於資料庫表中時,自動修剪 mysql 中的日期/時間列 - 對於插入的時間戳記很有用(在 Sqlite 中必須指定這些列)
幾乎所有組件都可以更換並替換為定製品種
目前支援Mysql和Sqlite
與框架無關,它不會假設是否使用 ORM,並且應該很容易適應其他單元測試框架。
目前支援的資料庫有 MySql(以及擴充的 MariaDB)和 Sqlite。
該架構應該允許添加更多資料庫。
該函式庫可以與 PHPUnit 一起開箱即用。透過使用提供的特徵並將“assertEquals”方法委託給等效方法,將其與其他測試框架一起使用應該相當容易(例如,我記得它在 SimpleTest 中是“assertEqual”)
如果您使用 PHP 5.4 並且不介意使用特徵,我提供了一個簡單的 TestDbAclePhpUnitAbstractTestCase 以及 TestDbAclePhpUnitTraitsDatabaseHelperTrait 。
好吧,公平地說,測試資料庫層的成本很高,而且會拖慢測試速度,並且只要有可能,就應該模擬對資料庫的任何依賴項。但有時我們不得不這樣做,希望在結構良好的應用程式中,這種情況可以保持在最低限度。
有許多可用的工具和方法(例如 DBUnit 或在單元測試中使用工廠方法)來幫助進行資料庫測試,每種工具和方法都有自己的優點,這種方法對我來說很有效,因為:
我不必擔心空列或外鍵約束
我為我的測試提供了最小的數據集
我可以在測試上方以類似網格的格式看到測試數據,並在斷言資料庫中的數據時再次看到測試數據。
所以我建立了自己的解決方案。
###那麼它是如何運作的以及它是什麼樣子的呢?給我舉個例子!
這個想法是使用「管道分隔值」文字字串,我們稱之為 PSV - 與 CSV 中一樣,但使用管道 - 來設定測試裝置,如下所示:
(PSV的格式與優秀的Behat BDD框架(https://github.com/Behat/Behat)所使用的格式非常相似)
$dbTablesToSetup="[table_name]id |date |name |value |dependent_table_id10 |2001-01-01 |foo |900 |60[dependent_table]id |name20 |Bar60 |Baz";//如果您不想使用此值使用提供的特徵或抽象測試案例$testDbAcle = TestDbAcleTestDbAcle::create($pdo);$testDbAcle->runCommand(new TestDbAcleCommandsSetupTablesCommand($dbTablesToSetup));//如果您從TestDbAclePhpUnitAbspePhpPhpUnit>Unipp.Php)正在擴展- >setupTables($dbTablesToSetup);
框架本身知道表中哪些列不能為 NULL,並插入預設值...事實上,我們假設表table_name有 30 列,所有列都是非空的...
此外,後台可能存在各種外鍵約束。 Test-Db-Acle 暫時停用外鍵檢查,因此我們不必擔心這一點,也不必擔心插入測試資料的順序。
###實際測試一下怎麼樣?
類別 ExampleTest 擴充功能 PHPUnit_Framework_TestCase 實作 TestDbAclePhpUnitAbstractTestCaseInterface {使用 TestDbAclePhpUnitTraitsDatabaseHelperTrait; /** * 這個方法需要實現,它應該回傳要在資料庫裝置中使用的 PDO 物件 * * @return Pdo */public function ProvidePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); } /* * 範例測試 */public function test_AddressService() {$this->setupTables(" [地址] address_id |公司 1 |me 3 |你 [用戶] user_id |姓名 10 |約翰 20 |瑪麗 "); $this->setAutoIncrement('地址', 100); $this->addressService->addEntry("them");$this->assertTableStateContains(" [網址] address_id |company 1 |me 3 |you 100 |them [user] user_id |name 10 |John 20 |Mary ", array(),「東西有效」); } }
如果您不使用特徵,則可以使用AbstractTestCase
,但是在這種情況下您將無法使用自己的基底測試類別。
類別 ExampleTest 擴充 TestDbAclePhpUnitAbstractTestCase { protected $addressService;function Setup(){parent::Setup();$this->addressService = new ServicesAddressService(); }/** * 這個方法需要實現,它應該回傳要在資料庫裝置中使用的 PDO 物件 * * @return Pdo */public function ProvidePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); }函數 test_AddressService() {$this->setupTables(" [地址] address_id |公司 1 |me 3 |你 [用戶] user_id |姓名 10 |約翰 20 |瑪麗 "); $this->setAutoIncrement('地址', 100); $this->addressService->addEntry("them");$this->assertTableStateContains(" [網址] address_id |company 1 |me 3 |you 100 |them [user] user_id |name 10 |John 20 |Mary ", array(),「東西有效」); } }
好吧,顯然這裡不存在 ServicesAddressService(嘿,它是測試優先的,對吧?)而且範例非常簡單。
在現實生活中,我會將 getPdo 方法放入專案的公共基測試類別中,並且它的獲取方式可能與此處完全不同。但是,這只是一個例子。
如您所見,setupTables 可以一次設定多個表,assertTableStateContains 也可以同時驗證各個表的狀態。
與 setupTables 如何設定比指定列多得多的列的表類似,assertTableStateContains 也僅比較並斷言指定列的值。
安裝Test-Db-Acle 最簡單的方法是使用Composer(在此處了解更多資訊:http://packagist.org),我強烈建議使用這種方法,儘管您也可以將套件解壓縮到資料夾中並啟用自動載入以您想要的任何形式手動進行(它使用 psr-0 命名約定)
要與composer一起使用,請將其添加到您的composer.json檔案中:
"require": { "test-db-acle/test-db-acle" : "dev-master" }, "repositories" : [ { "type": "git", "url": "https://github.com/malteriesch/test-db-acle.git" } ]
如果您願意,也可以使用 https://packagist.org/packages/test-db-acle/test-db-acle。
非常歡迎貢獻(和批評)......!
###如何執行 Test-Db-Acle 測試### 要執行測試,您需要在您選擇的 MySql 伺服器上建立一個空資料庫,將tests/Functional/config.php.dist 複製到tests/ Function/config. php 並填充您的資料庫詳細資訊。然後,希望所有測試都應該運行。 (資料庫其實只是功能冒煙測試才需要)
PSV 文法
抽象測試用例
擴充功能和自訂 TestDbAcle
變更日誌