使用 composer + phpstorm 为 PHP 单元测试助力

简介: PHP 单元测试的意义到底何在 我之前也有这样的困惑。看代码写的是否有问题,我们直接请求下就不 ok 了吗?为什么还要写单元测试呢?这不是多此一举吗? 那看我下面的场景举例吧。 单元测试一定要用框架吗 我觉得不用,直接一行脚本,可以不可以?我觉得 ok。

PHP 单元测试的意义到底何在

我之前也有这样的困惑。看代码写的是否有问题,我们直接请求下就不 ok 了吗?为什么还要写单元测试呢?这不是多此一举吗?

那看我下面的场景举例吧。

单元测试一定要用框架吗

我觉得不用,直接一行脚本,可以不可以?我觉得 ok。比如php扩展的各种单元测试,都是简单的比对,非常直观。

那我们为什么现在大家都爱用phpunit呢?

就是一个非常强大的框架,功能比较全,省去了我们很多的工作。
比如我们自己的测试脚本都是简单的自定义的脚本,能全局一次性运行吗?这是最基本的一个举例,实际的优势和便捷,还得自己慢慢使用才会发现。

PHP 单元测试的场景分类

自己分类了下

  • 工具类
  • 服务类
  • 业务类

工具类

新写了一个工具库,比如时间格式化的方法,(刚刚、一分钟前、一小时前、一天前、一个月前等等)这样的函数或者方法。

误区:简单,发个帖子,帖子末尾会有时间,这样就能看到转换是否正确了。
但是这样测试覆盖的全面吗?当团队里的另外一个人想用你的方法的时候,想看看这个工具方法是否靠谱,怎么办呢?

服务类

调用别人的服务

调用别人的服务,比如验证码服务。封装好了发短信的 api,想看是否 ok。怎么办?
如果你正在写一个验证码的页面,还行。其他人想用的时候呢,只能自己临时写个脚本来验证下咯?

自己编写的服务

我的应用不一定是 web 应用,有时候是 soa 的应用。这样导致整个项目中没有地方验证自己的服务是否ok,这种情况不想写单元测试都不行。

业务类

和自己的业务强相关了,比如普通用户报名了一个课程,才能查看该课程得详情;管理员不需要报名就可以直接查看该课程详情。

单元测试的好处

复用性、覆盖率、简单直观、项目规范

https://phpunit.de/getting-started/phpunit-7.html
https://phpunit.readthedocs.io/zh_CN/latest/writing-tests-for-phpunit.html

实际使用

在 phpunit 的基础上,我们使用 composer + phpstorm 配合做单元测试的辅助工具。

通过 composer 安装 phpunit

参考 https://mengkang.net/1212.html

编写单元测试

参考 https://phpunit.readthedocs.io/zh_CN/latest/writing-tests-for-phpunit.html 编写了一个测试,同时自己也写了一个。

自动生成测试类

image

这里还是有些低级,没有 java 规范,没有指定测试目录,总是在脚本的当前目录,也不能自动生成测试方法名,得手写。有待改进吧。

然后在测试类里面写需要测试的方法,约定测试方法以test开头,我选择生成的测试脚本在./Test目录下。然后写了一个testSum的方法。

namespace Test;

use PHPUnit\Framework\TestCase;

class CalculatorUtilTest extends TestCase
{

    public function testSum(){
        $a = new \Utils\CalculatorUtil();
        $data = $a->sum(1,2);
        $this->assertEquals(3,$data);
    }
}

编写 phpunit.xml

<phpunit bootstrap="Bootstrap.php">
    <testsuites>
        <testsuite name="demo">
            <directory>Test</directory>
        </testsuite>
    </testsuites>
</phpunit>

Bootstrap.php 里我加了一个psr-4自动加载规则,而没有在composer里配置。

spl_autoload_register(function($class){
    if (class_exists($class)) {
        return true;
    }

    $pathPsr4 = __DIR__."/".strtr($class, '\\', DIRECTORY_SEPARATOR) . ".php";
    if (file_exists($pathPsr4)){
        include_once $pathPsr4;
    }

    return true;
});

include_once __DIR__."/vendor/autoload.php";

配置 phpunit bin 文件路径

image

运行 phpunit.xml

image
image

不使用 phpunit.xml

其实可以不用编写phpunit.xml,直接在phpstorm里配置,但是这样,其他人要测试就方便了。我们也说明下如何操作。

首先我删除了phpunit.xml,然后做如下配置
image

