国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 后端開發(fā) php教程 PHP測試框架PHPUnit基本使用

PHP測試框架PHPUnit基本使用

May 07, 2020 am 09:49 AM
monolog php phpunit

一、前言

在這篇文章中,我們使用 composer 的依賴包管理工具進(jìn)行phpunit包安裝和管理,composer 官方地址 https://getcomposer.org/,按照提示進(jìn)行全局安裝即可,另外,我們也會(huì)使用一個(gè)非常好用的Monolog記錄日志組件記錄日志,方便我們查看。

在根目錄下建立 coomposer.json 的配置文件,輸入以下內(nèi)容:

{
    "autoload": {
        "classmap": [
            "./"
        ]
    }
}

上面的意思是將根目錄下的所有的類文件都加載進(jìn)來, 在命令行執(zhí)行 composer install 后,在根目錄會(huì)生成出一個(gè)vendor的文件夾,我們以后通過 composer 安裝的任何第三方代碼都會(huì)被生成在這里。

二、為什么要單元測試?

只要你想到輸入一些東西到print語句或調(diào)試表達(dá)式中,就用測試代替它。 --Martin Fowler

PHPUnit 是一個(gè)用PHP編程語言開發(fā)的開源軟件,是一個(gè)單元測試框架。PHPUnit由Sebastian Bergmann創(chuàng)建,源于Kent Beck的SUnit,是xUnit家族的框架之一。

單元測試是對單獨(dú)的代碼對象進(jìn)行測試的過程,比如對函數(shù)、類、方法進(jìn)行測試。單元測試可以使用任意一段已經(jīng)寫好的測試代碼,也可以使用一些已經(jīng)存在的測試框架,比如JUnit、PHPUnit或者Cantata ,單元測試框架提供了一系列共同、有用的功能來幫助人們編寫自動(dòng)化的檢測單元,例如檢查一個(gè)實(shí)際的值是否符合我們期望的值的斷言。單元測試框架經(jīng)常會(huì)包含每個(gè)測試的報(bào)告,以及給出你已經(jīng)覆蓋到的代碼覆蓋率。

總之一句話,使用 phpunit 進(jìn)行自動(dòng)測試,會(huì)使你的代碼更健壯,減少后期維護(hù)的成本,也是一種比較標(biāo)準(zhǔn)的規(guī)范,現(xiàn)如今流行的PHP框架都帶了單元測試,如Laraval,Symfony,Yii2等,單元測試已經(jīng)成了標(biāo)配。

另外,單元測試用例是通過命令操控測試腳本的,而不是通過瀏覽器訪問URL的。

三、安裝PHPUnit

使用 composer 方式安裝 PHPUnit,其他安裝方式請看這里

composer require --dev phpunit/phpunit ^6.2

安裝 Monolog 日志包,做 phpunit 測試記錄日志用。

composer require monolog/monolog

安裝好之后,我們可以看coomposer.json 文件已經(jīng)有這兩個(gè)擴(kuò)展包了:

"require": {  
     "monolog/monolog": "^1.23",
    },
"require-dev": {
        "phpunit/phpunit": "^6.2"
    },

四、PHPUnit簡單用法

1、單個(gè)文件測試

創(chuàng)建目錄tests,新建文件 StackTest.php,編輯如下:

<?php
/**
 * 1、composer 安裝Monolog日志擴(kuò)展,安裝phpunit單元測試擴(kuò)展包
 * 2、引入autoload.php文件
 * 3、測試案例
 *
 *
 */
namespace App\tests;
require_once __DIR__ . &#39;/../vendor/autoload.php&#39;;
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, &#39;foo&#39;);
        // 添加日志文件,如果沒有安裝monolog,則有關(guān)monolog的代碼都可以注釋掉
        $this->Log()->error(&#39;hello&#39;, $stack);
        $this->assertEquals(&#39;foo&#39;, $stack[count($stack)-1]);
        $this->assertEquals(1, count($stack));
        $this->assertEquals(&#39;foo&#39;, array_pop($stack));
        $this->assertEquals(0, count($stack));
    }
    public function Log()
    {
        // create a log channel
        $log = new Logger(&#39;Tester&#39;);
        $log->pushHandler(new StreamHandler(ROOT_PATH . &#39;storage/logs/app.log&#39;, Logger::WARNING));
        $log->error("Error");
        return $log;
    }
}

代碼解釋:

StackTest為測試類

StackTest 繼承于 PHPUnitFrameworkTestCase

測試方法testPushAndPop(),測試方法必須為public權(quán)限,一般以test開頭,或者你也可以選擇給其加注釋@test來表

在測試方法內(nèi),類似于 assertEquals() 這樣的斷言方法用來對實(shí)際值與預(yù)期值的匹配做出斷言。

命令行執(zhí)行:

phpunit 命令 測試文件命名

?  framework#  ./vendor/bin/phpunit tests/StackTest.php
// 或者可以省略文件后綴名
//  ./vendor/bin/phpunit tests/StackTest

執(zhí)行結(jié)果:

?  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__ . &#39;/../vendor/autoload.php&#39;;
require "Calculator.php";
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase
{
    public function testSum()
    {
        $obj = new Calculator;
        $this->assertEquals(0, $obj->sum(0, 0));
    }
}

命令執(zhí)行:

> ./vendor/bin/phpunit tests/CalculatorTest

執(zhí)行結(jié)果:

PHPUnit 6.4.1 by Sebastian Bergmann and contributors.
F                                                                   1 / 1 (100%)
Time: 117 ms, Memory: 4.00MB
There was 1 failure:

如果我們把這里的斷言故意寫錯(cuò),$this->assertEquals(1, $obj->sum(0, 0));

看執(zhí)行結(jié)果:

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.

會(huì)直接報(bào)出方法錯(cuò)誤信息及行號,有助于我們快速找出bug

3、高級用法

你是否已經(jīng)厭煩了在每一個(gè)測試方法命名前面加一個(gè)test,是否因?yàn)橹皇钦{(diào)用的參數(shù)不同,卻要寫多個(gè)測試用例而糾結(jié)?我最喜歡的高級功能,現(xiàn)在隆重推薦給你,叫做框架生成器。

Calculator.php

<?php  
class Calculator  
{  
    public function sum($a, $b)  
    {  
        return $a + $b;  
    }  
}  
?>

命令行啟動(dòng)測試用例,使用關(guān)鍵字 --skeleton

> ./vendor/bin/phpunit --skeleton Calculator.php

執(zhí)行結(jié)果:

PHPUnit 6.4.1 by Sebastian Bergmann and contributors.
Wrote test class skeleton for Calculator to CalculatorTest.php.

是不是很簡單,因?yàn)闆]有測試數(shù)據(jù),所以這里加測試數(shù)據(jù),然后重新執(zhí)行上邊的命令

<?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;  
    }  
}  
?>

