日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php make test 作用,larablog 系列文章 06 - 测试:使用 PHPUnit 进行单元和功能测试

發(fā)布時(shí)間:2025/3/15 php 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php make test 作用,larablog 系列文章 06 - 测试:使用 PHPUnit 进行单元和功能测试 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

到目前為止,larablog 系列文章就要接近尾聲了,過去我們已經(jīng)探討了開發(fā)的核心概念和方式。在繼續(xù)添加功能之前,是時(shí)候介紹測試相關(guān)的內(nèi)容。我們將研究如何通過單元測試和功能測試確保多個(gè)組件與功能一起正常工作。我們將會(huì)使用到 PHP 測試庫 PHPUnit。通過本章內(nèi)容,你將會(huì)了解如何編寫一些覆蓋單元和功能測試的用例。

在 Laravel 中的測試

Laravel 在創(chuàng)建時(shí)就已考慮到測試的部分。事實(shí)上, Laravel 默認(rèn)就支持用 PHPUnit 來做測試,并為你的應(yīng)用程序創(chuàng)建好了 phpunit.xml 文件。框架還提供了一些便利的輔助函數(shù),讓你可以更直觀的測試應(yīng)用程序。

測試環(huán)境

在運(yùn)行測試時(shí),Laravel 會(huì)自動(dòng)將環(huán)境變量設(shè)置為 testing,并將 Session 及緩存以 數(shù)組 的形式存入,也就是說在測試時(shí)不會(huì)保存任何的 Session 或緩存數(shù)據(jù)。

你可以隨意創(chuàng)建其它必要的測試環(huán)境配置。testing 的環(huán)境變量可以在 phpunit.xml 文件中被修改。

單元測試

在計(jì)算機(jī)編程中,單元測試(Unit Testing) 又稱為模塊測試,只針對(duì)程序模塊(軟件設(shè)計(jì)的最小單位)來進(jìn)行正確性檢驗(yàn)的測試工作。程序單元是應(yīng)用的最小可測試部件。在過程化編程中,一個(gè)單元就是單個(gè)程序、函數(shù)、過程等;對(duì)于面向?qū)ο缶幊?#xff0c;最小單元就是方法、包括基類(超類)、抽象類、或者派生類(子類)中的方法。

功能測試

功能性測試檢查應(yīng)用程序中不同元件結(jié)合在一起的情況,如網(wǎng)絡(luò)地址、controllers 與 views。功能測試有點(diǎn)像是你自己會(huì)透過瀏覽器手動(dòng)進(jìn)行的測試,如請(qǐng)求首頁、點(diǎn)選博客鏈接以及檢查是否顯示了正確的文章。功能測試讓你可以將這個(gè)程序自動(dòng)化,Laravel 為 HTTP 請(qǐng)求的生成和發(fā)送操作、輸出的檢查,甚至表單的填寫都提供了非常流利的 API。

Functional testing(功能測試),也稱為 behavioral testing(行為測試),根據(jù)產(chǎn)品特性、操作描述和用戶方案,測試一個(gè)產(chǎn)品的特性和可操作行為以確定它們滿足設(shè)計(jì)需求。

PHPUnit

就如上面的提到的,Laravel 的測試程序是基于 PHPUnit 設(shè)計(jì)的,如果打開 composer.json,你可以發(fā)我們已經(jīng)將 phpunit 作為開發(fā)依賴組件加入到項(xiàng)目中,你可以執(zhí)行 ./vendor/bin/phpunit --version 查看 PHPUnit 的版本。

單元測試是幾個(gè)現(xiàn)代敏捷開發(fā)方法的基礎(chǔ),使得 PHPUnit 成為許多大型 PHP 項(xiàng)目的關(guān)鍵工具。這個(gè)工具也可以被 Xdebug 擴(kuò)展用來生成代碼覆蓋率報(bào)告 ,并且可以與 phing 集成來自動(dòng)測試,最后它還可以和 Selenium 整合來完成大型的自動(dòng)化集成測試。

斷言

設(shè)計(jì)測試程序的目的檢查實(shí)際測試結(jié)果是否與預(yù)期測試結(jié)果相同,在 PHPUnit 有許多斷言方法協(xié)助你處理這個(gè)部分。部分你會(huì)用到的常見斷言方法如下:

// 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 測試提供了一些額外的斷言方法:

單元測試