然后就可以直接在Test目录上选择run

image

总结

写单元测试的时候觉得很无趣,感觉肯定成功,完全不用测,但是项目越来越复杂,就会发现之前的单元测试可能跑不通了(比如一些业务型的功能点)。

写单元测试,不仅是对工作的一个梳理,也是别人复用时的一颗定心丸。

目录
相关文章
|
17天前
|
测试技术 PHP 开发工具
php性能监测模块XHProf安装与测试
【10月更文挑战第13天】php性能监测模块XHProf安装与测试
15 0
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
43 2
|
2月前
|
设计模式 人工智能 算法
PHP中的设计模式:策略模式的深入解析与实践软件测试中的人工智能革命:提升效率与准确性的新篇章
在PHP开发中,理解并运用设计模式是提升代码质量和可维护性的重要途径。本文聚焦于策略模式(Strategy Pattern),一种行为型设计模式,它允许在运行时选择算法或业务规则。通过本文,我们将深入探讨策略模式的定义、结构、使用场景以及如何在PHP项目中有效地实现和利用策略模式。不同于性能优化等技术性摘要,本文着重于提供对策略模式全面而实用的理解,助力开发者编写出更加灵活和可扩展的应用程序。 本文深入探讨了人工智能在软件测试领域的应用,揭示了其如何显著提高测试过程的效率和准确性。通过实际案例分析,展示了AI技术在自动化测试、缺陷检测及结果分析中的关键作用,并讨论了实施AI测试策略时面临的挑
21 3
|
3月前
|
存储 安全 Linux
【Azure 应用服务】App Service For Linux 怎么安装Composer,怎么安装PHP扩展,怎么来修改站点根路径启动程序?
【Azure 应用服务】App Service For Linux 怎么安装Composer,怎么安装PHP扩展,怎么来修改站点根路径启动程序?
|
4月前
|
测试技术 PHP 开发者
原生php单元测试示例
通过上面的示例,我们可以看到,即使在缺乏专门测试框架的情况下,使用原生PHP代码进行基本的单元测试也是完全可行的。当然,对于更复杂的项目,利用像PHPUnit这样的专业工具将带来更多的便利和高级功能。不过,理解单元测试的基本概念和能够手工编写测试是每个PHP开发者的宝贵技能。
34 4
|
3月前
|
敏捷开发 数据可视化 测试技术
阿里云云效产品使用合集之怎么在php composer安装自己服务器的代码
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
4月前
|
测试技术 PHP 开发者
原生php单元测试示例
通过上面的示例,我们可以看到,即使在缺乏专门测试框架的情况下,使用原生PHP代码进行基本的单元测试也是完全可行的。当然,对于更复杂的项目,利用像PHPUnit这样的专业工具将带来更多的便利和高级功能。不过,理解单元测试的基本概念和能够手工编写测试是每个PHP开发者的宝贵技能。
21 1
|
4月前
|
数据库
基于PHP+MYSQL开发制作的趣味测试网站源码
基于PHP+MYSQL开发制作的趣味测试网站源码。可在后台提前设置好缘分, 自己手动在数据库里修改数据,数据库里有就会优先查询数据库的信息, 没设置的话第一次查询缘分都是非常好的 95-99,第二次查就比较差 , 所以如果要你女朋友查询你的名字觉得很好 那就得是她第一反应是查和你的缘分, 如果查的是别人,那不好意思,第二个可能是你。
64 3
|
4月前
|
测试技术 PHP 开发者
原生php单元测试示例
通过上面的示例,我们可以看到,即使在缺乏专门测试框架的情况下,使用原生PHP代码进行基本的单元测试也是完全可行的。当然,对于更复杂的项目,利用像PHPUnit这样的专业工具将带来更多的便利和高级功能。不过,理解单元测试的基本概念和能够手工编写测试是每个PHP开发者的宝贵技能。
25 0
|
4月前
|
PHP 开发者
如何用Composer管理PHP项目的第三方扩展包
【7月更文挑战第2天】**Composer 是PHP开发的关键工具,用于管理项目依赖。安装需PHP 5.6.4+,通过官网脚本安装。在项目根目录创建 `composer.json` 文件定义依赖,使用 `composer require` 命令安装扩展包,如Guzzle。`composer.lock` 保证版本一致。`require_once &#39;vendor/autoload.php&#39;;` 实现自动加载。更新依赖用 `composer update`,管理依赖提升效率和项目维护性。深入学习可发掘更多高级功能。**
136 0