PHP測試框架PHPUnit基本上使用
一、前言
在這篇文章中,我們使用composer 的依賴套件管理工具進行phpunit套件安裝與管理,composer 官方網址https: //getcomposer.org/,依照提示進行全域安裝即可,另外,我們也會使用一個非常好用的Monolog記錄日誌元件記錄日誌,方便我們查看。
在根目錄下建立coomposer.json 的設定檔,輸入以下內容:
{ "autoload": { "classmap": [ "./" ] } }
上面的意思是將根目錄下的所有的類別檔案都載入進來, 在命令列執行composer install 後,在根目錄會產生一個vendor的資料夾,我們以後透過composer 安裝的任何第三方程式碼都會被產生在這裡。
二、為什麼要單元測試?
只要你想到輸入一些東西到print語句或調試表達式中,就用測試代替它。 --Martin Fowler
PHPUnit 是一個用PHP程式語言開發的開源軟體,是一個單元測試框架。 PHPUnit由Sebastian Bergmann創建,源自於Kent Beck的SUnit,是xUnit家族的框架之一。
單元測試是對單獨的程式碼物件進行測試的過程,例如對函數、類別、方法進行測試。單元測試可以使用任一段已經寫好的測試程式碼,也可以使用一些已經存在的測試框架,例如JUnit、PHPUnit或Cantata ,單元測試框架提供了一系列共同、有用的功能來幫助人們編寫自動化的檢測單元,例如檢查一個實際的值是否符合我們期望的值的斷言。單元測試框架經常包含每個測試的報告,以及給出你已經涵蓋到的程式碼覆蓋率。
總之一句話,使用phpunit 進行自動測試,會使你的程式碼更健壯,減少後期維護的成本,也是一種比較標準的規範,現如今流行的PHP框架都帶了單元測試,如Laraval,Symfony,Yii2等,單元測試已經成了標配。
另外,單元測試案例是透過命令操控測試腳本的,而不是透過瀏覽器存取URL的。
三、安裝PHPUnit
使用composer 方式安裝PHPUnit,其他安裝方式請看這裡
composer require --dev phpunit/phpunit ^6.2
安裝Monolog 日誌包,做phpunit 測試記錄日誌用。
composer require monolog/monolog
安裝好之後,我們可以看coomposer.json 檔案已經有這兩個擴充包了:
"require": { "monolog/monolog": "^1.23", }, "require-dev": { "phpunit/phpunit": "^6.2" },
四、PHPUnit簡單用法
#1、單一檔案測試
建立目錄tests,新檔案StackTest.php,編輯如下:
<?php /** * 1、composer 安装Monolog日志扩展,安装phpunit单元测试扩展包 * 2、引入autoload.php文件 * 3、测试案例 * * */ namespace App\tests; require_once __DIR__ . '/../vendor/autoload.php'; define("ROOT_PATH", dirname(__DIR__) . "/"); use Monolog\Logger; use Monolog\Handler\StreamHandler; use PHPUnit\Framework\TestCase; class StackTest extends TestCase { public function testPushAndPop() { $stack = []; $this->assertEquals(0, count($stack)); array_push($stack, 'foo'); // 添加日志文件,如果没有安装monolog,则有关monolog的代码都可以注释掉 $this->Log()->error('hello', $stack); $this->assertEquals('foo', $stack[count($stack)-1]); $this->assertEquals(1, count($stack)); $this->assertEquals('foo', array_pop($stack)); $this->assertEquals(0, count($stack)); } public function Log() { // create a log channel $log = new Logger('Tester'); $log->pushHandler(new StreamHandler(ROOT_PATH . 'storage/logs/app.log', Logger::WARNING)); $log->error("Error"); return $log; } }
程式碼解釋:
StackTest為測試類別
StackTest 繼承於PHPUnit\Framework\TestCase
測試方法testPushAndPop(),測試方法必須為public權限,一般以test開頭,或者你也可以選擇給其加註解@test來表
在測試方法內,類似於assertEquals() 這樣的斷言方法用來對實際值與預期值的匹配做出斷言。
命令列執行:
phpunit 命令測試檔案命名
➜ framework# ./vendor/bin/phpunit tests/StackTest.php // 或者可以省略文件后缀名 // ./vendor/bin/phpunit tests/StackTest
執行結果:
➜ framework# ./vendor/bin/phpunit tests/StackTest.php PHPUnit 6.4.1 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 56 ms, Memory: 4.00MB OK (1 test, 5 assertions)
我們可以在app.log檔案中查看我們列印的日誌資訊。
2、類別檔案引入
Calculator.php
<?php class Calculator { public function sum($a, $b) { return $a + $b; } } ?>
單元測試類別:
CalculatorTest.php
#<?php namespace App\tests; require_once __DIR__ . '/../vendor/autoload.php'; require "Calculator.php"; use PHPUnit\Framework\TestCase; class CalculatorTest extends TestCase { public function testSum() { $obj = new Calculator; $this->assertEquals(0, $obj->sum(0, 0)); } }
指令執行:
> ./vendor/bin/phpunit tests/CalculatorTest
執行結果:
PHPUnit 6.4.1 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 117 ms, Memory: 4.00MB There was 1 failure:
如果我們把這裡的斷言故意寫錯,$this->assertEquals(1, $obj->sum(0 , 0));
看執行結果:
PHPUnit 6.4.1 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 117 ms, Memory: 4.00MB There was 1 failure: 1) App\tests\CalculatorTest::testSum Failed asserting that 0 matches expected 1. /Applications/XAMPP/xamppfiles/htdocs/web/framework/tests/CalculatorTest.php:22 FAILURES! Tests: 1, Assertions: 1, Failures: 1.
會直接報出方法錯誤訊息及行號,有助於我們快速找出bug
3.進階用法
你是否已經厭煩了在每一個測試方法命名前面加一個test,是否因為只是呼叫的參數不同,卻要寫多個測試案例而糾結?我最喜歡的進階功能,現在隆重推薦給你,叫做框架產生器。
Calculator.php
<?php class Calculator { public function sum($a, $b) { return $a + $b; } } ?>
命令列啟動測試案例,使用關鍵字--skeleton
> ./vendor/bin/phpunit --skeleton Calculator.php
執行結果:
PHPUnit 6.4.1 by Sebastian Bergmann and contributors. Wrote test class skeleton for Calculator to CalculatorTest.php.
是不是很簡單,因為沒有測試數據,所以這裡加測試數據,然後重新執行上邊的命令
<?php class Calculator { /** * @assert (0, 0) == 0 * @assert (0, 1) == 1 * @assert (1, 0) == 1 * @assert (1, 1) == 2 */ public function sum($a, $b) { return $a + $b; } } ?>
原始類別中的每個方法都進行@assert註解的檢測。這些被轉變為測試程式碼,像這樣
/** * Generated from @assert (0, 0) == 0. */ public function testSum() { $obj = new Calculator; $this->assertEquals(0, $obj->sum(0, 0)); }
執行結果:
登入後複製
推薦教學:《PHP教學》
以上是PHP測試框架PHPUnit基本上使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
