1. 程式人生 > >ThinkPHP 利用PHPUnit 進行簡單的測試

ThinkPHP 利用PHPUnit 進行簡單的測試

 

先了解一下大概情況吧

這裡利用的thinkphp 內建的test的擴充套件,對應的phpunit的版本為phpunit6版本。儘管是舊版本,做一些簡單的測試還是可以的

 

安裝phpunit

➜ wget http://phar.phpunit.cn/phpunit.phar

➜ chmod +x phpunit.phar

➜ sudo mv phpunit.phar /usr/local/bin/phpunit

➜ phpunit --version

安裝thinkphp的test擴充套件

composer require topthink/think-testing=2.0.*

 安裝完成之後,thinkphp目錄下會多一個test目錄

 

 

 

 

 

 

 

 

 

 

 

 

 

 

安裝完成之後,thinkphp目錄下會多一個test目錄

 

如何進行測試

下面舉一個例子

我們先寫一個簡單的service,然後在test 目錄裡面 寫入

現在就完成了一個簡單地測試。測試這個service是否按照我們的想法進行運算。

我們使用命令列在根目錄下 輸入 php think unit

顯示測試完畢,正常顯示。

 

斷言函式

斷言函式名(陣列) 作用 斷言函式名(物件) 作用 斷言函式名(類) 作用
assertEquals 斷言等於 assertAttributeContains 斷言屬性包含 assertClassHasAttribute 斷言類有某屬性
assertNotEquals 斷言不等於 assertAttributeContainsOnly 斷言屬性只包含 assertClassHasStaticAttribute 斷言類有某靜態屬性
assertArrayHasKey 斷言有鍵 assertAttributeEquals 斷言屬性等於 assertClassNotHasAttribute 斷言類沒有某屬性
assertArrayNotHasKey 斷言沒有鍵 assertAttributeGreaterThan 斷言屬性大於 assertClassNotHasStaticAttribute 斷言類沒有某靜態屬性
assertContains 斷言包含 assertAttributeGreaterThanOrEqual 斷言屬性大於等於    
assertNotContains 斷言不包含 assertAttributeLessThan 斷言屬性小於    
assertContainsOnly 斷言只包含 assertAttributeLessThanOrEqual 斷言屬性小於等於    
assertNotContainsOnly 斷言不只包含 assertAttributeNotContains 斷言不包含    
    assertAttributeNotContainsOnly 斷言屬性不只包含    
    assertAttributeNotEquals 斷言屬性不等於    
    assertAttributeNotSame 斷言屬性不相同    
    assertAttributeSame 斷言屬性相同    
    assertSame 斷言型別和值都相同    
    assertNotSame 斷言型別或值不相同    
    assertObjectHasAttribute 斷言物件有某屬性    
   

assertObjectNotHasAttribute

斷言物件沒有某屬性    
斷言函式名(檔案) 作用 斷言函式名(XML) 作用
assertFileEquals 斷言檔案內容等於 assertXmlFileEqualsXmlFile 斷言XML檔案內容相等
assertFileExists 斷言檔案存在 assertXmlFileNotEqualsXmlFile 斷言XML檔案內容不相等
assertFileNotEquals 斷言檔案內容不等於 assertXmlStringEqualsXmlFile 斷言XML字串等於XML檔案內容
assertFileNotExists 斷言檔案不存在 assertXmlStringEqualsXmlString 斷言XML字串相等
    assertXmlStringNotEqualsXmlFile 斷言XML字串不等於XML檔案內容
    assertXmlStringNotEqualsXmlString 斷言XML字串不相等

以上內容的assertEquals是所有斷言函式的一種,具體用法可以自行百度,本文章日後會慢慢補充完畢。

 

基鏡

目前以上內容已經可以測試每一個service的執行狀況。但是有一部分service 需要有執行的前提條件,我們把建立基礎環境或者依賴製作成可測試的狀態成為基鏡的搭建。

舉個栗子,比如我們在測試新增管理員的時候需要依賴某個資料庫的某個值。那麼我們可以試試以下方法

<?php

namespace tests;

class ExampleTest extends TestCase
{
    protected $a;

    protected function setUp(): void
    {
        parent::setUp();
        //假設這裡我們從資料庫中查詢出來的a的值為1
        $this->a=1;
    }
    

    public function testplanService():void
    {
        $test=new \app\index\service\Test;
        //這裡我們可以靈活的使用這個a的值。不需要手動輸入固定的值
        $this->assertEquals(2,$test->planService($this->a,1));
    }
}

測試資料的移除

我們在測試的時候難免會產生一系列測試資料,我們如何在測試完畢之後刪除這些資料呢,看看以下的例子

<?php

namespace tests;

class ExampleTest extends TestCase
{
    protected $a;

    protected function setUp(): void
    {
        parent::setUp();
        $this->a=1;
    }
    

    public function testplanService():void
    {
        $test=new \app\index\service\Test;
        $this->assertEquals(2,$test->planService($this->a,1));
    }


    //執行測試完畢之後,測試框架會自動呼叫該類銷燬資料庫的插入資料等等
    protected function tearDown(): void
    {
        $this->assertEquals(1,1);
        //銷燬資料操作
    }
}

資料供給器

現在假設有如下情況。

插入一個管理員記錄,要求管理員的賬號長度大於6位,小於9位。首字母大寫等等。我們不可能一種情況一個個去測試,對於這種情況,我們可以利用資料供給器來提供批量的資料。

我們新建一個service類

<?php

namespace app\index\service;

class Admin
{
    public function add(string $username,string $password):bool
    {
        if(!preg_match('/^[A_Z]\S{6,8}$/',$username))
        {
            return false;
        }
        return true;
    }
}

下面我們補上測試程式碼

<?php
namespace tests;

use think\testing\TestCase;

class AddTest extends TestCase
{
    protected $add;

    protected function setUp(): void
    {
        $this->add=new \app\index\service\Admin;
    }

    /**
     * @dataProvider addData
     * @param string $usernmae
     * @param string $password
     */
    public function testAdd(string $username,string $password):void
    {
        $this->assertFalse($this->add->add($username,$password));
    }

    /**
     * 測試情況為true
     *
     * @return void
     */
    public function testAdd_true():void
    {
        //斷言為true
        $this->assertTrue($this->add->add('A123456','1111'));
    }

    //add 方法資料供給器
    public function addData()
    {
        return [
            //資料小於6位
            ['s123','1111'],
            //資料大於9位
            ['A123456789','1111'],
            //首字元小寫
            ['s1234567','1111']
        ];
    }
}

補上結果

localhost:think yehua$ php think unit
PHPUnit 6.5.14 by Sebastian Bergmann and contributors.

....                                                                4 / 4 (100%)

Time: 92 ms, Memory: 6.00MB

OK (4 tests, 4 assertions)

以上內容就是最簡單的測試方法。合理利用這些方法。可以讓你的