您好,登錄后才能下訂單哦!
這篇文章主要介紹Laravel中測試方法的示例,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
掌握 Laravel 的測試方法
不管你承認與否在研發一款產品時,軟件測試對項目而言意義重大,然而是測試通常被我們視而不見。這篇文章我們主要研究 Laravel 框架的測試方法。
或許你還不知道,Laravel 內核早已繼承了 PHPUnit 單元測試組件。PHPUnit 是 PHP 社區里使用最廣泛、最受歡迎的測試框架之一。PHPUnit 同時支持「單元測試」和「功能測試」兩種特性。
我們會簡單介紹 PHPUnit 「單元測試」和「功能測試」的基本使用方法。繼而,講解如何在 Laravel 項目中創建「單元測試」和「功能測試」用例。不過本篇我們假定你已經對 PHPUnit 測試框架有了基本的了解,所以讓我們把焦點放到 Laravel 中使用 PHPUnit 進行測試這個主題中。
單元測試和功能測試
如果您已經接觸過 PHPUnit 框架,那么您應該知道,它支持兩種類型特性 -- 「單元測試」和「功能測試」。
「單元測試」的目的是用于測試函數或方法的正確性。更重要的是,我們可以輕松實現代碼邏輯的正確性。
如果您在開發過程中發現某個功能包含多個邏輯處理,那么最好將每個處理邏輯拆分到不同的方法里,這樣以確保單個方法和代碼塊可測試。
我們以一個理想的方法來窺探單元測試的奧秘。
<?php public function getNameAttribute($value) { return ucfirst($value); }
如你所見,這個方法僅處理一個業務邏輯,方法內部通過 ucfirst 函數將字符轉換成首字母大寫格式。
單元測試是為了保證每個獨立單元的代碼正確性;功能測試則是為了保證一個功能的正確性。一言以蔽之,就是通過特定的測試用例模擬用戶訪問應用的行為驗證系統的正確性。
例如,我們可以為包含如下步驟的登錄功能實現一個功能測試用例:
發起一個訪問登錄頁面的 GET 請求;
判斷我們是否處在登錄頁面;
生成用于采用 POST 請求方式登錄的登錄數據;
判斷是否創建登錄會話數據成功。
這就是應該如何創建「功能測試」用例的秘密。接下來我們將創建具體的測試用例,來講解如何在 Laravel 中使用「單元測試」和「功能測試」。
搭建測試環境
創建測試模型
在開始創建測試用例前,我們需要先構建起用于測試的項目依賴。
先執行下面的 artisan 命令創建一個 Post 模型及其對應的遷移文件。
$ php artisan make:model Post --migration
上面的命令將為我們創建一個 Post 模型類和數據庫遷移文件。
Post 模型代碼如下:
<?php // app/Post.php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { // }
數據庫遷移文件 YYYY_MM_DD_HHMMSS_create_posts_table.php 將創建在 database/migrations 目錄中。
Post 數據表會存儲一篇文章的標題。修改后 Post 數據庫遷移文件代碼如下:
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreatePostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('posts'); } }
如你所見,我們通過新增的 $table->string('name') 來存儲文章的標題。接下來,執行數據庫遷移命令就回在數據庫中創建對應的數據表了。
$ php artisan migrate
在創建完數據表之后,我們需要向 Post 模型類中加入如下代碼
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { /** * Get the post title. * * @param string $value * @return string */ public function getNameAttribute($value) { return ucfirst($value); } }
我們剛剛添加了 accessor 方法,它的功能是修改文章的標題,這正是我們在單元測試用例中要測試的。以上就是 Post 模型所需要修改的內容。
創建測試控制器
接下來,我們需要創建一個文件名為 app/Http/Controllers/AccessorController.php 的控制器,它將被用于后續功能測試。
<?php // app/Http/Controllers/AccessorController.php namespace App\Http\Controllers; use App\Post; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class AccessorController extends Controller { public function index(Request $request) { // get the post-id from request params $post_id = $request->get("id", 0); // load the requested post $post = Post::find($post_id); // check the name property return $post->name; } }
在 index 方法中,我們通過請求中的 id 參數,從 Post 模型中查詢一篇文章。
最后,在 routes/web.php 路由配置文件里定義相關路由。
<?php Route::get('accessor/index', 'AccessorController@index');
設置完路由后就可以通過 http://your-laravel-site.com/accessor/index 訪問該路由是否能夠正常訪問了。
單元測試
上一節我們搭建了用于測試的環境。本節我們會在 Laravel 中編寫單元測試用例對 Post 模型進行測試。
幸運的是,Laravel 同樣為我們提供了創建測試用例模版文件的命令工具。
通過在命令行里執行下面的命令來創建 AccessorTest 單元測試用例類。注意我們需要通過 --unit 參數選項來表明這個命令創建一個單元測試用例。單元測試用例文件被創建在 tests/Unit 目錄內。
$ php artisan make:test --unit
執行上面創建測試用例命令會創建文件名為 tests/Unit/AccessorTest.php 文件。
<?php // tests/Unit/AccessorTest.php namespace Tests\Unit; use Tests\TestCase; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class AccessorTest extends TestCase { /** * A basic test example. * * @return void */ public function testExample() { $this->assertTrue(true); } }
將 testExample 方法替換成更有實際意義的方法:
<?php // tests/Unit/AccessorTest.php namespace Tests\Unit; use Tests\TestCase; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class AccessorTest extends TestCase { /** * Test accessor method * * @return void */ public function testAccessorTest() { $db_post = DB::select('select * from posts where id = 1'); $db_post_title = ucfirst($db_post[0]->title); $model_post = Post::find(1); $model_post_title = $model_post->title; $this->assertEquals($db_post_title, $model_post_title); } }
我們可以看到更新后的代碼和 Laravel 代碼編碼風格完全一致。在類的開始我們引入了相關依賴類文件。在 testAccessorTest 方法里,我們希望驗證定義在 Post 模型里面的 getNameAttribute 方法的正確性。
為了實現這樣的測試功能,我們通過 DB 類使用原生 SQL 查詢到一篇文章,并將文章的標題賦值給 $db_post_title 變量。
之后,我們通過 Post 模型獲取經過 getNameAttribute 方法處理過后的同一篇文章的標題賦值給 $model_post_title。
最后,通過 assertEquals 方法比較兩個變量是否相等。
以上就是如何在 Laravel 中使用單元測試的使用方法。
功能測試
這一節我們將學習如何創建功能測試用例來對先前創建的控制器進行「功能測試」。
通過下面給出的命令,我們將創建一個名為 AccessorTest 的功能測試用例。注意這邊我們沒有使用 --unit 命令行選項,所以命令會在 tests/Feature 目錄下創建一個「功能測試」用例。
$ php artisan make:test AccessorTest
命令會創建文件名為 tests/Feature/AccessorTest.php 的測試類。
<?php // tests/Feature/AccessorTest.php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class AccessorTest extends TestCase { /** * A basic test example. * * @return void */ public function testExample() { $this->assertTrue(true); } }
同樣我們替換掉 testExample 方法。
<?php // tests/Feature/AccessorTest.php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class AccessorTest extends TestCase { /** * A basic test example. * * @return void */ public function testBasicTest() { $db_post = DB::select('select * from posts where id = 1'); $db_post_title = ucfirst($db_post[0]->name); $response = $this->get('/accessor/index?id=1'); $response->assertStatus(200); $response->assertSeeText($db_post_title); } }
熟悉功能測試的朋友應該對上面的代碼不會太陌生。
首先,我們還是通過 DB 類使用原生 SQL 查詢到一篇文章,并將文章的標題賦值給 $db_post_title 變量。接著我們模擬一個訪問 /accessor/index?id=1 URI 的 GET 請求,并通過 $response 變量接收響應。
然后,我們去匹配請求響應的狀態碼是否為 200。在我們的測試用例中的這個 GET 請求響應狀態碼應該是 200。此外,測試后還將獲取到一個首字母大寫的標題,判斷標題是否與 $db_post_title 相對的方法是 assertSeeText。
編寫完成所有的測試用例后。接下來需要去執行這些測試用例。在 Laravel 項目中運行 PHPUnit 測試用例,僅需在項目更目錄執行下面的命令。
$ phpunit
這個命令會運行項目中的所有測試用例。測試中的斷言會以標準的 PHPUnit 輸出顯示在控制臺。
以上是“Laravel中測試方法的示例”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。