Win7下,使用 Laravel 框架的 phpunit測試 (通常說做testcase)—— 安裝和編寫測試用例


在這裏插入圖片描述

如果你想要測試一個方法內部邏輯是否正確,那麼就寫一個測試用例測試一下,給它一個值,看看輸出的結果是否和我們預期的一樣。

簡介

Laravel 植根於測試,實際上,內置使 PHPUnit 對測試提供支持是開箱即用的,並且 phpunit.xml 文件已經爲應用設置好了。框架還提供了方便的輔助方法允許你對應用進行優雅的測試。

默認情況下,tests 目錄包含了兩個子目錄:FeatureUnit,分別用於功能測試和單元測試,單元測試專注於小的、相互隔離的代碼,實際上,大部分單元測試可能都是聚焦於單個方法。功能測試可用於測試較大區塊的代碼,包括若干組件之前的交互,甚至一個完整的HTTP請求。

Feature 和 Unit 測試目錄下都提供了ExampleTest.php 文件,安裝完新的 Laravel 應用後,只需在項目根目錄下簡單運行 phpunit命令 即可自動運行項目的所有測試(如果提示找不到命令,得重新安裝phpunit,見第二步)。

注:PHPUnit 是一個面向程序員的、功能強大的 PHP 單元測試框架,如果你之前沒接觸過 PHPUnit,可以通過官網中文文檔快速入門。

一、什麼是測試?測試的重要性?

我們在寫代碼的時候,通常就需要驗證程序的執行是不是符合預期,所以我們需要做testcase;

下面是一個活動報名的系統:
在這裏插入圖片描述

可以看到這個系統有「限制活動的報名人數20人」的設定,要測試這個設定是否符合我們的預期(20人內能成功報名,超過20人將不能報名),要怎麼做呢?

最容易想到就是手動或人工測試:讓 20 個以上的使用者來報名活動,如果沒超過限制的人數,使用者就能繼續報名,反之,超過了限制人數的話,使用者就無法繼續報名了!

手動或人工測試測試會有什麼問題:

1.測試案例一多,會花太多時間
如果把人數限制從20改爲30, 或者 再增加一個報名截止日期的測試案例,這樣可能要再重新做一次測試。
2.改了代碼之後,需要再做一次測試
日常維護時,會需要再次修改代碼,要驗證修改後的代碼沒問題,肯定又要從頭做一次測試。
3.與其他程序混在一起測試

所以,我們需要一個可以自動化、重複的、獨立的測試,即使用phpunit,在這裏我使用laravel框架下自帶的phpunit,沒有用laravel框架的也可以獨立安裝phpunit。

二、Laravel下重新安裝配置phpunit

我是win7系統,安裝了composer和laravel框架,laravel框架目錄是D:\wamp64\www\question_bank\,question_bank是我的laravel項目名,雖然框架下的D:\wamp64\www\question_bank\verdor\bin有phpunit文件,但是不能使用,直接在項目中輸入phpunit命令會有以下提示:

Yliku@USER-20181020VX MINGW64 /d/wamp64/www/question_bank (master)
$ phpunit
bash: phpunit: command not found

所以得在項目中引入phpunit組件:

1、進入終端,cd進入laravel項目,刪除vendor文件夾,然後重新更新composer:
Yliku@USER-20181020VX MINGW64 /d/wamp64/www/question_bank (master)
$ composer update
2、輸入以下命令引入phpunit:
Yliku@USER-20181020VX MINGW64 /d/wamp64/www/question_bank (master)
$ composer global require phpunit/phpunit

composer global remove phpunit/phpunit 刪除phpunit命令

成功引入以後,phpunit組件將會存在於vendor/phpunit/phpunit下,phpunit命令存放在項目的 vendor/bin 目錄下。

3、配置環境變量:

桌面-我的電腦-右鍵屬性-高級系統設置-高級-環境變量-系統變量-選擇 系統變量 裏面的 path,點擊編輯,將phpunit的存放路徑 D:\wamp64\www\question_bank\vendor\bin;;
添加進去,注意最後一定要加分號!
執行以下命令 phpunit -v 或者 phpunit --version,出現以下提示即安裝成功。

Yliku@USER-20181020VX MINGW64 /d/wamp64/www/question_bank (master)
$ phpunit -v
PHPUnit 7.4.3 by Sebastian Bergmann and contributors.

三、創建測試案例

// 該命令會在 /tests/Feature/下生成一個Usertest.php文件,也叫創建Feature測試類...
php artisan make:test UserTest

// 該命令會在 /tests/Unit/下生成一個Usertest.php文件,也叫創建Unit測試類...
php artisan make:test UserTest --unit

四、使用PHPUnit實現簡單測試

cd進入laravel框架項目,

  • ①輸入:phpunit,自動運行項目下的所有測試案例:
Yliku@USER-20181020VX MINGW64 /d/wamp64/www/question_bank (master)
$ phpunit
PHPUnit 7.4.3 by Sebastian Bergmann and contributors.

EE............................................................... 65 / 68 ( 95%)
..E                                                               68 / 68 (100%)
Time: 1.8 seconds, Memory: 18.00MB
There were 3 errors:

