laravel中怎么利用Tests實(shí)現(xiàn)自動(dòng)化測試,針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)專注于湖南網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供湖南營銷型網(wǎng)站建設(shè),湖南網(wǎng)站制作、湖南網(wǎng)頁設(shè)計(jì)、湖南網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造湖南網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供湖南網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
使用 PHPUnit 的第一步是創(chuàng)建一個(gè)新的測試類。測試類的約定是它們存儲(chǔ)在應(yīng)用程序目錄的 ./tests/
下。在這個(gè)文件夾中,每個(gè)測試類都被命名為
。這種格式允許 PHPUnit 查找每個(gè)測試類---它將忽略任何不以 Test.php
結(jié)尾的文件。
在新的 Laravel 應(yīng)用程序中,你會(huì)注意到 ./tests/
目錄中有兩個(gè)文件: ExampleTest.php
和 TestCase.php
. TestCase.php
文件是一個(gè)引導(dǎo)文件用于在我們的測試中設(shè)置 Laravel 環(huán)境。這允許我們在測試中使用 Laravel Facades 并為測試助手提供框架,我們將在稍后介紹。 ExampleTest.php
是一個(gè)示例測試類,其中包含使用應(yīng)用程序測試助手的基本測試用例-暫時(shí)忽略它。
要?jiǎng)?chuàng)建一個(gè)新的測試類,我們可以手動(dòng)創(chuàng)建一個(gè)新文件,或者運(yùn)行由 Laravel 提供的 Artisan 命令 make:test
為了創(chuàng)建一個(gè)名為 BasicTest
的測試類,我們只需要運(yùn)行這個(gè) artisan 命令:
php artisan make:test BasicTest
Laravel 將創(chuàng)建一個(gè)如下所示的基本測試類:
assertTrue(true); } }
這里要注意的最重要的事情是 test
方法名稱上的前綴,與 Test
類名后綴一樣,這樣 test
前綴告訴 PHPUnit 在測試時(shí)運(yùn)行哪些方法。如果您忘記了 test
前綴,那么 PHPUnit 將忽略該方法。
在我們第一次運(yùn)行測試套件之前,有必要指出 Laravel 提供的默認(rèn) phpunit.xml
文件。 PHPUnit 在運(yùn)行時(shí)會(huì)自動(dòng)在當(dāng)前目錄中查找名為 phpunit.xml
或者 phpunit.xml.dist
的文件。您可以在此處配置測試的特定選項(xiàng)。
這個(gè)文件中有很多信息,但是現(xiàn)在最重要的部分是在 testsuite
目錄定義:
... ./tests/
這將告訴 PHPUnit 運(yùn)行時(shí)在 ./tests/
目錄中找到的測試,正如我們之前所知,這是存儲(chǔ)測試的約定。
現(xiàn)在我們已經(jīng)創(chuàng)建了一個(gè)基本測試,并且知道了 PHPUnit 配置,現(xiàn)在是第一次運(yùn)行測試的時(shí)候了。
您可以通過運(yùn)行以下 phpunit
命令來運(yùn)行測試:
./vendor/bin/phpunit
您應(yīng)該看到與此類似的輸出:
PHPUnit 4.8.19 by Sebastian Bergmann and contributors. .. Time: 103 ms, Memory: 12.75Mb OK (2 tests, 3 assertions)
現(xiàn)在我們已經(jīng)有了一個(gè)有效的 PHPUnit 設(shè)置,現(xiàn)在是時(shí)候開始編寫一個(gè)基本測試了。
注意,它會(huì)統(tǒng)計(jì)2個(gè)測試和3個(gè)斷言,因?yàn)?ExampleTest.php
文件包含了一個(gè)帶有兩個(gè)斷言的測試。我們的新基本測試包括一個(gè)單獨(dú)的斷言,該斷言已通過。
為了幫助 PHPUnit 提供的基本斷言,我們將首先創(chuàng)建一個(gè)提供一些簡單功能的基本類
在 ./app/
目錄中創(chuàng)建一個(gè)名為 Box.php
的新文件,并復(fù)制此示例類:
items = $items; } /** * 檢查指定的項(xiàng)目是否在框中。 * * @param string $item * @return bool */ public function has($item) { return in_array($item, $this->items); } /** * 從框中移除項(xiàng),如果框?yàn)榭?,則為 null 。 * * @return string */ public function takeOne() { return array_shift($this->items); } /** * 從包含指定字母開頭的框中檢索所有項(xiàng)目。 * * @param string $letter * @return array */ public function startsWith($letter) { return array_filter($this->items, function ($item) use ($letter) { return stripos($item, $letter) === 0; }); } }
接下來, 打開你的 ./tests/BasicTest.php
類(我們之前創(chuàng)建的類),并刪除默認(rèn)創(chuàng)建的 testExample
方法, 你應(yīng)該留一個(gè)空類。
我們現(xiàn)在將使用七個(gè)基本的 PHPUnit 斷言來為我們的 Box
類編寫測試。這些斷言是:
assertTrue()
assertFalse()
assertEquals()
assertNull()
assertContains()
assertCount()
assertEmpty()
assertTrue()
和 assertFalse()
允許你聲明一個(gè)值等于 true 或 false 。這意味著它們非常適合測試返回布爾值的方法。在我們的 Box
類中,我們有一個(gè)名為 has($item)
的方法,當(dāng)指定的項(xiàng)在 box 中或不在 box 中時(shí),該方法返回對應(yīng)返回 true 或 false .
要在 PHPUnit 中為此編寫測試,我們可以執(zhí)行以下操作:
assertTrue($box->has('toy')); $this->assertFalse($box->has('ball')); } }
注意我們?nèi)绾沃粚⒁粋€(gè)參數(shù)傳遞給 assertTrue()
和 assertFalse()
方法,并且它是 has($item)
方法的輸入.
如果您現(xiàn)在運(yùn)行 ./vendor/bin/phpunit
命令,您會(huì)注意到輸出包括:
OK (2 tests, 4 assertions)
這意味著我們的測試已經(jīng)通過。
如果您將 assertFalse()
替換成 assertTrue()
并運(yùn)行 phpunit
命令,輸出將如下所示:
PHPUnit 4.8.19 by Sebastian Bergmann and contributors. F. Time: 93 ms, Memory: 13.00Mb There was 1 failure: 1) BasicTest::testHasItemInBox Failed asserting that false is true. ./tests/BasicTest.php:12 FAILURES! Tests: 2, Assertions: 4, Failures: 1.
這告訴我們第12行的斷言未能斷言 false
值是 true
- 因?yàn)槲覀儗?assertFalse()
替換為 assertTrue()
。
將其交換回來,然后重新運(yùn)行 PHPUnit 。測試應(yīng)該再次通過,因?yàn)槲覀円呀?jīng)修復(fù)了破損的測試。
接下來,讓我們看看 assertEquals()
, 以及 assertNull()
。
assertEquals()
用于比較變量實(shí)際值與預(yù)期值是否相等。我們用它來檢查 takeOne()
方法的返回值是否為 Box 內(nèi)的當(dāng)前值。當(dāng) Box 為空時(shí),takeOne()
將返回 null
,我們亦可使用 assertNull()
來進(jìn)行檢查。
與 assertTrue()
、assertFalse()
以及 assertNull()
不同,assertEquals()
需要兩個(gè)參數(shù)。第一個(gè)參數(shù)為 預(yù)期值,第二個(gè)參數(shù)則為 實(shí)際值。
可參照如下代碼實(shí)現(xiàn)以上斷言(assertions
):
assertTrue($box->has('toy')); $this->assertFalse($box->has('ball')); } public function testTakeOneFromTheBox() { $box = new Box(['torch']); $this->assertEquals('torch', $box->takeOne()); // 當(dāng)前 Box 為空,應(yīng)當(dāng)為 Null $this->assertNull($box->takeOne()); } }
運(yùn)行 phpunit
命令,你應(yīng)當(dāng)看到如下輸出:
OK (3 tests, 6 assertions)
終于,我們有三個(gè)作用于數(shù)組有關(guān)的斷言,我們能夠使用它們?nèi)z查 Box
類中的 startsWith($item)
方法。 assertContains()
斷言傳遞進(jìn)來的數(shù)組中包含指定值, assertCount()
斷言數(shù)組的項(xiàng)數(shù)為指定數(shù)量,assertEmpty()
斷言傳遞進(jìn)來的數(shù)組為空。
讓我們來執(zhí)行以下測試:
assertTrue($box->has('toy')); $this->assertFalse($box->has('ball')); } public function testTakeOneFromTheBox() { $box = new Box(['torch']); $this->assertEquals('torch', $box->takeOne()); // Null,現(xiàn)在這個(gè) box 是空的。 $this->assertNull($box->takeOne()); } public function testStartsWithALetter() { $box = new Box(['toy', 'torch', 'ball', 'cat', 'tissue']); $results = $box->startsWith('t'); $this->assertCount(3, $results); $this->assertContains('toy', $results); $this->assertContains('torch', $results); $this->assertContains('tissue', $results); // 如果傳遞復(fù)數(shù)斷言數(shù)組為空 $this->assertEmpty($box->startsWith('s')); } }
保存并再一次運(yùn)行你的測試:
OK (4 tests, 9 assertions)
恭喜你,你剛剛使用七個(gè)基礎(chǔ)的 PHPUnit 斷言完成了對 Box
類的全部測試。通過這些簡單的斷言你能夠做許多事,對于其他斷言,大多數(shù)要更復(fù)雜,不過它們?nèi)宰裱陨鲜褂靡?guī)則。
在你的程序里,對每個(gè)組件進(jìn)行單元測試在很多情況下都是有必要的,而且也應(yīng)該成為你開發(fā)過程中必不可少的一部分,但這并不是你需要做的全部的測試。當(dāng)你構(gòu)建一個(gè)包含復(fù)雜視圖、導(dǎo)航和表單的程序時(shí),你同樣想測試這些組件。這時(shí),Laravel的測試助手可以使這些測試像單元測試簡單組件一樣容易。
我們之前查看在 ./tests/
目錄下的默認(rèn)文件時(shí)跳過了 ./tests/ExampleTest.php
文件。 現(xiàn)在打開它,內(nèi)容如下所示:
visit('/') ->see('Laravel 5'); } }
我們可以看到這個(gè)測試示例非常簡單。在不知道測試助手如何運(yùn)作的情況下,我們可以猜測它的意思如下:
當(dāng)我訪問/
(根目錄)
我應(yīng)該看到 'Laravel 5'
如果你打開你的web瀏覽器,訪問我們的程序(如果你沒有啟動(dòng)你的web服務(wù)器,你可以運(yùn)行 php artisan serve
),你應(yīng)該可以在web根目錄上看到屏幕上有“Laravel 5”的文本。 鑒于這個(gè)測試已經(jīng)通過了PHPUnit,我們可以很確定地說我們對這個(gè)測試示例改造是正確的。
這個(gè)測試確保了訪問/路徑,網(wǎng)頁可以返回“'Laravel 5”的文本。一個(gè)如此簡單的檢查也許不代表什么,但如果你的網(wǎng)站上要顯示關(guān)鍵信息,它就可以在一個(gè)別處的改動(dòng)導(dǎo)致這個(gè)頁面無法正常顯示正確的信息時(shí),防止你部署一個(gè)被損壞的程序。
現(xiàn)在嘗試編寫自己的測試,更進(jìn)一步理解它吧。
首先,編輯 ./app/Http/routes.php
,增加一個(gè)新的路由。為了教程目的,我們創(chuàng)建希臘字母定義的路由:
然后,創(chuàng)建視圖文件
./resources/views/alpha.blade.php
,使用 Alpha 作為關(guān)鍵字,保存基本的HTML文件:Alpha This is the Alpha page.
打開瀏覽器,輸入網(wǎng)址:
http://localhost:8000/beta
,頁面會(huì)顯示出 "This is the Alpha page." 的內(nèi)容。現(xiàn)在我們有了測試用到的模版文件,下一步,我們通過運(yùn)行命令
make:test
來創(chuàng)建一個(gè)新的測試文件:php artisan make:test AlphaTest然后變成剛創(chuàng)建好的測試文件,按照框架提供的例子,測試 "alpha" 頁面上沒有包含 "beta" 。 我們可以使用方法
dontSee()
,它是see()
的對應(yīng)的反向方法。下面代碼是上面實(shí)現(xiàn)的簡單例子:
visit('/alpha') ->see('Alpha') ->dontSee('Beta'); } }保存并運(yùn)行 PHPUnit (
./vendor/bin/phpunit
),測試代碼應(yīng)該會(huì)全部通過,你會(huì)看到像這樣的測試狀態(tài)內(nèi)容顯示:OK (5 tests,12 assertions)開發(fā)前先寫測試
對于測試來說,測試驅(qū)動(dòng)開發(fā)(TDD) 是非常酷的方法,首先我們先寫測試。寫完測試并執(zhí)行它們,你會(huì)發(fā)現(xiàn)測試沒通過,接下來我們編寫滿足測試的代碼,再次執(zhí)行測試,使測試通過。 接下來讓我們開始。
首先,建立一個(gè)
BetaTest
類使用make:test
artisan 命令:php artisan make:test BetaTest接下來,更新測試用例以便檢查
/beta
的路由 route 為「Beta」:visit('/beta') ->see('Beta') ->dontSee('Alpha'); } }現(xiàn)在使用
./vendor/bin/phpunit
命令來執(zhí)行測試。結(jié)果是一個(gè)看起來簡潔但不好的錯(cuò)誤信息,如下:> ./vendor/bin/phpunit PHPUnit 4.8.19 by Sebastian Bergmann and contributors. ....F. Time: 144 ms, Memory: 14.25Mb There was 1 failure: 1) BetaTest::testDisplaysBeta 一個(gè)對 [http://localhost/beta] 的請求失敗了。收到狀態(tài)碼 [404]。 ... FAILURES! Tests: 6, Assertions: 13, Failures: 1.我們現(xiàn)在需要?jiǎng)?chuàng)建這個(gè)不存在的路由。讓我們開始。
首先,編輯
./app/Http/routes.php
文件來創(chuàng)建新的/beta
路由:接下來,在
./resources/views/beta.blade.php
下創(chuàng)建如下視圖模版:Beta This is the Beta page.
現(xiàn)在再一次執(zhí)行 PHPUnit,結(jié)果應(yīng)該再一次回到綠色。
> ./vendor/bin/phpunit PHPUnit 4.8.19 by Sebastian Bergmann and contributors. ...... Time: 142 ms, Memory: 14.00Mb OK (6 tests, 15 assertions)這樣我們就通過在完成新的頁面之前寫測試的方式,對 測試驅(qū)動(dòng)開發(fā)進(jìn)行了實(shí)踐。
click() 和 seePageIs()
Laravel 也提供一個(gè)輔助函數(shù) (
click()
) 允許測試點(diǎn)擊頁面中存在的連接 ,以及一個(gè)方法 (seePageIs()
) 檢查點(diǎn)擊展示的結(jié)果頁面。讓我們使用這兩個(gè)輔助函數(shù)去執(zhí)行在 Alpha 和 Beta 頁面的鏈接。
首先,我們更新我們的測試。打開
AlphaTest
類,我們將添加一個(gè)新的測試方法,這將點(diǎn)擊 「alpha」頁面上的「Next」鏈接跳轉(zhuǎn)到 「beta」頁面。新的測試代碼如下:
visit('/alpha') ->see('Alpha') ->dontSee('Beta'); } public function testClickNextForBeta() { $this->visit('/alpha') ->click('Next') ->seePageIs('/beta'); } }注意到,在我們新建的
testClickNextForBeta()
方法中,我們并沒有檢查每一個(gè)頁面的內(nèi)容。 其他測試都成功的檢查了兩個(gè)頁面的內(nèi)容,所以這里我們只關(guān)心點(diǎn)擊 「Next」鏈接將發(fā)送到/beta
。你現(xiàn)在可以運(yùn)行測試組件了,但就像預(yù)料的一樣測試將不通過,因?yàn)槲覀冞€沒有更新我們的 HTML。
接下來,我們將更新
BetaTest
來做類似的事情:visit('/beta') ->see('Beta') ->dontSee('Alpha'); } public function testClickNextForAlpha() { $this->visit('/beta') ->click('Previous') ->seePageIs('/alpha'); } }接下來,我們更新我們的 HTML 模版。
./resources/views/alpha.blade.php
:Alpha This is the Alpha page.
./resources/views/beta.blade.php
:Beta This is the Beta page.
保存文件,再一次執(zhí)行 PHPUnit:
> ./vendor/bin/phpunit PHPUnit 4.8.19 by Sebastian Bergmann and contributors. F....F.. Time: 175 ms, Memory: 14.00Mb There were 2 failures: 1) AlphaTest::testDisplaysAlpha Failed asserting that 'Alpha This is the Alpha page.
' does not match PCRE pattern "/Beta/i". 2) BetaTest::testDisplaysBeta Failed asserting that 'Beta This is the Beta page.
' does not match PCRE pattern "/Alpha/i". FAILURES! Tests: 8, Assertions: 23, Failures: 2.然而測試失敗了。如果你仔細(xì)觀察我們的新 HTML,你將注意到我們分別有術(shù)語
beta
和alpha
在/alpha
和/beta
頁面。這意味著我們需要稍微更改我們的測試讓它們與誤報(bào)不匹配。在每一個(gè)
AlphaTest
和BetaTest
類,更新testDisplays*
方法去使用dontSee('
。通過這種方式,這將僅僅匹配字符串而不是那個(gè)術(shù)語。page') 兩個(gè)測試文件如下所示:
./tests/AlphaTest.php
:visit('/alpha') ->see('Alpha') ->dontSee('Beta page'); } public function testClickNextForBeta() { $this->visit('/alpha') ->click('Next') ->seePageIs('/beta'); } }
./tests/BetaTest.php
:visit('/beta') ->see('Beta') ->dontSee('Alpha page'); } public function testClickNextForAlpha() { $this->visit('/beta') ->click('Previous') ->seePageIs('/alpha'); } }再一次運(yùn)行你的測試,所有的測試都應(yīng)該通過了。我們現(xiàn)在已經(jīng)測試我們所有的新文件,包括頁面中的 Next/Previous 鏈接。
通過 Semaphore 對 PHPUnit 持續(xù)集成
通過 Semaphore設(shè)置 持續(xù)集成你可以自動(dòng)執(zhí)行你的測試。
這樣每一次你進(jìn)行
git push
提交代碼的時(shí)候都會(huì)執(zhí)行你的測試,并且 Semaphore 預(yù)裝了所有最新的 PHP 版本。如果你還沒有一個(gè) Semaphore 賬戶, 先去 注冊一個(gè)免費(fèi)的 Semaphore 賬戶 。接下來需要做的是將它 添加到你的項(xiàng)目,并按照提示逐步去做來執(zhí)行你的測試:
composer install --prefer-source phpunit關(guān)于laravel中怎么利用Tests實(shí)現(xiàn)自動(dòng)化測試問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
文章名稱:laravel中怎么利用Tests實(shí)現(xiàn)自動(dòng)化測試
分享地址:http://weahome.cn/article/gosjcj.html