1
1
## 25. 2019-06-10-Laravel 基于 PHPUnit 的单元测试
2
2
3
3
### 简介
4
- 介绍完 PHPUnit 的基本使用和 Laravel 框架自带的编排文件 phpunit.xml 文件,今天开始我们正式准备在 Laravel 项目中基于 PHPUnit 编写单元测试和功能测试,通过上篇教程介绍的编排文件我们知道,Laravel 的单元测试用例位于 tests/Unit 目录下,框架本身也为我们提供了一个示例测试文件 ExampleTest.php:
4
+ 介绍完 ` PHPUnit ` 的基本使用和 ` Laravel ` 框架自带的编排文件 ` phpunit.xml ` 文件,今天开始我们正式准备在 ` Laravel ` 项目中基于 ` PHPUnit ` 编写单元测试和功能测试,通过上篇教程介绍的编排文件我们知道,` Laravel ` 的单元测试用例位于 ` tests/Unit ` 目录下,框架本身也为我们提供了一个示例测试文件 ` ExampleTest.php ` :
5
5
6
6
``` php
7
7
<?php
@@ -25,12 +25,12 @@ class ExampleTest extends TestCase
25
25
}
26
26
```
27
27
28
- 其中包含了一行最基本的断言测试,用于判断指定的参数是否为真,并且这个测试永远是通过的。Laravel 的单元测试其实是原原本本继承了 PHPUnit 的单元测试功能,这里的父类 Tests\TestCase 从根源上继承自 PHPUnit\Framework\TestCase,所以我们可以在测试用例中使用所有 PHPUnit 支持的断言方法和测试注解。
28
+ 其中包含了一行最基本的断言测试,用于判断指定的参数是否为真,并且这个测试永远是通过的。` Laravel ` 的单元测试其实是原原本本继承了 ` PHPUnit ` 的单元测试功能,这里的父类 ` Tests\TestCase ` 从根源上继承自 ` PHPUnit\Framework\TestCase ` ,所以我们可以在测试用例中使用所有 ` PHPUnit ` 支持的断言方法和测试注解。
29
29
30
- 下面我们通过几个常见的场景介绍下如何基于 PHPUnit 编写单元测试。
30
+ 下面我们通过几个常见的场景介绍下如何基于 ` PHPUnit ` 编写单元测试。
31
31
32
32
### 对变量进行测试
33
- PHPUnit 底层提供了很多断言方法用于对变量进行测试,这些变量通常是业务代码类方法或函数的返回值,我们在 Unit\ExampleTest 中新增一个 testVariables 方法:
33
+ ` PHPUnit ` 底层提供了很多断言方法用于对变量进行测试,这些变量通常是业务代码类方法或函数的返回值,我们在 ` Unit\ExampleTest ` 中新增一个 ` testVariables ` 方法:
34
34
35
35
```
36
36
public function testVariables()
@@ -55,14 +55,14 @@ public function testVariables()
55
55
}
56
56
```
57
57
58
- 相应的断言用途在注释中已经说明了,我们可以对各种类型的变量从各种维度进行断言,甚至还可以对文件、目录、正则表达式进行断言,并且很多断言都可以从正反两个方法进行,相关的调用都很简单,你可以在需要的时候查看官方文档选择相应的断言方法:https://phpunit.readthedocs.io/zh_CN/latest/assertions.html。
58
+ 相应的断言用途在注释中已经说明了,我们可以对各种类型的变量从各种维度进行断言,甚至还可以对文件、目录、正则表达式进行断言,并且很多断言都可以从正反两个方法进行,相关的调用都很简单,你可以在需要的时候查看官方文档选择相应的断言方法:[ https://phpunit.readthedocs.io/zh_CN/latest/assertions.html ] ( https://phpunit.readthedocs.io/zh_CN/latest/assertions.html ) 。
59
59
60
- 运行上面的测试用例,结果如下,每个测试方法都代表一个测试用例,所以上面的单元测试包含两个测试用例,7个断言 :
60
+ 运行上面的测试用例,结果如下,每个测试方法都代表一个测试用例,所以上面的单元测试包含两个测试用例,7 个断言 :
61
61
62
62
63
63
64
64
### 对输出进行测试
65
- 除了对变量进行测试外,还可以对页面输出进行测试,这可以通过 PHPUnit 提供的 expectOutputString 方法来实现:
65
+ 除了对变量进行测试外,还可以对页面输出进行测试,这可以通过 ` PHPUnit ` 提供的 ` expectOutputString ` 方法来实现:
66
66
67
67
```
68
68
public function testOutput()
@@ -86,7 +86,7 @@ public function testOutputRegex()
86
86
87
87
88
88
### 对异常进行测试
89
- 类似的,还可以通过 expectException 方法对异常进行测试,为了让测试用例更加符合真实场景,我们在 app 目录下新增一个 Services 子目录,然后在该子目录下创建一个 TestService 类并初始化代码如下:
89
+ 类似的,还可以通过 ` expectException ` 方法对异常进行测试,为了让测试用例更加符合真实场景,我们在 ` app ` 目录下新增一个 ` Services ` 子目录,然后在该子目录下创建一个 ` TestService ` 类并初始化代码如下:
90
90
91
91
```
92
92
<?php
@@ -100,7 +100,7 @@ class TestService
100
100
}
101
101
}
102
102
```
103
- 然后回到 Unit\ExampleTest,编写一个新的测试用例如下:
103
+ 然后回到 ` Unit\ExampleTest ` ,编写一个新的测试用例如下:
104
104
105
105
```
106
106
public function testException()
@@ -120,7 +120,7 @@ public function testException()
120
120
$this->expectException(\Exception::class);
121
121
```
122
122
123
- 除此之外,还可以进一步对异常明细进行测试,比如通过 expectExceptionCode()、 expectExceptionMessage() 和 expectExceptionMessageRegExp() 方法可以用于测试异常码、异常信息。
123
+ 除此之外,还可以进一步对异常明细进行测试,比如通过 ` expectExceptionCode() ` 、 ` expectExceptionMessage() ` 和 ` expectExceptionMessageRegExp() ` 方法可以用于测试异常码、异常信息。
124
124
125
125
除了通过上述方法,还可以通过注解对异常进行测试,这种方式更加方便:
126
126
@@ -134,7 +134,7 @@ public function testExceptionAnnotation()
134
134
}
135
135
```
136
136
137
- 由于两个测试用例中都用到了 TestService,所以我们将其在 setUp 方法进行初始化:
137
+ 由于两个测试用例中都用到了 ` TestService ` ,所以我们将其在 ` setUp ` 方法进行初始化:
138
138
139
139
```
140
140
/**
@@ -154,7 +154,7 @@ protected function setUp(): void
154
154
155
155
156
156
### 对错误进行测试
157
- 默认情况下,PHPUnit 会将 PHP 错误、警告和通知都转化为异常,在上一篇 PHP 编排文件 phpunit.xml 中我们提到,Laravel 也默认配置为做这些转化,所以我们可以通过测试异常的方式对业务代码中的错误进行测试。具体用法和异常测试一样,就不再赘述了。
157
+ 默认情况下,` PHPUnit ` 会将 ` PHP ` 错误、警告和通知都转化为异常,在上一篇 PHP 编排文件 phpunit.xml 中我们提到,Laravel 也默认配置为做这些转化,所以我们可以通过测试异常的方式对业务代码中的错误进行测试。具体用法和异常测试一样,就不再赘述了。
158
158
159
159
### 测试的依赖关系
160
160
有的时候,我们需要测试的两个用例之间可能有依赖关系,比如我们在 TestService 定义如下个方法:
0 commit comments