4
4
5
5
func TestXxx(*testing.T)
6
6
7
- 注意:Xxx 可以是任何字母数字字符串,但是第一个字母不能是小些字母 。
7
+ 注意:Xxx 可以是任何字母数字字符串,但是第一个字母不能是小写字母 。
8
8
9
- 在这些函数中,使用 Error, Fail 或相关方法来发出失败信号。
9
+ 在这些函数中,使用 ` Error ` 、 ` Fail ` 或相关方法来发出失败信号。
10
10
11
- 要编写一个新的测试套件,需要创建一个名称以 _ test.go 结尾的文件,该文件包含 ` TestXxx ` 函数,如上所述。 将该文件放在与被测试的包相同的包中 。该文件将被排除在正常的程序包之外,但在运行 “ go test ” 命令时将被包含。 有关详细信息,请运行 “ go help test ” 和 “ go help testflag ” 了解。
11
+ 要编写一个新的测试套件,需要创建一个名称以 _ test.go 结尾的文件,该文件包含 ` TestXxx ` 函数,如上所述。 将该文件放在与被测试文件相同的包中 。该文件将被排除在正常的程序包之外,但在运行 ` go test ` 命令时将被包含。 有关详细信息,请运行 ` go help test ` 和 ` go help testflag ` 了解。
12
12
13
- 如果有需要,可以调用 ` *T ` 和 ` *B ` 的 Skip 方法,跳过该测试或基准测试:
13
+ 如果有需要,可以调用 ` *T ` 和 ` *B ` 的 ` Skip ` 方法,跳过该测试或基准测试:
14
14
15
15
``` go
16
16
func TestTimeConsuming (t *testing .T ) {
@@ -105,13 +105,13 @@ func TestFib(t *testing.T) {
105
105
}
106
106
}
107
107
```
108
- 因为我们使用的是 ` t.Errorf ` ,其中某个 case 失败,并不会终止测试执行 。
108
+ 由于我们使用的是 ` t.Errorf ` ,即使其中某个 case 失败,也不会终止测试执行 。
109
109
110
110
## T 类型 ##
111
111
112
112
单元测试中,传递给测试函数的参数是 ` *testing.T ` 类型。它用于管理测试状态并支持格式化测试日志。测试日志会在执行测试的过程中不断累积,并在测试完成时转储至标准输出。
113
113
114
- 当一个测试的测试函数返回时,又或者当一个测试函数调用 ` FailNow ` 、 ` Fatal ` 、` Fatalf ` 、` SkipNow ` 、` Skip ` 或者 ` Skipf ` 中的任意一个时,该测试即宣告结束 。跟 ` Parallel ` 方法一样,以上提到的这些方法只能在运行测试函数的 goroutine 中调用。
114
+ 当测试函数返回时,或者当测试函数调用 ` FailNow ` 、 ` Fatal ` 、` Fatalf ` 、` SkipNow ` 、` Skip ` 、 ` Skipf ` 中的任意一个时,则宣告该测试函数结束 。跟 ` Parallel ` 方法一样,以上提到的这些方法只能在运行测试函数的 goroutine 中调用。
115
115
116
116
至于其他报告方法,比如 ` Log ` 以及 ` Error ` 的变种, 则可以在多个 goroutine 中同时进行调用。
117
117
@@ -123,44 +123,44 @@ T 类型内嵌了 common 类型,common 提供这一系列方法,我们经常
123
123
124
124
1)当我们遇到一个断言错误的时候,标识这个测试失败,会使用到:
125
125
126
- Fail: 测试失败,测试继续,也就是之后的代码依然会执行
127
- FailNow: 测试失败,测试中断
126
+ Fail : 测试失败,测试继续,也就是之后的代码依然会执行
127
+ FailNow : 测试失败,测试中断
128
128
129
129
在 ` FailNow ` 方法实现的内部,是通过调用 ` runtime.Goexit() ` 来中断测试的。
130
130
131
131
2)当我们遇到一个断言错误,只希望跳过这个错误,但是不希望标识测试失败,会使用到:
132
-
133
- SkipNow: 跳过测试,测试中断
132
+
133
+ SkipNow : 跳过测试,测试中断
134
134
135
135
在 ` SkipNow ` 方法实现的内部,是通过调用 ` runtime.Goexit() ` 来中断测试的。
136
136
137
137
3)当我们只希望打印信息,会用到 :
138
-
139
- Log: 输出信息
140
- Logf: 输出格式化的信息
138
+
139
+ Log : 输出信息
140
+ Logf : 输出格式化的信息
141
141
142
142
注意:默认情况下,单元测试成功时,它们打印的信息不会输出,可以通过加上 ` -v ` 选项,输出这些信息。但对于基准测试,它们总是会被输出。
143
143
144
144
4)当我们希望跳过这个测试,并且打印出信息,会用到:
145
-
146
- Skip: 相当于 Log + SkipNow
147
- Skipf: 相当于 Logf + SkipNow
145
+
146
+ Skip : 相当于 Log + SkipNow
147
+ Skipf : 相当于 Logf + SkipNow
148
148
149
149
5)当我们希望断言失败的时候,标识测试失败,并打印出必要的信息,但是测试继续,会用到:
150
150
151
- Error: 相当于 Log + Fail
152
- Errorf: 相当于 Logf + Fail
151
+ Error : 相当于 Log + Fail
152
+ Errorf : 相当于 Logf + Fail
153
153
154
- 6)当我们希望断言失败的时候,标识测试失败,打印出必要的信息,但中断测试,会用到
154
+ 6)当我们希望断言失败的时候,标识测试失败,打印出必要的信息,但中断测试,会用到:
155
155
156
- Fatal: 相当于 Log + FailNow
157
- Fatalf: 相当于 Logf + FailNow
156
+ Fatal : 相当于 Log + FailNow
157
+ Fatalf : 相当于 Logf + FailNow
158
158
159
159
### Parallel 测试 ###
160
160
161
- 包中的 Parallel 方法用于表示当前测试只会与其他带有 Parallel 方法的测试并行进行测试。
161
+ 包中的 Parallel 方法表示当前测试只会与其他带有 Parallel 方法的测试并行进行测试。
162
162
163
- 下面的例子演示的 Parallel 的使用 :
163
+ 下面例子将演示 Parallel 的使用方法 :
164
164
165
165
``` go
166
166
var (
@@ -230,13 +230,13 @@ func TestReadFromMap(t *testing.T) {
230
230
231
231
如果代码能够进行并行测试,在写测试时,尽量加上 Parallel,这样可以测试出一些可能的问题。
232
232
233
- 关于 Parallel 的更多内容,会在 [ 子测试] ( chapter09/ 09.3.md) 中介绍。
233
+ 关于 Parallel 的更多内容,会在 [ 子测试] ( 09.3.md ) 中介绍。
234
234
235
235
当你写完一个函数,结构体,main 之后,你下一步需要的就是测试了。testing 包提供了很简单易用的测试包。
236
236
237
237
# 写一个基本的测试用例 #
238
238
239
- 测试文件的文件名需要以_test.go 为结尾,测试用例需要以 TestXxxx 的样式存在 。
239
+ 测试文件的文件名需要以_test.go 为结尾,测试用例需要以 TestXxxx 的形式存在 。
240
240
241
241
比如我要测试 utils 包的 sql.go 中的函数:
242
242
@@ -270,13 +270,14 @@ func TestReadFromMap(t *testing.T) {
270
270
}
271
271
}
272
272
```
273
- #testing 的测试用例形式 #
273
+ # testing 的测试用例形式 #
274
274
275
275
测试用例有四种形式:
276
- TestXxxx(t * testing.T) // 基本测试用例
277
- BenchmarkXxxx(b * testing.B) // 压力测试的测试用例
278
- Example_Xxx() // 测试控制台输出的例子
279
- TestMain(m * testing.M) // 测试 Main 函数
276
+
277
+ TestXxxx(t *testing.T) // 基本测试用例
278
+ BenchmarkXxxx(b *testing.B) // 压力测试的测试用例
279
+ Example_Xxx() // 测试控制台输出的例子
280
+ TestMain(m *testing.M) // 测试 Main 函数
280
281
281
282
给个 Example 的例子 :(Example 需要在最后用注释的方式确认控制台输出和预期是不是一致的)
282
283
``` go
@@ -287,10 +288,10 @@ func TestReadFromMap(t *testing.T) {
287
288
// 31.1
288
289
}
289
290
```
290
- #testing 的变量 #
291
+ # testing 的变量 #
291
292
292
293
gotest 的变量有这些:
293
-
294
+
294
295
* test.short : 一个快速测试的标记,在测试用例中可以使用 testing.Short() 来绕开一些测试
295
296
* test.outputdir : 输出目录
296
297
* test.coverprofile : 测试覆盖率参数,指定输出文件
@@ -304,60 +305,60 @@ gotest 的变量有这些:
304
305
* test.cpu : 指定 cpu 数量
305
306
* test.parallel : 指定运行测试用例的并行数
306
307
307
- #testing 包内的结构 #
308
+ # testing 的结构体 #
308
309
309
310
* B : 压力测试
310
311
* BenchmarkResult : 压力测试结果
311
312
* Cover : 代码覆盖率相关结构体
312
313
* CoverBlock : 代码覆盖率相关结构体
313
- * InternalBenchmark : 内部使用的结构
314
- * InternalExample : 内部使用的结构
315
- * InternalTest : 内部使用的结构
316
- * M : main 测试使用的结构
317
- * PB : Parallel benchmarks 并行测试使用结果
314
+ * InternalBenchmark : 内部使用的结构体
315
+ * InternalExample : 内部使用的结构体
316
+ * InternalTest : 内部使用的结构体
317
+ * M : main 测试使用的结构体
318
+ * PB : Parallel benchmarks 并行测试使用的结构体
318
319
* T : 普通测试用例
319
320
* TB : 测试用例的接口
320
321
321
- #testing 的通用方法 #
322
+ # testing 的通用方法 #
322
323
323
324
T 结构内部是继承自 common 结构,common 结构提供集中方法,是我们经常会用到的:
324
325
325
- 当我们遇到一个断言错误的时候,我们就会判断这个测试用例失败,就会使用到:
326
+ 1) 当我们遇到一个断言错误的时候,我们就会判断这个测试用例失败,就会使用到:
326
327
327
- Fail : case 失败,测试用例继续
328
+ Fail : case 失败,测试用例继续
328
329
FailedNow : case 失败,测试用例中断
329
330
330
- 当我们遇到一个断言错误,只希望跳过这个错误,但是不希望标示测试用例失败,会使用到:
331
-
331
+ 2) 当我们遇到一个断言错误,只希望跳过这个错误,但是不希望标示测试用例失败,会使用到:
332
+
332
333
SkipNow : case 跳过,测试用例不继续
333
334
334
- 当我们只希望在一个地方打印出信息,我们会用到 :
335
-
335
+ 3) 当我们只希望在一个地方打印出信息,我们会用到 :
336
+
336
337
Log : 输出信息
337
338
Logf : 输出有 format 的信息
338
339
339
- 当我们希望跳过这个用例,并且打印出信息 :
340
-
340
+ 4) 当我们希望跳过这个用例,并且打印出信息 :
341
+
341
342
Skip : Log + SkipNow
342
343
Skipf : Logf + SkipNow
343
344
344
- 当我们希望断言失败的时候,测试用例失败,打印出必要的信息,但是测试用例继续:
345
+ 5) 当我们希望断言失败的时候,测试用例失败,打印出必要的信息,但是测试用例继续:
345
346
346
347
Error : Log + Fail
347
348
Errorf : Logf + Fail
348
349
349
- 当我们希望断言失败的时候,测试用例失败,打印出必要的信息,测试用例中断:
350
+ 6) 当我们希望断言失败的时候,测试用例失败,打印出必要的信息,测试用例中断:
350
351
351
352
Fatal : Log + FailNow
352
353
Fatalf : Logf + FailNow
353
354
354
- ## 扩展阅读
355
+ # 扩展阅读 #
355
356
356
357
[ GO 中如何进行单元测试] ( http://blog.studygolang.com/2017/10/how-to-test-with-go/ )
358
+ [ GoDoc - testing] ( https://godoc.org/testing )
359
+ [ testing/testing.go 源代码] ( https://golang.org/src/testing/testing.go )
357
360
358
361
# 导航 #
359
362
360
363
- [ 第九章] ( /chapter09/09.0.md )
361
364
- 下一节:[ testing - 基准测试] ( 09.2.md )
362
-
363
-
0 commit comments