ThinkPHP 利用PHPUnit 進行簡單的測試

 

先了解一下大概狀況吧

這裏利用的thinkphp 內置的test的擴展,對應的phpunit的版本爲phpunit6版本。儘管是舊版本,作一些簡單的測試仍是能夠的php

 

安裝phpunitthinkphp

➜ 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目錄app

 

如何進行測試

下面舉一個例子composer

咱們先寫一個簡單的service,而後在test 目錄裏面 寫入框架

如今就完成了一個簡單地測試。測試這個service是否按照咱們的想法進行運算。ide

咱們使用命令行在根目錄下 輸入 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)

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

相關文章
相關標籤/搜索