如同之前的提到的,單元測試的目的是獨(dú)立測試應(yīng)用程序的個(gè)別單元。當(dāng)你的測試內(nèi)容較多時(shí),盡量通過測試目錄將不同的測試區(qū)分開,盡可能保持與開發(fā)目錄結(jié)構(gòu)一致。

定義并運(yùn)行測試

要?jiǎng)?chuàng)建一個(gè)測試案例,可使用 make:test Artisan 命令,我們這里創(chuàng)建一個(gè)文章相關(guān)的測試:

php artisan make:test PostTest

此命令會(huì)放置一個(gè)新的 PostTest 類至你的 tests 目錄。接著就可以像平常使用 PHPUnit 一樣來定義測試方法。要運(yùn)行測試只需要在命令行上運(yùn)行 phpunit 命令即可:

測試 slugify 方法

下面,我們要對(duì)之前用于 URL 的格式化文章標(biāo)題方法 slugify 進(jìn)行測試。打開 tests/PostTest.php,編輯內(nèi)容如下所示:

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'));

}

}

我們寫好了一個(gè)測試用例,用來測試 slugify 的輸出是否與預(yù)期的一致。在命令行中運(yùn)行:

./vendor/bin/phpunit tests/PostTest.php

運(yùn)行效果如下:

? 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)

該命令為,運(yùn)行指定目錄下的測試用例。可以看到我的測試通過,沒有問題。

接下來,回到 tests/PostTest.php,找到 testSlugify,繼續(xù)增加斷言:

public function testSlugify()

{

$this->assertEquals('hello-world', App\Post::slugify('Hello World'));

$this->assertEquals('a day with laravel', Post::slugify('A Day With laravel'));

}

再次運(yùn)行 ./vendor/bin/phpunit tests/PostTest.php,可以預(yù)見結(jié)果如下:

? 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.

結(jié)果顯示有失敗的斷言,同時(shí)可以看到詳細(xì)的問題所在。很自然的,這是由于我們故意用了錯(cuò)誤的預(yù)期。

對(duì)于 slugify 我們正確的預(yù)期是這樣:

$this->assertEquals('a-day-with-laravel', Post::slugify('A Day With laravel'));

再次運(yùn)行 ./vendor/bin/phpunit tests/PostTest.php,測試都通過,滿足預(yù)期。

功能測試

現(xiàn)在我們已經(jīng)設(shè)計(jì)了一些單元測試,接著來看如何測試多個(gè)元件一起運(yùn)作。功能性測試的第一個(gè)部分會(huì)介紹模擬瀏覽器請(qǐng)求來測試產(chǎn)生的回應(yīng)。

關(guān)于頁面

我們開始測試 PageController 類中的關(guān)于頁面,由于關(guān)于頁面相對(duì)簡單,所以是個(gè)適合入手的地方。執(zhí)行下面的命令:

php artisan make:test PageControllerTest

編輯生成的文件 tests/PageControllerTest.php,內(nèi)容如下:

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 方法會(huì)創(chuàng)建一個(gè) GET 請(qǐng)求,see 方法則斷言在返回的響應(yīng)中會(huì)有指定的文本,這是 Laravel 所提供的最基本的應(yīng)用程序測試。很顯然,我們用很簡單的方式就自動(dòng)完成了對(duì)關(guān)于頁面可訪問性的測試。

命令行下執(zhí)行測試:

./vendor/bin/phpunit tests/PageControllerTest.php

你應(yīng)該會(huì)看到測試成功的消息。試著修改 About larablog 的內(nèi)容為 Contact Us,然后重新執(zhí)行測試。這個(gè)測試現(xiàn)在應(yīng)該會(huì)出現(xiàn)錯(cuò)誤,因?yàn)轫撁嫔险也坏?Contact Us,斷言不成立。

好了,再繼續(xù)后面的內(nèi)容之前,把文字改回 About larablog。

主頁

雖然關(guān)于頁面的測試很簡單,它已經(jīng)大致介紹了網(wǎng)頁功能性測試的基本原則:

請(qǐng)求頁面

檢查回應(yīng)

這是一個(gè)簡單的處理過程,事實(shí)上還有許多其他步驟可以做,比如點(diǎn)擊,填寫表單內(nèi)容等。

我們來建立一個(gè)方法測試首頁,我們知道首頁的網(wǎng)址是 /,它應(yīng)該會(huì)顯示最新的博客文章。在文件 tests/PageControllerTest.php 中新建一個(gè)方法 testIndex(),并加入以下內(nèi)容:

public function testIndex()

{

$this->visit('/')

->see('Continue reading...')

->see('Posted by');

}

