由于TP測試框架更偏向于黑盒測試(實際上我們使用的是灰盒測試),因此在對數據庫進行測試的時候,我們沒有辦法(或者是不方便)使用mock。所以我們使用TP測試框架的時候對數據操作進行測試的時候,我們需要為數據庫的基境進行搭建。
> 1. 黑盒測試:測試人員不需要了解代碼如何工作,只需要根據指定輸入,斷言輸出。
> 2. 白盒測試:測試人員需要了解代碼,用來幫助測試的進行。
> 3. 灰盒測試:黑盒和白盒的中間,使用黑盒方法的同時使用白盒測試。
TP的官方測試框架主要使用灰盒的測試方法,如果需要使用mock的話,可以使用快速入門中提到的測試庫。
## 安裝DBUnit。
使用thinkUnit的時候安裝的PHPUNIT依賴中是沒有DBUNIT的。因此如果我們要對數據庫進行測試的話,那么就需要安裝DBUnit了。
可以在composer中的require-dev中添加以下的依賴:
`"phpunit/dbunit": ">=1.2"`
然后更新composer即可。
`composer update`
## 編寫測試用例
安裝完DBUnit之后,我們就需要重新編寫測試用例了。不過,TP本身的測試庫并沒有提供數據庫測試的測試用例基類,因此需要我們自己編寫。
```
<?php
namespace tests;
use PHPUnit_Extensions_Database_TestCase;
use think\testing\ApplicationTrait;
use think\testing\AssertionsTrait;
use think\testing\CrawlerTrait;
class ClientTest extends PHPUnit_Extensions_Database_TestCase{
use ApplicationTrait, AssertionsTrait, CrawlerTrait;
protected $baseUrl = 'http://localhost';
//獲得連接
public function getConnection(){
//數據庫的連接
}
// 獲得初始數據
public function getDataSet(){
// 基境的建立
}
// 具體的測試用例
}
```
## 將數據庫配置從測試類中抽離
在上面的例子中,我們每一個測試類都需要獲得連接,讀取數據庫的配置。
在通常情況下,我們希望能夠將數據庫配置設為全局,這樣就算數據庫配置修改的話,也只需要修改全局一個配置。
在thinkphp的根目錄下,有一個phpunit的配置文件,phpunit.xml文件,我們只需要再phpunit.xml中添加如下的信息:
```
<phpunit>
......其他配置
......
<php>
<var name="DB_DSN" value="mysql:dbname=你的數據庫名;host=localhost" />
<var name="DB_USER" value="用戶名" />
<var name="DB_PASSWD" value="密碼" />
<var name="DB_DBNAME" value="數據庫名" />
</php>
</phpunit>
```
而后在getConnection方法為:
```
if ($this->conn === null) {
if (self::$pdo == null) {
self::$pdo = new \PDO( $GLOBALS['DB_DSN'], $GLOBALS['DB_USER'], $GLOBALS['DB_PASSWD'] );
}
$this->conn = $this->createDefaultDBConnection(self::$pdo, $GLOBALS['DB_DBNAME']);
}
return $this->conn;
```
> 再走一步:但是這樣的話,我們每個方法也需要寫這樣重復的內容。因此,我們還可以將其抽象為父類,然后再需要使用數據庫的測試類中繼承該類。