上面的意思是:我的項目總共有68個測試案例,只有65個測試成功,總共花了時間1.8秒和內存18M,E代表ERROR·代表測試成功,參考下表:

. 成功時輸出
F 運行過程中一個斷言失敗時輸出
E 運行過程中產生一個錯誤時輸出
R 被標記爲有風險時輸出
S 被跳過時輸出
I 被標記爲不完整或未實現時輸出

  • ②輸入:phpunit tests/feature/ExampleTest.php ,單獨運行命爲ExampleTest.php下的所有Test方法,一個方法代表一個測試案例:
Yliku@USER-20181020VX MINGW64 /d/wamp64/www/question_bank (master)
$ phpunit tests/Feature/ExampleTest.php
PHPUnit 7.4.3 by Sebastian Bergmann and contributors.

....                                                                4 / 4 (100%)
Time: 333 ms, Memory: 12.00MB
OK (4 tests, 8 assertions)

我的tests/feature/ExampleTest.php文件內容如下:

<?php

namespace Tests\Feature;
//此處命名空間的聲明刪除也沒影響???
//所有測試類文件的命名必須爲*Test.php;
//laravel項目自帶phpunit,所有的測試類在根目錄tests/ 下存放

//這句是必要的!!所有測試類必須繼承Tests\TestCase,因爲要使用該TestCase類的方法
use Tests\TestCase;

//以下兩句use刪除也沒影響???
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    /** 簡單測試示例 * @return void */
    //測試類文件中的所有方法/函數必須爲公開的public,命名格式:public function test*(){}
    //當然可以在你的測試用例中包含private的方法,但它們不能被phpunit所調用
    public function testBasicTest()
    {
        $this->assertTrue(3>2);    //斷言括號內的內容爲真,是的話則該方法測試成功 
    }
    public function testExample1()
    {
        $this->assertFalse(3<2);   //斷言括號內的內容爲假,是的話則該方法測試成功 
    }    
    public function testExample2()
    {
        $this->assertFalse(false);  //斷言括號內的內容爲假,是的話則該方法測試成功 
    }
    //class裏面總共寫了四個方法,代表了四個測試~~~~~~~~~~~
    public function testExample3()
    {
        $stack = [];    //新建數組$stack,給它一個數組,看看輸出的結果是否和我們預期的一致,判斷是否一致就要開始斷言了~~
        $this->assertEquals(0, count($stack));  //count()提取數組的長度,斷言0和數組的長度相等,相等的話測試成功
        array_push($stack, 'foo');              //array_push向數組尾部插入元素'foo'
        $this->assertEquals('foo', $stack[count($stack) - 1]);
        $this->assertEquals(1, count($stack));
        $this->assertEquals('foo', array_pop($stack)); //array_pop()刪除數組的最後一個元素,返回值是被刪除的元素
        $this->assertEquals(0,count($stack) );  //判斷括號內右邊的值是否和左邊的一致,左邊的值是我們的預期輸出
    }
}

五、常用的PHPunit斷言方法

assertEquals() 判斷是否相等
assertContains()判斷輸入是否包含指定的值
assertInstanceOf()
assertTrue/assertFalse 斷言是否爲真值還是假
assertEquals 判斷輸出是否和預期的相等
assertGreaterThan 斷言結果是否大於某個值,同樣的也有LessThan 小於
GreaterThanOrEqual 大於等於
LessThanOrEqual 小於等於
assertType 判斷是否屬於指定類型
assertNull 判斷是否爲空值
assertFileExists 判斷文件是否存在
assertRegExp 根據正則表達式判斷

六、phpunit相關文件說明

  • phpunit.xml爲phpunit的核心配置文件,在laravel項目根目錄下,其中:
    • testsuites中定義了測試文件存放路徑爲根目錄下tests文件下的FeatureUnit目錄。
    • filter中定義了需要進行單元測試的PHP文件存放位置。
    • php中配置了測試環境的環境變量,默認APP_ENV爲testing
    • 緩存驅動設置爲array
    • Session驅動設置爲array
    • 隊列驅動設置爲sync
  • Laravel的 phpunit 默認有兩個文件夾 FeatureUnit
    • FeatureUnit下都提供了ExampleTest.php文件;
    • FeatureUnit分別用於功能測試單元測試
    • 功能測試可用於測試較大區塊的代碼,包括若干組件之前的交互,甚至一個完整的HTTP請求。
    • 單元測試專注於小的、相互隔離的代碼,實際上,大部分單元測試可能都是聚焦於單個方法。

運行測試的時候,Laravel 會自動設置環境爲 testing,這是因爲 phpunit.xml中定義了環境變量。Laravel 在測試時還會自動配置 Session 和緩存驅動爲 array,這意味着測試時不會持久化存儲會話和緩存。
如果需要的話,你也可以定義其它測試環境配置值。testing 環境變量可以在 phpunit.xml 文件中配置,但是要確保在運行命令之前使用 Artisan 命令 config:clear 清除配置緩存。
此外,你還可以在項目根目錄下創建一個 .env.testing 文件,該文件會在運行 PHPUnit 測試或執行帶 --env=testing 開關的 Artisan 命令時覆蓋 .env 文件中的環境變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章