摘要:同時支持單元測試和功能測試兩種特性。我們會簡單介紹單元測試和功能測試的基本使用方法。單元測試的目的是用于測試函數(shù)或方法的正確性。單元測試是為了保證每個獨立單元的代碼正確性功能測試則是為了保證一個功能的正確性。單元測試用例文件被創(chuàng)建在目錄內(nèi)。
本文首發(fā)于個人博客 掌握 Laravel 的測試方法,轉(zhuǎn)載請注明出處。
不管你承認與否在研發(fā)一款產(chǎn)品時,軟件測試對項目而言意義重大,但現(xiàn)實是測試通常被我們視而不見。這篇文章我們主要研究 Laravel 框架的測試方法。
或許你還不知道,Laravel 內(nèi)核早已繼承了 PHPUnit 單元測試組件。PHPUnit 是 PHP 社區(qū)里使用最廣泛、最受歡迎的測試框架之一。PHPUnit 同時支持「單元測試」和「功能測試」兩種特性。
我們會簡單介紹 PHPUnit 「單元測試」和「功能測試」的基本使用方法。繼而,講解如何在 Laravel 項目中創(chuàng)建「單元測試」和「功能測試」用例。不過本篇我們假定你已經(jīng)對 PHPUnit 測試框架有了基本的了解,所以讓我們把焦點放到 Laravel 中使用 PHPUnit 進行測試這個主題中。
單元測試和功能測試如果您已經(jīng)接觸過 PHPUnit 框架,那么您應(yīng)該知道,它支持兩種類型特性 -- 「單元測試」和「功能測試」。
「單元測試」的目的是用于測試函數(shù)或方法的正確性。更重要的是,我們可以輕松實現(xiàn)代碼邏輯的正確性。
如果您在開發(fā)過程中發(fā)現(xiàn)某個功能包含多個邏輯處理,那么最好將每個處理邏輯拆分到不同的方法里,這樣以確保單個方法和代碼塊可測試。
我們以一個理想的方法來窺探單元測試的奧秘。
如你所見,這個方法僅處理一個業(yè)務(wù)邏輯,方法內(nèi)部通過 ucfirst 函數(shù)將字符轉(zhuǎn)換成首字母大寫格式。
單元測試是為了保證每個獨立單元的代碼正確性;功能測試則是為了保證一個功能的正確性。一言以蔽之,就是通過特定的測試用例模擬用戶訪問應(yīng)用的行為驗證系統(tǒng)的正確性。
例如,我們可以為包含如下步驟的登錄功能實現(xiàn)一個功能測試用例:
發(fā)起一個訪問登錄頁面的 GET 請求;
判斷我們是否處在登錄頁面;
生成用于采用 POST 請求方式登錄的登錄數(shù)據(jù);
判斷是否創(chuàng)建登錄會話數(shù)據(jù)成功。
這就是應(yīng)該如何創(chuàng)建「功能測試」用例的秘密。接下來我們將創(chuàng)建具體的測試用例,來講解如何在 Laravel 中使用「單元測試」和「功能測試」。
搭建測試環(huán)境 創(chuàng)建測試模型在開始創(chuàng)建測試用例前,我們需要先構(gòu)建起用于測試的項目依賴。
先執(zhí)行下面的 artisan 命令創(chuàng)建一個 Post 模型及其對應(yīng)的遷移文件。
$ php artisan make:model Post --migration上面的命令將為我們創(chuàng)建一個 Post 模型類和數(shù)據(jù)庫遷移文件。
Post 模型代碼如下:
數(shù)據(jù)庫遷移文件 YYYY_MM_DD_HHMMSS_create_posts_table.php 將創(chuàng)建在 database/migrations 目錄中。
Post 數(shù)據(jù)表會存儲一篇文章的標題。修改后 Post 數(shù)據(jù)庫遷移文件代碼如下:
increments("id"); $table->string("name"); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists("posts"); } }如你所見,我們通過新增的 $table->string("name") 來存儲文章的標題。接下來,執(zhí)行數(shù)據(jù)庫遷移命令就回在數(shù)據(jù)庫中創(chuàng)建對應(yīng)的數(shù)據(jù)表了。
$ php artisan migrate在創(chuàng)建完數(shù)據(jù)表之后,我們需要向 Post 模型類中加入如下代碼
我們剛剛添加了 accessor 方法,它的功能是修改文章的標題,這正是我們在單元測試用例中要測試的。以上就是 Post 模型所需要修改的內(nèi)容。
創(chuàng)建測試控制器接下來,我們需要創(chuàng)建一個文件名為 app/Http/Controllers/AccessorController.php 的控制器,它將被用于后續(xù)功能測試。
get("id", 0); // load the requested post $post = Post::find($post_id); // check the name property return $post->name; } }在 index 方法中,我們通過請求中的 id 參數(shù),從 Post 模型中查詢一篇文章。
最后,在 routes/web.php 路由配置文件里定義相關(guān)路由。
設(shè)置完路由后就可以通過 http://your-laravel-site.com/accessor/index 訪問該路由是否能夠正常訪問了。
單元測試上一節(jié)我們搭建了用于測試的環(huán)境。本節(jié)我們會在 Laravel 中編寫單元測試用例對 Post 模型進行測試。
幸運的是,Laravel 同樣為我們提供了創(chuàng)建測試用例模版文件的命令工具。
通過在命令行里執(zhí)行下面的命令來創(chuàng)建 AccessorTest 單元測試用例類。注意我們需要通過 --unit 參數(shù)選項來表明這個命令創(chuàng)建一個單元測試用例。單元測試用例文件被創(chuàng)建在 tests/Unit 目錄內(nèi)。
$ php artisan make:test --unit執(zhí)行上面創(chuàng)建測試用例命令會創(chuàng)建文件名為 tests/Unit/AccessorTest.php 文件。
assertTrue(true); } }將 testExample 方法替換成更有實際意義的方法:
title); $model_post = Post::find(1); $model_post_title = $model_post->title; $this->assertEquals($db_post_title, $model_post_title); } }我們可以看到更新后的代碼和 Laravel 代碼編碼風格完全一致。在類的開始我們引入了相關(guān)依賴類文件。在 testAccessorTest 方法里,我們希望驗證定義在 Post 模型里面的 getNameAttribute 方法的正確性。
為了實現(xiàn)這樣的測試功能,我們通過 DB 類使用原生 SQL 查詢到一篇文章,并將文章的標題賦值給 $db_post_title 變量。
之后,我們通過 Post 模型獲取經(jīng)過 getNameAttribute 方法處理過后的同一篇文章的標題賦值給 $model_post_title。
最后,通過 assertEquals 方法比較兩個變量是否相等。
以上就是如何在 Laravel 中使用單元測試的使用方法。
功能測試這一節(jié)我們將學習如何創(chuàng)建功能測試用例來對先前創(chuàng)建的控制器進行「功能測試」。
通過下面給出的命令,我們將創(chuàng)建一個名為 AccessorTest 的功能測試用例。注意這邊我們沒有使用 --unit 命令行選項,所以命令會在 tests/Feature 目錄下創(chuàng)建一個「功能測試」用例。
$ php artisan make:test AccessorTest命令會創(chuàng)建文件名為 tests/Feature/AccessorTest.php 的測試類。
assertTrue(true); } }同樣我們替換掉 testExample 方法。
name); $response = $this->get("/accessor/index?id=1"); $response->assertStatus(200); $response->assertSeeText($db_post_title); } }熟悉功能測試的朋友應(yīng)該對上面的代碼不會太陌生。
首先,我們還是通過 DB 類使用原生 SQL 查詢到一篇文章,并將文章的標題賦值給 $db_post_title** 變量。接著我們模擬一個訪問 **/accessor/index?id=1** URI 的 GET 請求,并通過 **$response 變量接收響應(yīng)。
然后,我們?nèi)テヅ湔埱箜憫?yīng)的狀態(tài)碼是否為 200。在我們的測試用例中的這個 GET 請求響應(yīng)狀態(tài)碼應(yīng)該是 200。此外,測試后還將獲取到一個首字母大寫的標題,判斷標題是否與 $db_post_title 相對的方法是 assertSeeText。
編寫完成所有的測試用例后。接下來需要去執(zhí)行這些測試用例。在 Laravel 項目中運行 PHPUnit 測試用例,僅需在項目更目錄執(zhí)行下面的命令。
$ phpunit這個命令會運行項目中的所有測試用例。測試中的斷言會以標準的 PHPUnit 輸出顯示在控制臺。
總結(jié)今天,我們探討了 Laravel 內(nèi)置測試組件 PHPUnit 的測試用例實現(xiàn)方法。本文僅涉及 PHPUnit 「單元測試」和「功能測試」的基礎(chǔ)知識,工作中我們還需要結(jié)合實際出發(fā),對 PHPUnit 測試進行深入研究才行。
此外,我們還學習了通過使用 artisan 命令行工具創(chuàng)建分別創(chuàng)建了用于單元測試和功能測試的測試用例的方法。
如果你是 Laravel 初學者,或者抱著學習的目標擴展自己的視野,可以關(guān)注 Envato Market
另外,不要害羞,就是干!
原文:https://code.tutsplus.com/tut...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/31993.html
摘要:一路由目錄眾所周知,對于我們熟知的任何一款框架,例如路由系統(tǒng)都是極其重要的存在。文件用于定義界面的路由。定義在中的路由都是無狀態(tài)的,并且被分配了中間件組。生成的控制器為每個行為保留了方法,同時還包括了處理動作和的聲明注釋。 一、路由目錄 眾所周知,對于我們熟知的任何一款PHP框架,例如TP、CI、YII、路由系統(tǒng)都是極其重要的存在。 對于laravel框架也一樣,對于數(shù)據(jù)庫的操作,無非...
摘要:小紅要以最低成本最快速度推出版本,投放市場,收集反饋,持續(xù)迭代??偨Y(jié)在技能掌握充足的情況下,個人感覺開發(fā)效率要略高于。 我個人是比較不喜歡去正兒八經(jīng)的比較兩個框架的,這樣沒有意義,不過欲善其事先利其器! 技術(shù)是相通的,但是在某個特定的領(lǐng)域的某個階段肯定有相對最適合的一個工具! 這里比較不是從技術(shù)角度比較,而是從公司技術(shù)選型考慮的,特別是初創(chuàng)的互聯(lián)網(wǎng)創(chuàng)業(yè)公司。沒辦法,誰讓互聯(lián)網(wǎng)公司離不開...
摘要:小紅要以最低成本最快速度推出版本,投放市場,收集反饋,持續(xù)迭代??偨Y(jié)在技能掌握充足的情況下,個人感覺開發(fā)效率要略高于。 我個人是比較不喜歡去正兒八經(jīng)的比較兩個框架的,這樣沒有意義,不過欲善其事先利其器! 技術(shù)是相通的,但是在某個特定的領(lǐng)域的某個階段肯定有相對最適合的一個工具! 這里比較不是從技術(shù)角度比較,而是從公司技術(shù)選型考慮的,特別是初創(chuàng)的互聯(lián)網(wǎng)創(chuàng)業(yè)公司。沒辦法,誰讓互聯(lián)網(wǎng)公司離不開...
摘要:預(yù)熱搜索功能是應(yīng)用的重要組成模塊。本文將帶領(lǐng)大家學習和在搜索模塊中設(shè)計的相關(guān)技術(shù)。基本的查詢作為首個要講解的搜索功能,我們先不涉及新知識點。其次,在第個函數(shù)內(nèi)加入了占位符,這種語法即為參數(shù)綁定,它的主要作用是用于防止注入。 本文同步至個人博客 需要掌握的 Laravel Eloquent 搜索技術(shù),轉(zhuǎn)載請注明出處。 當我們的應(yīng)用程序訪問較少時(例如在項目初期階段),直接進行項目編碼就可...
摘要:流程一新項目流程創(chuàng)建,并添加依賴到的擴展包運行,安裝擴展包并生成提交到代碼版本控制器中,如流程二項目協(xié)作者安裝現(xiàn)有項目克隆項目后,根目錄下直接運行從中安裝指定版本的擴展包以及其依賴此流程適用于生產(chǎn)環(huán)境代碼的部署。 本文經(jīng)授權(quán)轉(zhuǎn)自 PHPHub 社區(qū) 問題說明 我們經(jīng)常要往現(xiàn)有的項目中添加擴展包,有時候因為文檔的錯誤引導(dǎo),如下圖來自 這個文檔 的: showImg(https://dn-...
閱讀 3079·2021-11-24 10:47
閱讀 3831·2021-11-02 14:43
閱讀 2227·2021-09-26 10:15
閱讀 2252·2021-09-08 09:35
閱讀 560·2019-08-30 12:45
閱讀 2780·2019-08-29 17:04
閱讀 3214·2019-08-26 14:05
閱讀 1258·2019-08-26 12:10