文章目錄
如果你想要測試一個方法內部邏輯是否正確,那麼就寫一個測試用例測試一下,給它一個值,看看輸出的結果是否和我們預期的一樣。
簡介
Laravel 植根於測試,實際上,內置使 PHPUnit 對測試提供支持是開箱即用的,並且 phpunit.xml
文件已經爲應用設置好了。框架還提供了方便的輔助方法允許你對應用進行優雅的測試。
默認情況下,tests 目錄包含了兩個子目錄:Feature
和 Unit
,分別用於功能測試和單元測試
,單元測試專注於小的、相互隔離的代碼,實際上,大部分單元測試可能都是聚焦於單個方法。功能測試可用於測試較大區塊的代碼,包括若干組件之前的交互,甚至一個完整的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
文件下的Feature
和Unit
目錄。filter
中定義了需要進行單元測試的PHP文件存放位置。php
中配置了測試環境的環境變量,默認APP_ENV爲testing
,- 緩存驅動設置爲
array
, - Session驅動設置爲
array
, - 隊列驅動設置爲
sync
。
- Laravel的 phpunit 默認有兩個文件夾
Feature
和Unit
Feature
和Unit
下都提供了ExampleTest.php
文件;Feature
和Unit
分別用於功能測試
和單元測試
;功能測試
可用於測試較大區塊的代碼,包括若干組件之前的交互,甚至一個完整的HTTP請求。單元測試
專注於小的、相互隔離的代碼,實際上,大部分單元測試可能都是聚焦於單個方法。
運行測試的時候,Laravel 會自動設置環境爲 testing
,這是因爲 phpunit.xml
中定義了環境變量。Laravel 在測試時還會自動配置 Session 和緩存驅動爲 array
,這意味着測試時不會持久化存儲會話和緩存。
如果需要的話,你也可以定義其它測試環境配置值。testing
環境變量可以在 phpunit.xml
文件中配置,但是要確保在運行命令之前使用 Artisan 命令 config:clear
清除配置緩存。
此外,你還可以在項目根目錄下創建一個 .env.testing
文件,該文件會在運行 PHPUnit 測試或執行帶 --env=testing
開關的 Artisan 命令時覆蓋 .env
文件中的環境變量。