82 lines
1.7 KiB
Go
82 lines
1.7 KiB
Go
## 一 单元测试
|
||
|
||
#### 1.1 单元测试简介
|
||
|
||
单元测试用来检测某个模块、某个函数的执行结果是否正确,也因此能够实现监控代码质量。
|
||
|
||
Go语言中自带有一个轻量级的测试框架 testing,同时也自带了 `go test` 命令,可以通过这些工具来实现单元测试和性能测试。
|
||
|
||
#### 1.2 testing的使用
|
||
|
||
go自带的testing单元测试框架使用要求:
|
||
- 测试代码必须放在以`_test.go`结尾的文件中
|
||
- 测试函数以`Test`为名称前缀
|
||
- 命令`go test`会忽略以 `_`或`.`开头的测试文件
|
||
- 命令`go build/install`等正常编译操作会忽略测试文件
|
||
|
||
|
||
#### 1.3 案例
|
||
|
||
文件目录:
|
||
![](../images/go/09-01.png)
|
||
|
||
源码文件:`/hello/hello.go`
|
||
```go
|
||
package hello
|
||
|
||
import "fmt"
|
||
|
||
func Hello() string{
|
||
return "world"
|
||
}
|
||
```
|
||
|
||
单元测试文件:`/test/hello_test.go`
|
||
```go
|
||
package test
|
||
|
||
import (
|
||
"TestGo/hello"
|
||
"testing"
|
||
)
|
||
|
||
func Test_hello(t *testing.T){
|
||
r := hello.Hello()
|
||
if r != "world" {
|
||
t.FailNow()
|
||
}
|
||
}
|
||
```
|
||
|
||
运行测试文件:没有main方法也可以执行
|
||
```
|
||
go test -v test/hello_test.go # -v用于显示详细测试流程
|
||
go test -v -run Test_hello test/hello_test.go # 只执行Test_hello
|
||
```
|
||
|
||
#### 1.4 测试中一些函数的区别
|
||
|
||
- Fail,Error:若测试失败,则测试会继续执行
|
||
- FailNow,Fatal:若测试失败,则测试会终止
|
||
|
||
## 二 代码覆盖率
|
||
|
||
代码覆盖率命令:
|
||
```
|
||
go test -v -cover
|
||
```
|
||
|
||
## 三 断言库
|
||
|
||
使用一些第三方的断言库也可以达到原生的单元测试效果:
|
||
```go
|
||
import "github.com/stretchr/testify/assert"
|
||
func Test_hello(t *testing.T){
|
||
r := hello.Hello()
|
||
assert.Equal("world")
|
||
}
|
||
```
|
||
|
||
## 四 BDD测试框架
|
||
|
||
常用的BDD测试框架是:https://github.com/smartystreets/goconvey
|