這篇文章主要介紹Laravel中測(cè)試方法的示例,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
成都創(chuàng)新互聯(lián)公司是一家以網(wǎng)絡(luò)技術(shù)公司,為中小企業(yè)提供網(wǎng)站維護(hù)、成都做網(wǎng)站、網(wǎng)站制作、網(wǎng)站備案、服務(wù)器租用、空間域名、軟件開發(fā)、小程序開發(fā)等企業(yè)互聯(lián)網(wǎng)相關(guān)業(yè)務(wù),是一家有著豐富的互聯(lián)網(wǎng)運(yùn)營(yíng)推廣經(jīng)驗(yàn)的科技公司,有著多年的網(wǎng)站建站經(jīng)驗(yàn),致力于幫助中小企業(yè)在互聯(lián)網(wǎng)讓打出自已的品牌和口碑,讓企業(yè)在互聯(lián)網(wǎng)上打開一個(gè)面向全國(guó)乃至全球的業(yè)務(wù)窗口:建站歡迎聯(lián)系:18982081108
掌握 Laravel 的測(cè)試方法
不管你承認(rèn)與否在研發(fā)一款產(chǎn)品時(shí),軟件測(cè)試對(duì)項(xiàng)目而言意義重大,然而是測(cè)試通常被我們視而不見(jiàn)。這篇文章我們主要研究 Laravel 框架的測(cè)試方法。
或許你還不知道,Laravel 內(nèi)核早已繼承了 PHPUnit 單元測(cè)試組件。PHPUnit 是 PHP 社區(qū)里使用最廣泛、最受歡迎的測(cè)試框架之一。PHPUnit 同時(shí)支持「單元測(cè)試」和「功能測(cè)試」兩種特性。
我們會(huì)簡(jiǎn)單介紹 PHPUnit 「單元測(cè)試」和「功能測(cè)試」的基本使用方法。繼而,講解如何在 Laravel 項(xiàng)目中創(chuàng)建「單元測(cè)試」和「功能測(cè)試」用例。不過(guò)本篇我們假定你已經(jīng)對(duì) PHPUnit 測(cè)試框架有了基本的了解,所以讓我們把焦點(diǎn)放到 Laravel 中使用 PHPUnit 進(jìn)行測(cè)試這個(gè)主題中。
單元測(cè)試和功能測(cè)試
如果您已經(jīng)接觸過(guò) PHPUnit 框架,那么您應(yīng)該知道,它支持兩種類型特性 -- 「單元測(cè)試」和「功能測(cè)試」。
「單元測(cè)試」的目的是用于測(cè)試函數(shù)或方法的正確性。更重要的是,我們可以輕松實(shí)現(xiàn)代碼邏輯的正確性。
如果您在開發(fā)過(guò)程中發(fā)現(xiàn)某個(gè)功能包含多個(gè)邏輯處理,那么最好將每個(gè)處理邏輯拆分到不同的方法里,這樣以確保單個(gè)方法和代碼塊可測(cè)試。
我們以一個(gè)理想的方法來(lái)窺探單元測(cè)試的奧秘。
<?php public function getNameAttribute($value) { return ucfirst($value); }
如你所見(jiàn),這個(gè)方法僅處理一個(gè)業(yè)務(wù)邏輯,方法內(nèi)部通過(guò) ucfirst 函數(shù)將字符轉(zhuǎn)換成首字母大寫格式。
單元測(cè)試是為了保證每個(gè)獨(dú)立單元的代碼正確性;功能測(cè)試則是為了保證一個(gè)功能的正確性。一言以蔽之,就是通過(guò)特定的測(cè)試用例模擬用戶訪問(wèn)應(yīng)用的行為驗(yàn)證系統(tǒng)的正確性。
例如,我們可以為包含如下步驟的登錄功能實(shí)現(xiàn)一個(gè)功能測(cè)試用例:
發(fā)起一個(gè)訪問(wèn)登錄頁(yè)面的 GET 請(qǐng)求;
判斷我們是否處在登錄頁(yè)面;
生成用于采用 POST 請(qǐng)求方式登錄的登錄數(shù)據(jù);
判斷是否創(chuàng)建登錄會(huì)話數(shù)據(jù)成功。
這就是應(yīng)該如何創(chuàng)建「功能測(cè)試」用例的秘密。接下來(lái)我們將創(chuàng)建具體的測(cè)試用例,來(lái)講解如何在 Laravel 中使用「單元測(cè)試」和「功能測(cè)試」。
搭建測(cè)試環(huán)境
創(chuàng)建測(cè)試模型
在開始創(chuàng)建測(cè)試用例前,我們需要先構(gòu)建起用于測(cè)試的項(xiàng)目依賴。
先執(zhí)行下面的 artisan 命令創(chuàng)建一個(gè) Post 模型及其對(duì)應(yīng)的遷移文件。
$ php artisan make:model Post --migration
上面的命令將為我們創(chuàng)建一個(gè) Post 模型類和數(shù)據(jù)庫(kù)遷移文件。
Post 模型代碼如下:
<?php // app/Post.php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { // }
數(shù)據(jù)庫(kù)遷移文件 YYYY_MM_DD_HHMMSS_create_posts_table.php 將創(chuàng)建在 database/migrations 目錄中。
Post 數(shù)據(jù)表會(huì)存儲(chǔ)一篇文章的標(biāo)題。修改后 Post 數(shù)據(jù)庫(kù)遷移文件代碼如下:
<?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'); } }
如你所見(jiàn),我們通過(guò)新增的 $table->string('name') 來(lái)存儲(chǔ)文章的標(biāo)題。接下來(lái),執(zhí)行數(shù)據(jù)庫(kù)遷移命令就回在數(shù)據(jù)庫(kù)中創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)表了。
$ php artisan migrate
在創(chuàng)建完數(shù)據(jù)表之后,我們需要向 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 方法,它的功能是修改文章的標(biāo)題,這正是我們?cè)趩卧獪y(cè)試用例中要測(cè)試的。以上就是 Post 模型所需要修改的內(nèi)容。
創(chuàng)建測(cè)試控制器
接下來(lái),我們需要?jiǎng)?chuàng)建一個(gè)文件名為 app/Http/Controllers/AccessorController.php 的控制器,它將被用于后續(xù)功能測(cè)試。
<?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 方法中,我們通過(guò)請(qǐng)求中的 id 參數(shù),從 Post 模型中查詢一篇文章。
最后,在 routes/web.php 路由配置文件里定義相關(guān)路由。
<?php Route::get('accessor/index', 'AccessorController@index');
設(shè)置完路由后就可以通過(guò) http://your-laravel-site.com/accessor/index 訪問(wèn)該路由是否能夠正常訪問(wèn)了。
單元測(cè)試
上一節(jié)我們搭建了用于測(cè)試的環(huán)境。本節(jié)我們會(huì)在 Laravel 中編寫單元測(cè)試用例對(duì) Post 模型進(jìn)行測(cè)試。
幸運(yùn)的是,Laravel 同樣為我們提供了創(chuàng)建測(cè)試用例模版文件的命令工具。
通過(guò)在命令行里執(zhí)行下面的命令來(lái)創(chuàng)建 AccessorTest 單元測(cè)試用例類。注意我們需要通過(guò) --unit 參數(shù)選項(xiàng)來(lái)表明這個(gè)命令創(chuàng)建一個(gè)單元測(cè)試用例。單元測(cè)試用例文件被創(chuàng)建在 tests/Unit 目錄內(nèi)。
$ php artisan make:test --unit
執(zhí)行上面創(chuàng)建測(cè)試用例命令會(huì)創(chuàng)建文件名為 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 方法替換成更有實(shí)際意義的方法:
<?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 代碼編碼風(fēng)格完全一致。在類的開始我們引入了相關(guān)依賴類文件。在 testAccessorTest 方法里,我們希望驗(yàn)證定義在 Post 模型里面的 getNameAttribute 方法的正確性。
為了實(shí)現(xiàn)這樣的測(cè)試功能,我們通過(guò) DB 類使用原生 SQL 查詢到一篇文章,并將文章的標(biāo)題賦值給 $db_post_title 變量。
之后,我們通過(guò) Post 模型獲取經(jīng)過(guò) getNameAttribute 方法處理過(guò)后的同一篇文章的標(biāo)題賦值給 $model_post_title。
最后,通過(guò) assertEquals 方法比較兩個(gè)變量是否相等。
以上就是如何在 Laravel 中使用單元測(cè)試的使用方法。
功能測(cè)試
這一節(jié)我們將學(xué)習(xí)如何創(chuàng)建功能測(cè)試用例來(lái)對(duì)先前創(chuàng)建的控制器進(jìn)行「功能測(cè)試」。
通過(guò)下面給出的命令,我們將創(chuàng)建一個(gè)名為 AccessorTest 的功能測(cè)試用例。注意這邊我們沒(méi)有使用 --unit 命令行選項(xiàng),所以命令會(huì)在 tests/Feature 目錄下創(chuàng)建一個(gè)「功能測(cè)試」用例。
$ php artisan make:test AccessorTest
命令會(huì)創(chuàng)建文件名為 tests/Feature/AccessorTest.php 的測(cè)試類。
<?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); } }
熟悉功能測(cè)試的朋友應(yīng)該對(duì)上面的代碼不會(huì)太陌生。
首先,我們還是通過(guò) DB 類使用原生 SQL 查詢到一篇文章,并將文章的標(biāo)題賦值給 $db_post_title 變量。接著我們模擬一個(gè)訪問(wèn) /accessor/index?id=1 URI 的 GET 請(qǐng)求,并通過(guò) $response 變量接收響應(yīng)。
然后,我們?nèi)テヅ湔?qǐng)求響應(yīng)的狀態(tài)碼是否為 200。在我們的測(cè)試用例中的這個(gè) GET 請(qǐng)求響應(yīng)狀態(tài)碼應(yīng)該是 200。此外,測(cè)試后還將獲取到一個(gè)首字母大寫的標(biāo)題,判斷標(biāo)題是否與 $db_post_title 相對(duì)的方法是 assertSeeText。
編寫完成所有的測(cè)試用例后。接下來(lái)需要去執(zhí)行這些測(cè)試用例。在 Laravel 項(xiàng)目中運(yùn)行 PHPUnit 測(cè)試用例,僅需在項(xiàng)目更目錄執(zhí)行下面的命令。
$ phpunit
這個(gè)命令會(huì)運(yùn)行項(xiàng)目中的所有測(cè)試用例。測(cè)試中的斷言會(huì)以標(biāo)準(zhǔn)的 PHPUnit 輸出顯示在控制臺(tái)。
以上是“Laravel中測(cè)試方法的示例”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
文章名稱:Laravel中測(cè)試方法的示例
當(dāng)前路徑:http://bm7419.com/article4/gijpoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、移動(dòng)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、ChatGPT、外貿(mào)建站、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)