php make test 作用,larablog 系列文章 06 - 测试:使用 PHPUnit 进行单元和功能测试
到目前為止,larablog 系列文章就要接近尾聲了,過去我們已經探討了開發的核心概念和方式。在繼續添加功能之前,是時候介紹測試相關的內容。我們將研究如何通過單元測試和功能測試確保多個組件與功能一起正常工作。我們將會使用到 PHP 測試庫 PHPUnit。通過本章內容,你將會了解如何編寫一些覆蓋單元和功能測試的用例。
在 Laravel 中的測試
Laravel 在創建時就已考慮到測試的部分。事實上, Laravel 默認就支持用 PHPUnit 來做測試,并為你的應用程序創建好了 phpunit.xml 文件。框架還提供了一些便利的輔助函數,讓你可以更直觀的測試應用程序。
測試環境
在運行測試時,Laravel 會自動將環境變量設置為 testing,并將 Session 及緩存以 數組 的形式存入,也就是說在測試時不會保存任何的 Session 或緩存數據。
你可以隨意創建其它必要的測試環境配置。testing 的環境變量可以在 phpunit.xml 文件中被修改。
單元測試
在計算機編程中,單元測試(Unit Testing) 又稱為模塊測試,只針對程序模塊(軟件設計的最小單位)來進行正確性檢驗的測試工作。程序單元是應用的最小可測試部件。在過程化編程中,一個單元就是單個程序、函數、過程等;對于面向對象編程,最小單元就是方法、包括基類(超類)、抽象類、或者派生類(子類)中的方法。
功能測試
功能性測試檢查應用程序中不同元件結合在一起的情況,如網絡地址、controllers 與 views。功能測試有點像是你自己會透過瀏覽器手動進行的測試,如請求首頁、點選博客鏈接以及檢查是否顯示了正確的文章。功能測試讓你可以將這個程序自動化,Laravel 為 HTTP 請求的生成和發送操作、輸出的檢查,甚至表單的填寫都提供了非常流利的 API。
Functional testing(功能測試),也稱為 behavioral testing(行為測試),根據產品特性、操作描述和用戶方案,測試一個產品的特性和可操作行為以確定它們滿足設計需求。
PHPUnit
就如上面的提到的,Laravel 的測試程序是基于 PHPUnit 設計的,如果打開 composer.json,你可以發我們已經將 phpunit 作為開發依賴組件加入到項目中,你可以執行 ./vendor/bin/phpunit --version 查看 PHPUnit 的版本。
單元測試是幾個現代敏捷開發方法的基礎,使得 PHPUnit 成為許多大型 PHP 項目的關鍵工具。這個工具也可以被 Xdebug 擴展用來生成代碼覆蓋率報告 ,并且可以與 phing 集成來自動測試,最后它還可以和 Selenium 整合來完成大型的自動化集成測試。
斷言
設計測試程序的目的檢查實際測試結果是否與預期測試結果相同,在 PHPUnit 有許多斷言方法協助你處理這個部分。部分你會用到的常見斷言方法如下:
// Check 1 === 1 is true
$this->assertTrue(1 === 1);
// Check 1 === 2 is false
$this->assertFalse(1 === 2);
// Check 'Hello' equals 'Hello'
$this->assertEquals('Hello', 'Hello');
// Check array has key 'language'
$this->assertArrayHasKey('language', array('language' => 'php', 'size' => '1024'));
// Check array contains value 'php'
$this->assertContains('php', array('php', 'ruby', 'c++', 'JavaScript'));
完整的 斷言方法 可以查閱文檔。
Laravel 為 PHPUnit 測試提供了一些額外的斷言方法:
單元測試
如同之前的提到的,單元測試的目的是獨立測試應用程序的個別單元。當你的測試內容較多時,盡量通過測試目錄將不同的測試區分開,盡可能保持與開發目錄結構一致。
定義并運行測試
要創建一個測試案例,可使用 make:test Artisan 命令,我們這里創建一個文章相關的測試:
php artisan make:test PostTest
此命令會放置一個新的 PostTest 類至你的 tests 目錄。接著就可以像平常使用 PHPUnit 一樣來定義測試方法。要運行測試只需要在命令行上運行 phpunit 命令即可:
測試 slugify 方法
下面,我們要對之前用于 URL 的格式化文章標題方法 slugify 進行測試。打開 tests/PostTest.php,編輯內容如下所示:
use App\Post;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class PostTest extends TestCase
{
public function testSlugify()
{
$this->assertEquals('hello-world', Post::slugify('Hello World'));
}
}
我們寫好了一個測試用例,用來測試 slugify 的輸出是否與預期的一致。在命令行中運行:
./vendor/bin/phpunit tests/PostTest.php
運行效果如下:
? larablog ./vendor/bin/phpunit tests/PostTest.php
PHPUnit 4.8.36 by Sebastian Bergmann and contributors.
.
Time: 98 ms, Memory: 8.00MB
OK (1 test, 1 assertion)
該命令為,運行指定目錄下的測試用例。可以看到我的測試通過,沒有問題。
接下來,回到 tests/PostTest.php,找到 testSlugify,繼續增加斷言:
public function testSlugify()
{
$this->assertEquals('hello-world', App\Post::slugify('Hello World'));
$this->assertEquals('a day with laravel', Post::slugify('A Day With laravel'));
}
再次運行 ./vendor/bin/phpunit tests/PostTest.php,可以預見結果如下:
? larablog ./vendor/bin/phpunit tests/PostTest.php
PHPUnit 4.8.36 by Sebastian Bergmann and contributors.
F
Time: 243 ms, Memory: 8.00MB
There was 1 failure:
1) PostTest::testSlugify
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'a day with laravel'
+'a-day-with-laravel'
/Applications/XAMPP/xamppfiles/htdocs/larablog/tests/PostTest.php:13
FAILURES!
Tests: 1, Assertions: 2, Failures: 1.
結果顯示有失敗的斷言,同時可以看到詳細的問題所在。很自然的,這是由于我們故意用了錯誤的預期。
對于 slugify 我們正確的預期是這樣:
$this->assertEquals('a-day-with-laravel', Post::slugify('A Day With laravel'));
再次運行 ./vendor/bin/phpunit tests/PostTest.php,測試都通過,滿足預期。
功能測試
現在我們已經設計了一些單元測試,接著來看如何測試多個元件一起運作。功能性測試的第一個部分會介紹模擬瀏覽器請求來測試產生的回應。
關于頁面
我們開始測試 PageController 類中的關于頁面,由于關于頁面相對簡單,所以是個適合入手的地方。執行下面的命令:
php artisan make:test PageControllerTest
編輯生成的文件 tests/PageControllerTest.php,內容如下:
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class PageControllerTest extends TestCase
{
public function testAbout()
{
$this->visit('/about')
->see('About larablog');
}
}
visit 方法會創建一個 GET 請求,see 方法則斷言在返回的響應中會有指定的文本,這是 Laravel 所提供的最基本的應用程序測試。很顯然,我們用很簡單的方式就自動完成了對關于頁面可訪問性的測試。
命令行下執行測試:
./vendor/bin/phpunit tests/PageControllerTest.php
你應該會看到測試成功的消息。試著修改 About larablog 的內容為 Contact Us,然后重新執行測試。這個測試現在應該會出現錯誤,因為頁面上找不到 Contact Us,斷言不成立。
好了,再繼續后面的內容之前,把文字改回 About larablog。
主頁
雖然關于頁面的測試很簡單,它已經大致介紹了網頁功能性測試的基本原則:
請求頁面
檢查回應
這是一個簡單的處理過程,事實上還有許多其他步驟可以做,比如點擊,填寫表單內容等。
我們來建立一個方法測試首頁,我們知道首頁的網址是 /,它應該會顯示最新的博客文章。在文件 tests/PageControllerTest.php 中新建一個方法 testIndex(),并加入以下內容:
public function testIndex()
{
$this->visit('/')
->see('Continue reading...')
->see('Posted by');
}
你可以看到,跟測試關于頁面一樣的步驟,執行如下命令,看看是否和預期一樣:
./vendor/bin/phpunit tests/PageControllerTest.php
接著做進一步的措施,部分功能性測包含能夠按照用戶的行為在網站上操作,用戶為了在頁面間跳轉會點擊鏈接,我們就試著模擬這個操作來測試博客文章的標題點選后顯示博客文章頁面的鏈接是否正確。下面,更新 tests/PageControllerTest.php 類的 testIndex() 方法。
public function testIndex()
{
$this->visit('/')
->see('Continue reading...')
->see('Posted by')
->click('Continue reading...')
->see('Comments')
->see('Add Comment');
}
我們通過點擊 Continue reading... 鏈接訪問博客文章頁面,通過詳情頁面上存在 Add Comment 來確認訪問的是詳情頁內容。
執行測試來確認首頁與博客顯示頁面的跳轉是否正確。
./vendor/bin/phpunit tests/PageControllerTest.php
現在你應該了解如何在網站頁面間通過鏈接來進行功能性測試,接著我們來看看有關表單的測試。
聯系頁面
larablog 的用戶可以在聯系頁面 /contact 通過填寫表單發送聯系信息,我們來測試這個表單提交的過程是否正確。
首先我們需要列出表單成功提交的過程(成功提交在這里意味著表單沒有錯誤消息)
訪問聯系頁面
在表單中輸入值
提交表單
檢查郵件是否發送成功
檢查用戶端是否收到發送成功的提醒
到目前為止我們只知道如何進行第 1 步和第 5 步,我們現在要看看如何測試中間的 3 個步驟。
在文件 tests/PageControllerTest.php 中新增一個方法 testContact() :
public function testContact()
{
$this->visit('/contact')
->see('Contact larablog')
->type('Taylor', 'name')
->type('taylor@email.com', 'email')
->type('Testing', 'subject')
->type('Testing', 'subject')
->type('Rerum autem accusantium necessitatibus id.
Consequuntur itaque enim similique veniam possimus itaque.
Soluta perspiciatis iure sed.
Sunt voluptatem est nobis voluptatibus rerum.
Dignissimos alias tempore et perspiciatis sequi libero ab dolorum.
Saepe consequatur distinctio cumque sunt.
Recusandae ut distinctio qui excepturi voluptatem quibusdam et quo.
Eius quasi nihil ipsa voluptas molestias.', 'body')
->press('Submit')
->see('Mail sent successfully. Thank you!');
}
我們用同樣的方法,建立了一個訪問 /contact 的請求,然后檢查頁面是否包含 Contact larablog 的標題。接著我們填寫表單內容并提交,之后檢查響應的信息中是否包含以正確提交的提示。執行這個測試來確認所有功能都正確運作。
./vendor/bin/phpunit tests/PageControllerTest.php
新增文章評論
我們現在已經可以用在聯絡頁面的知識來測試發布文章評論的流程,一樣的,我們需要列出表單提成功提交會經歷的流程。
訪問博客文章頁面
在表單中輸入值
提交表單
檢查新的評論是否被加入到文章評論的列表最后
同時檢查右側 sidebar 最新評論中是否出現了這條新的評論
執行如下的命令創建測試類:
php artisan make:test CommentTest
在建立的文件 tests/CommentTest.php 中加入以下內容:
public function testAddBlogComment()
{
$post = App\Post::first();
$this->visit('/'.$post->id.'/'.$post->slug)
->see($post->title)
->type('Michael', 'user')
->type('This is test comment by Michael', 'comment')
->press('Submit')
->see('
Michael commented')
->see('
Michael commented on');
}
執行測試確認功能是否是否正確:
./vendor/bin/phpunit tests/CommentTest.php
在我們的表單提交后,我們通過檢查響應來獲取到文章的評論。我們檢查文章評論列表中的內容以及側邊欄中的最新的評論信息,確認測試結果滿足預期。
總結
我們已經提到一些關于測試重要的地方,我們也介紹了單元測試和功能測試來確保我們網站的功能正確執行。我們已經看到如何模擬瀏覽器請求以及如何使用輔助方法來檢查請求響應。
雖然我們講了一些內容,很顯然這不是 Laravel 測試的全部,你可以通過這里的 文檔 來了解更多的細節。
總結
以上是生活随笔為你收集整理的php make test 作用,larablog 系列文章 06 - 测试:使用 PHPUnit 进行单元和功能测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常量数组 python_python数据
- 下一篇: C++最全输入方式总结(cin、get、