1
1
## 25. 2019-06-24- 从基于 PHPUnit 编写单元测试开始
2
2
3
- 为什么要做测试
3
+ ### 为什么要做测试
4
4
我们知道,Laravel 框架开箱提供的测试功能是基于 PHPUnit 实现的,PHPUnit 是 PHP 语言中最负盛名的单元测试框架。在介绍 Laravel 框架提供的测试功能之前,我们先从源头 PHPUnit 开始,聊聊如何在 PHP 框架中实现单元测试。
5
5
6
6
即使是很小规模的项目开发也需要数小时的辛苦编码。在开发过程中,应用代码中或多或少都会存在一些大大小小的问题,开发者往往会尝试在开发过程中解决这些问题,以便顺利上线。但问题是,在未经完整测试的情况下,没有一种方式可以确保最终上线代码中没有任何问题,此外,也没有办法确保修复老问题的代码会不会引发新问题。
7
7
8
8
为了解决上述问题,我们需要在开发过程中引入测试流程,并将其作为日常开发流程中不可或缺的一部分,从而确保代码质量。在现代软件开发流程中,测试驱动开发、持续交付、持续集成这些概念中都将测试作为开发流程的有机组成部分,要求我们在软件开发的一开始,就要设计好相关的测试方法,从而让代码更加易于扩展、迭代和维护,实际上 Laravel 框架也是这么设计的,内置了一系列测试相关的 API 方便我们对代码进行测试。
9
9
10
- 单元测试 vs. 功能测试
10
+ #### 单元测试 vs. 功能测试
11
11
说到测试,常见的测试主要包括单元测试和功能测试。
12
12
13
13
单元测试是一种通过编写测试代码来确认函数、类和方法是否以我们预期的方式来工作,单元测试会贯穿整个项目的开发周期。通过检查各个函数和方法的输入输出,就可以保证代码内部的逻辑已经正确执行,PHPUnit 就是最著名的单元测试框架。
16
16
17
17
我们先来介绍单元测试。
18
18
19
- 单元测试的概念及意义
19
+ ### 单元测试的概念及意义
20
20
前面我们已经简单介绍了单元测试的概念,所谓「单元」指的就是代码区块,比如一个函数、一个类以及类的方法都是代码区块。单元测试这种软件测试方法就是用来检查指定的一个代码区块是否能够按照预期输出结果,单元测试一般通过编写独立的测试用例来完成,对应的流程图如下:
21
21
22
- 单元测试流程
22
+ ![ 单元测试流程] ( )
23
23
24
24
首先,我们要编写测试用例对指定代码「单元」进行测试,然后运行测试用例看是否通过测试,如果通过继续编写下一个测试用例,不通过的话则修改「单元」代码后继续进行测试,如此往复直到所有「单元」代码测试通过。按照测试驱动开发的流程要求,需要先编写测试用例,再编写功能代码。
25
25
26
26
以上就是测试驱动开发的基本流程。这种开发模式的好处是可以确保所有代码问题必须在开发过程中被解决(当然,需要在代码测试覆盖率100%的前提下),因为一旦有代码不通过测试,则必须在问题修复之后才能进行后续代码编写,而且小的代码单元里定位问题也更加便捷。
27
27
28
28
有句话叫做「把可能出现的问题扼杀在摇篮里」,有效地防微杜渐,测试驱动开发可谓是充分可以达成这个目的,因为我们在开发过程中就已经把每一个小问题解决了,最终构建起来的完整系统也就没有问题了,反之,如果没有对代码做测试,让小问题不断堆积,最终会酿成大问题,在线上爆发,那就麻烦了。
29
29
30
- PHPUnit 简介和安装配置
30
+ ### PHPUnit 简介和安装配置
31
31
在 PHP 语言中,最著名的单元测试框架就是 PHPUnit 了,下面我们将以 PHPUnit 为例,演示如何在 PHP 项目中进行单元测试。
32
32
33
33
PHPUnit 目前有很多支持的版本,并且随着 PHP 版本的不同,功能也不尽相同,在选择版本时要注意与系统 PHP 版本的兼容性:
@@ -48,7 +48,7 @@ composer require --dev phpunit/phpunit ^7
48
48
49
49
当然,你也可以选择从官网下载最新版本或者你需要版本的 PHAR 文件到本地。
50
50
51
- 目录结构及初始化配置
51
+ ### 目录结构及初始化配置
52
52
安装完成后,项目的目录结构如下:
53
53
54
54
@@ -76,8 +76,8 @@ PHPUnit单元测试
76
76
77
77
接下来,我们就可以在 tests/Unit 目录下编写测试用例了。
78
78
79
- 编写第一个 PHPUnit 测试用例
80
- 单元测试基本约定
79
+ ### 编写第一个 PHPUnit 测试用例
80
+ #### 单元测试基本约定
81
81
在编写测试用例之前,我们需要了解关于编写单元测试的一些常见约定:
82
82
83
83
测试文件名需要以 Test 作为后缀,比如如果要测试 First.php,则对应的测试文件名为 FirstTest.php;
@@ -86,7 +86,7 @@ PHPUnit单元测试
86
86
所有的测试类都继承自 PHPUnit\Framework\TestCase。
87
87
了解了这些约定之后,就可以编写第一个测试用例了。
88
88
89
- 编写简单测试用例
89
+ #### 编写简单测试用例
90
90
首先,我们来创建一个非常简单的测试用例,将其命名为 FirstTest.php,它不是对任何应用代码做测试,仅仅是为了写测试用例而编写:
91
91
92
92
@@ -101,7 +101,7 @@ PHPUnit运行失败
101
101
102
102
这里一个最简单的测试用例,我们通过 TestCase 基类断言方法 assertTrue 判断指定变量是否为 true,如果是则测试通过,否则测试失败。
103
103
104
- 编写测试类方法的测试用例
104
+ #### 编写测试类方法的测试用例
105
105
接下来我们来编写一个稍微复杂一点的测试用例,通过这个测试用例来测试应用代码中的类方法。
106
106
107
107
在编写测试用例之前,先编写一个应用类 Email,我们在项目根目录下创建一个 app 目录,并将 Email.php 保存在该目录下,然后编写 Email 类代码如下:
0 commit comments