由於自身以前基本沒寫過什麼單元測試用例, 感受是一大憾事, 計劃在接下來需求中, 體驗下 TDD 方式編程, 特此作了一次簡單的筆記.php
由於咱們使用的laravel框架, 在底層已經幫咱們實現了不少細節的東西, 無縫集成了 PHPUnit, 因此使用起來仍是比較簡單的.html
咱們的業務代碼中常常有須要直接查業務庫、操做庫的需求, 若是常常的改變數據庫數據, 好多時候由於數據不到位, 多表邏輯的話更改繁瑣laravel
修改業務代碼邏輯, 提交代碼還須要將測試代碼移除, 過程容易將調試代碼提交上線數據庫
如何在測試用例中避免數據干擾, 只專心關注代碼邏輯, 推薦使用 laravel 的 Mockery::mock, 無侵入性設置返回值.編程
全部的須要mock的方法, 都須要初始化稱 mock 對象數組
protected function initMock($class)
{
$mock = \Mockery::mock($class);
$this->app->instance($class, $mock);
return $mock;
}
複製代碼
這裏咱們mock初始化了 ClueRepository 類bash
$this->clueRepository = $this->initMock(\xx\ClueRepository::class);
複製代碼
使用上一步驟 mock 對象, 設置調用一次 getClueTotal 方法, 返回20數值app
$this->clueRepository->shouldReceive('getClueTotal')
->once()
->andReturn(20);
複製代碼
獲取service的對象框架
$this->clueRecommendService = app(\xx\ClueRecommendService::class);
複製代碼
$ret = $this->clueRecommendService->claimRecommendClue(['sale_uid' => 111, 'clue_id' => 2]);
複製代碼
驗證傳入和傳出是否一致單元測試
$this->assertEquals($this->saleUid, $ret['sale_uid']);
$this->assertEquals($this->clueId, $ret['clue_id']);
複製代碼
vendor/bin/phpunit tests/ExampleTest.php
複製代碼
異常能夠在方法上增長註釋使用
/**
* @expectedException Exception
* @expectedExceptionCode 136
* @expectedExceptionMessage 線索
*
* @throws Exception
*/
複製代碼
/**
* 聲明依賴上個方法
* @depends testBasicExample
*
*/
public function testGetClueInfoService(array $ret)
{
$this->assertTrue(true);
}
複製代碼
構造測試數組
$data = [
'name' => 'ttt',
'data' => [
'test' => '小明',
],
];
複製代碼
一些經常使用方法
//跳過當前方法執行結果
$this->markTestSkipped();
//在數組中斷定外層test是否存在
$this->assertArrayHasKey('test', $data); #false
//查找最外層值是否存在
$this->assertContains('ttt', $data); #true
複製代碼