你可以看到,跟測試關(guān)于頁面一樣的步驟,執(zhí)行如下命令,看看是否和預(yù)期一樣:

./vendor/bin/phpunit tests/PageControllerTest.php

接著做進(jìn)一步的措施,部分功能性測包含能夠按照用戶的行為在網(wǎng)站上操作,用戶為了在頁面間跳轉(zhuǎn)會(huì)點(diǎn)擊鏈接,我們就試著模擬這個(gè)操作來測試博客文章的標(biāo)題點(diǎn)選后顯示博客文章頁面的鏈接是否正確。下面,更新 tests/PageControllerTest.php 類的 testIndex() 方法。

public function testIndex()

{

$this->visit('/')

->see('Continue reading...')

->see('Posted by')

->click('Continue reading...')

->see('Comments')

->see('Add Comment');

}

我們通過點(diǎn)擊 Continue reading... 鏈接訪問博客文章頁面,通過詳情頁面上存在 Add Comment 來確認(rèn)訪問的是詳情頁內(nèi)容。

執(zhí)行測試來確認(rèn)首頁與博客顯示頁面的跳轉(zhuǎn)是否正確。

./vendor/bin/phpunit tests/PageControllerTest.php

現(xiàn)在你應(yīng)該了解如何在網(wǎng)站頁面間通過鏈接來進(jìn)行功能性測試,接著我們來看看有關(guān)表單的測試。

聯(lián)系頁面

larablog 的用戶可以在聯(lián)系頁面 /contact 通過填寫表單發(fā)送聯(lián)系信息,我們來測試這個(gè)表單提交的過程是否正確。

首先我們需要列出表單成功提交的過程(成功提交在這里意味著表單沒有錯(cuò)誤消息)

訪問聯(lián)系頁面

在表單中輸入值

提交表單

檢查郵件是否發(fā)送成功

檢查用戶端是否收到發(fā)送成功的提醒

到目前為止我們只知道如何進(jìn)行第 1 步和第 5 步,我們現(xiàn)在要看看如何測試中間的 3 個(gè)步驟。

在文件 tests/PageControllerTest.php 中新增一個(gè)方法 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!');

}

我們用同樣的方法,建立了一個(gè)訪問 /contact 的請(qǐng)求,然后檢查頁面是否包含 Contact larablog 的標(biāo)題。接著我們填寫表單內(nèi)容并提交,之后檢查響應(yīng)的信息中是否包含以正確提交的提示。執(zhí)行這個(gè)測試來確認(rèn)所有功能都正確運(yùn)作。

./vendor/bin/phpunit tests/PageControllerTest.php

新增文章評(píng)論

我們現(xiàn)在已經(jīng)可以用在聯(lián)絡(luò)頁面的知識(shí)來測試發(fā)布文章評(píng)論的流程,一樣的,我們需要列出表單提成功提交會(huì)經(jīng)歷的流程。

訪問博客文章頁面

在表單中輸入值

提交表單

檢查新的評(píng)論是否被加入到文章評(píng)論的列表最后

同時(shí)檢查右側(cè) sidebar 最新評(píng)論中是否出現(xiàn)了這條新的評(píng)論

執(zhí)行如下的命令創(chuàng)建測試類:

php artisan make:test CommentTest

在建立的文件 tests/CommentTest.php 中加入以下內(nèi)容:

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');

}

執(zhí)行測試確認(rèn)功能是否是否正確:

./vendor/bin/phpunit tests/CommentTest.php

在我們的表單提交后,我們通過檢查響應(yīng)來獲取到文章的評(píng)論。我們檢查文章評(píng)論列表中的內(nèi)容以及側(cè)邊欄中的最新的評(píng)論信息,確認(rèn)測試結(jié)果滿足預(yù)期。

總結(jié)

我們已經(jīng)提到一些關(guān)于測試重要的地方,我們也介紹了單元測試和功能測試來確保我們網(wǎng)站的功能正確執(zhí)行。我們已經(jīng)看到如何模擬瀏覽器請(qǐng)求以及如何使用輔助方法來檢查請(qǐng)求響應(yīng)。

雖然我們講了一些內(nèi)容,很顯然這不是 Laravel 測試的全部,你可以通過這里的 文檔 來了解更多的細(xì)節(jié)。

總結(jié)

以上是生活随笔為你收集整理的php make test 作用,larablog 系列文章 06 - 测试:使用 PHPUnit 进行单元和功能测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。