原始類中的每個(gè)方法都進(jìn)行@assert注解的檢測。這些被轉(zhuǎn)變?yōu)闇y試代碼,像這樣

    /**
     * Generated from @assert (0, 0) == 0.
     */
    public function testSum() {
        $obj = new Calculator;
        $this->assertEquals(0, $obj->sum(0, 0));
    }

執(zhí)行結(jié)果:

推薦教程:《PHP教程

以上是PHP測試框架PHPUnit基本使用的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

什么是PHP,為什么它用于Web開發(fā)? 什么是PHP,為什么它用于Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

我如何了解最新的PHP開發(fā)和最佳實(shí)踐? 我如何了解最新的PHP開發(fā)和最佳實(shí)踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

如何設(shè)置PHP時(shí)區(qū)? 如何設(shè)置PHP時(shí)區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

我如何驗(yàn)證PHP中的用戶輸入以確保其符合某些標(biāo)準(zhǔn)? 我如何驗(yàn)證PHP中的用戶輸入以確保其符合某些標(biāo)準(zhǔn)? Jun 22, 2025 am 01:00 AM

TovalidateuserinputinPHP,usebuilt-invalidationfunctionslikefilter_var()andfilter_input(),applyregularexpressionsforcustomformatssuchasusernamesorphonenumbers,checkdatatypesfornumericvalueslikeageorprice,setlengthlimitsandtrimwhitespacetopreventlayout

什么是php(serialize(),Unserialize())中的數(shù)據(jù)序列化? 什么是php(serialize(),Unserialize())中的數(shù)據(jù)序列化? Jun 22, 2025 am 01:03 AM

thephpfunctionserize()andunSerialize()redustoconvertComplexdatStructDestoresToroStoroStoroSandaBackagagain.1.Serialize()

如何將PHP代碼嵌入HTML文件中? 如何將PHP代碼嵌入HTML文件中? Jun 22, 2025 am 01:00 AM

可以將PHP代碼嵌入HTML文件中,但需確保文件以.php為擴(kuò)展名,以便服務(wù)器能正確解析。使用標(biāo)準(zhǔn)的標(biāo)簽包裹PHP代碼,可在HTML中任意位置插入動(dòng)態(tài)內(nèi)容。此外,可在同一文件中多次切換PHP與HTML,實(shí)現(xiàn)條件渲染等動(dòng)態(tài)功能。務(wù)必注意服務(wù)器配置及語法正確性,避免因短標(biāo)簽、引號錯(cuò)誤或遺漏結(jié)束標(biāo)簽導(dǎo)致問題。

編寫清潔和可維護(hù)的PHP代碼的最佳實(shí)踐是什么? 編寫清潔和可維護(hù)的PHP代碼的最佳實(shí)踐是什么? Jun 24, 2025 am 12:53 AM

寫干凈、易維護(hù)的PHP代碼關(guān)鍵在于清晰命名、遵循標(biāo)準(zhǔn)、合理結(jié)構(gòu)、善用注釋和可測試性。1.使用明確的變量、函數(shù)和類名,如$userData和calculateTotalPrice();2.遵循PSR-12標(biāo)準(zhǔn)統(tǒng)一代碼風(fēng)格;3.按職責(zé)拆分代碼結(jié)構(gòu),使用MVC或Laravel式目錄組織;4.避免面條式代碼,將邏輯拆分為單一職責(zé)的小函數(shù);5.在關(guān)鍵處添加注釋并撰寫接口文檔,明確參數(shù)、返回值和異常;6.提高可測試性,采用依賴注入、減少全局狀態(tài)和靜態(tài)方法。這些做法提升代碼質(zhì)量、協(xié)作效率和后期維護(hù)便利性。

如何使用PHP執(zhí)行SQL查詢? 如何使用PHP執(zhí)行SQL查詢? Jun 24, 2025 am 12:54 AM

Yes,youcanrunSQLqueriesusingPHP,andtheprocessinvolveschoosingadatabaseextension,connectingtothedatabase,executingqueriessafely,andclosingconnectionswhendone.Todothis,firstchoosebetweenMySQLiorPDO,withPDObeingmoreflexibleduetosupportingmultipledatabas

See all articles