从PHPUnit开始编写单元测试
背景
在项目中为什么要做测试呢?
即时是很小规模的项目开发也需要数小时的辛苦编程。在开发过程中,应用代码中或多或少都会存在一些大大小小的问题,开发者往往会尝试在开发过程中解决这些问题,以便顺利上线。
但问题是在未经完整测试的情况下,没有一种方式可以确保最终上线代码没有任何问题,此外也没有办法确保修复老问题的代码不会引起新问题。
为了解决上述问题,我们才需要在开发过程中引入测试流程,并将其作为日常开发流程中不可或缺的一部分,从而确保代码质量。
在现代软件开发流程中,测试驱动开发、持续交付、持续集成这些概念都将测试作为开发流程的一部分,要求我们在软件开发的一开始,就要设计好相关的测试方法,从而让代码更加易于扩展、迭代和维护。
分类
常见的测试主要包括单元测试和功能测试
单元测试
单元测试是一种通过编写测试代码来确认函数、类和方法是否以我们预期的方式来工作,单元测试会贯穿整个项目的开发周期。通过检查各个函数和方法的输入输出,就可以保证代码内部的逻辑已经正确执行。
功能测试
功能测试是通过使用工具来生成自动化的测试用例,然后再真实的系统上运行,而不是单元测试中简单的验证单个模块的正确性。这些工具会使用有代表性的真实数据来模拟真实用户的行为从而验证系统的正确性。
PHPUnit简介和安装配置
在 PHP
中,最著名的单元测试框架就是 PHPUnit
了,下面将以 PHPUnit
为例,介绍如何在项目中进行单元测试
安装
如果在 Laravel
项目中,PHPUnit
已经默认集成了,如果是在其他项目中使用,可以通过composer进行安装
composer require --dev phpunit/phpunit ^7
由于不会在线上环境进行测试,所以使用
--dev
表示仅在本地安装
编写一个测试用例
单元测试的基本约定
- 测试文件名需要以
Test
作为后缀,比如要测试Activity.php
文件,则对应的测试文件名为ActivityTest.php
。 - 测试方法名需要以
test
作为前缀,比如需要测试的方法为getInfo
,则对应的测试方法名为testGetInfo
,此外可以通过@test
注解来声明一个测试方法。 - 所有测试方法必须是
public
。 - 所有的测试类都继承自
PHPUnit\Framework\TestCase
。
编写简单测试用例
首先,来创建一个简单的测试用例,将其命名为 ActivityTest.php
,这仅仅是为了写测试用例而写,不是对任何业务代码做测试。
然后我们就可以运行 vendor/bin/phpunit
命令来对刚刚的代码进行测试
通过编排文件 phpunit.xml
, PHPUnit
会去 tests/Unit
目录中查找测试用例进行测试,测试通过则显示绿色的高亮文本,测试不通过则显示红色的警告文本。