• 技术文章 >后端开发 >php教程

    什么是PHPUnit?在PHP项目中怎么使用?

    青灯夜游青灯夜游2022-04-28 11:20:41转载1976
    什么是PHPUnit?在PHP项目中怎么使用?下面本篇文章给大家介绍一下在PHP项目中使用PHPUnit框架进行单元测试的方法,希望对大家有所帮助!

    镜像地址 : PHPUnit简介以及如何在项目中使用 - 多厘(https://wulicode.com/php/vendor/phpunit-at-project/index.html)

    官方文档:https://phpunit.readthedocs.io/zh_CN/latest/

    单元测试介绍

    单元测试是分别对程序的单元(方法, 函数)进行测试,判断执行结果是否符合预期

    单元测试能协助开发者什么?

    1.确保单元的执行结果

    2.尽早发现程序中的错误

    3.修改程序, 更加有信心

    PHPUnit

    PHPUnit 是 PHP 程式语言中最常见的单元测试 (unit testing) 框架,PHPUnit 是参考 xUnit 架构利用 PHP 实作出来。

    安装PHPUnit

    # 项目中安装
    $ composer require --dev phpunit/phpunit
    
    # 下载到本地
    $ wget https://phar.phpunit.de/phpunit-9.phar

    使用项目中安装可以在项目中直接运行, 无需太多配置, 将 phar 下载到非项目文件夹, 可以减少项目代码的体积, 我一般采用下载到本地, 然后多个项目公用一个 phpunit.phar, 减少项目体积, 不过需要在 IDE中增加更多配置

    配置autoload

    添加下面的代码到composer.json PackageName是项目的名称,src是包含PHP class文件的文件夹地址,项目根目录下的子文件夹。

    ...
        "autoload": {
           "psr-4": {
                "PackageName\\": "src/",
                "PackageName\\Tests": "tests/"
            }
         },
    ...

    设置PHPUnit

    在phpstorm中 Languages & Frameworks >PHP >Test Frameworks 根据不同的加载方式设置不同的配置

    1.png

    如果是项目额外加载, 则需要把 phpunit 所在的文件夹作为 library 加入项目, 便于代码提示 Preferences | Languages & Frameworks | PHP , 加入 phpunit 文件夹

    2.png

    编写PHPUnit测试

    ArrayTest 用 PHPUnit 测试数组操作

    <?php
    use PHPUnit\Framework\TestCase;
    
    class ArrayTest extends TestCase
    {
        public function testPushAndPop()
        {
            $stack = [];
            $this->assertCount(0, $stack);
    
            $stack[] = 'foo';
            $this->assertEquals('foo', $stack[count($stack) - 1]);
            $this->assertCount(1, $stack);
    
            $this->assertEquals('foo', array_pop($stack));
            $this->assertCount(0, $stack);
        }
    }

    在 IDE 中运行

    3.png

    PHPUnit 断言

    laravel 中除了标准的 PHPUnit 断言(assertEquals(), assertContains(), assertInstanceOf(), …更多断言请看https://phpunit.readthedocs.io/zh_CN/latest/assertions.html?highlight=assertTrue#)之外, 还存在很多允许测试 web 应用的检测项目

    assertPageLoaded($uri, $message = null)

    检测最近的页面是否被加载, 如果不存在 url / message 时候会报错

    assertResponseOk()

    是否页面相应OK

    assertReponseStatus($code)

    是否响应指定的code

    assertViewHas($key, $value = null)

    视图中是否存在指定的数据

    assertViewHasAll($bindings)

    视图中是否存在指定的一系列数据

    assertViewMissing($key)

    指定视图中是否不存在这个数据

    assertRedirectedTo($uri, $with = [])

    检测是否重定向到指定的uri

    assertRedirectedToRoute($name, $parameters = [], $with = [])

    是否客户端重定向到指定的路由

    assertRedirectedToAction($name, $parameters = [], $with = [])

    是否重定向到 action

    assertSessionHas($key, $value = null)

    session 中是否存在 key/ value

    assertSessionHasAll($bindings)

    session 中是否存在指定的 kv

    assertSessionHasErrors($bindings = [])

    session 是否存在错误

    assertHasOldInput()

    session 中是否存在以前的数据

    示例 xml 文件

    phpunit.xml at 9.x · laravel

    https://github.com/laravel/laravel/blob/9.x/phpunit.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
        bootstrap="vendor/autoload.php"
        colors="true">
        <testsuites>
            <testsuite name="Unit">
                <directory suffix="Test.php">./tests/Unit</directory>
            </testsuite>
            <testsuite name="Feature">
                <directory suffix="Test.php">./tests/Feature</directory>
            </testsuite>
        </testsuites>
        <coverage processUncoveredFiles="true">
            <include>
                <directory suffix=".php">./app</directory>
            </include>
        </coverage>
        <php>
            <env name="APP_ENV" value="testing"/>
            <env name="BCRYPT_ROUNDS" value="4"/>
            <env name="CACHE_DRIVER" value="array"/>
            <!-- <env name="DB_CONNECTION" value="sqlite"/> -->
            <!-- <env name="DB_DATABASE" value=":memory:"/> -->
            <env name="MAIL_MAILER" value="array"/>
            <env name="QUEUE_CONNECTION" value="sync"/>
            <env name="SESSION_DRIVER" value="array"/>
            <env name="TELESCOPE_ENABLED" value="false"/>
        </php>
    </phpunit>

    Php 的单元覆盖率

    安装 xdebug / Phpunit

    # 安装 xdebug
    $ pecl install xdebug

    启用 xdebug

    # php.ini 文件
    xdebug.mode = coverage

    4.png

    5.png

    推荐学习:《PHP视频教程

    以上就是什么是PHPUnit?在PHP项目中怎么使用?的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:php
    上一篇:一文带你PHP利用phpmailer实现邮件发送功能 下一篇:php反序列化实例详解之字符串逃逸
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• php怎么判断字符串中有某几个字符• php怎么替换数组中的一个值• php怎么在二维数组末尾增加元素• php字符串怎么替换第一个字符后面的字符• php怎么去除字符串中某几个子字符串• 一文带你PHP利用phpmailer实现邮件发送功能
    1/1

    PHP中文网