教你掌握 Laravel 的測驗方法
以下由Laravel教學專欄為大家介紹掌握 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 内置测试组件 PHPUnit 的测试用例实现方法。本文仅涉及 PHPUnit 「单元测试」和「功能测试」的基础知识,工作中我们还需要结合实际出发,对 PHPUnit 测试进行深入研究才行。
此外,我们还学习了通过使用 artisan 命令行工具创建分别创建了用于单元测试和功能测试的测试用例的方法。
原文地址:https://learnku.com/laravel/t/33394
以上是教你掌握 Laravel 的測驗方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

在使用CraftCMS開發網站時,常常會遇到資源文件緩存的問題,特別是當你頻繁更新CSS和JavaScript文件時,舊版本的文件可能仍然被瀏覽器緩存,導致用戶無法及時看到最新的更改。這個問題不僅影響用戶體驗,還會增加開發和調試的難度。最近,我在項目中遇到了類似的困擾,經過一番探索,我找到了wiejeben/craft-laravel-mix這個插件,它完美地解決了我的緩存問題。

想要學習 Laravel 框架,但苦於沒有資源或經濟壓力?本文為你提供了免費學習 Laravel 的途徑,教你如何利用網絡平台、文檔和社區論壇等資源,從入門到掌握,為你的 PHP 開發之旅奠定堅實基礎。

Laravel 提供了一個全面的 Auth 框架,用於實現用戶登錄功能,包括:定義用戶模型(Eloquent 模型)創建登錄表單(Blade 模板引擎)編寫登錄控制器(繼承 Auth\LoginController)驗證登錄請求(Auth::attempt)登錄成功後重定向(redirect)考慮安全因素:哈希密碼、防 CSRF 保護、速率限制和安全標頭。此外,Auth 框架還提供重置密碼、註冊和驗證電子郵件等功能。詳情請參閱 Laravel 文檔:https://laravel.com/doc

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

在面向初学者的 Laravel 框架版本选择指南中,本文深入探討了 Laravel 的版本差異,旨在協助初學者在眾多版本之間做出明智的選擇。我們將重點介紹每個版本的關鍵特徵、比較它們的優缺點,並提供有用的建議,幫助新手根據他們的技能水準和項目需求挑選最合適的 Laravel 版本。對於初學者來說,選擇一個合適的 Laravel 版本至關重要,因為它可以顯著影響他們的學習曲線和整體開發體驗。

Laravel框架內置了多種方法來方便地查看其版本號,滿足開發者的不同需求。本文將探討這些方法,包括使用Composer命令行工具、訪問.env文件或通過PHP代碼獲取版本信息。這些方法對於維護和管理Laravel應用程序的版本控制至關重要。

Laravel 和 ThinkPHP 都是流行的 PHP 框架,在開發中各有優缺點。本文將深入比較這兩者,重點介紹它們的架構、特性和性能差異,以幫助開發者根據其特定項目需求做出明智的選擇。
