淺談 laravel 的測試用例編寫

開篇

由於自身以前基本沒寫過什麼單元測試用例, 感受是一大憾事, 計劃在接下來需求中, 體驗下 TDD 方式編程, 特此作了一次簡單的筆記.php

由於咱們使用的laravel框架, 在底層已經幫咱們實現了不少細節的東西, 無縫集成了 PHPUnit, 因此使用起來仍是比較簡單的.html

簡單例子

若是構造咱們的數據

咱們的業務代碼中常常有須要直接查業務庫、操做庫的需求, 若是常常的改變數據庫數據, 好多時候由於數據不到位, 多表邏輯的話更改繁瑣laravel

修改業務代碼邏輯, 提交代碼還須要將測試代碼移除, 過程容易將調試代碼提交上線數據庫

如何在測試用例中避免數據干擾, 只專心關注代碼邏輯, 推薦使用 laravel 的 Mockery::mock, 無侵入性設置返回值.編程

1. 首先咱們封裝個設置 mock 的類

全部的須要mock的方法, 都須要初始化稱 mock 對象數組

protected function initMock($class)
{
    $mock = \Mockery::mock($class);
    $this->app->instance($class, $mock);
    return $mock;    
}
複製代碼

2. 在執行service以前, 必定要先 mock 下指定的類來

這裏咱們mock初始化了 ClueRepository 類bash

$this->clueRepository = $this->initMock(\xx\ClueRepository::class);
複製代碼

3. 設置 mock 的類執行次數一次方法指定返回值爲 20

使用上一步驟 mock 對象, 設置調用一次 getClueTotal 方法, 返回20數值app

$this->clueRepository->shouldReceive('getClueTotal')
            ->once()
            ->andReturn(20);
複製代碼

4. 綁定咱們要測試的 service 類

獲取service的對象框架

$this->clueRecommendService = app(\xx\ClueRecommendService::class);
複製代碼

5. 執行真正的業務邏輯

$ret = $this->clueRecommendService->claimRecommendClue(['sale_uid' => 111, 'clue_id' => 2]);
複製代碼

6. 驗證返回值

驗證傳入和傳出是否一致單元測試

$this->assertEquals($this->saleUid, $ret['sale_uid']);
$this->assertEquals($this->clueId, $ret['clue_id']);
複製代碼

7. 執行測試用例

vendor/bin/phpunit tests/ExampleTest.php
複製代碼

異常

異常能夠在方法上增長註釋使用

/**
 * @expectedException Exception
 * @expectedExceptionCode 136
 * @expectedExceptionMessage 線索
 *
 * @throws Exception
 */
複製代碼

聲明上個方法依賴, return返回值, 做爲此方法的參數

/**
 * 聲明依賴上個方法
 * @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 
複製代碼

更多方法: www.phpunit.cn/manual/4.8/…

相關文章
相關標籤/搜索