1
1
# httptest - HTTP 测试辅助工具 #
2
2
3
- 由于 Go 标准库的强大支持,Go 可以很容易的进行 Web 开发。为此,Go 标准库专门提供了 httptest 包专门用于进行 http Web 开发测试。
3
+ 由于 Go 标准库的强大支持,Go 可以很容易的进行 Web 开发。为此,Go 标准库专门提供了 ` net/http/ httptest` 包专门用于进行 http Web 开发测试。
4
4
5
5
本节我们通过一个社区帖子的增删改查的例子来学习该包。
6
6
@@ -21,9 +21,9 @@ type Topic struct {
21
21
CreatedAt time.Time ` json:"created_at"`
22
22
}
23
23
```
24
- 对于 Topic 的增删改查代码很简单,可以查看[ 完整代码] ( code/src/chapter09/httptest/data.go ) 。
24
+ 对于 ` Topic ` 的增删改查代码很简单,可以查看[ 完整代码] ( / code/src/chapter09/httptest/data.go) 。
25
25
26
- 接下来,是通过 http 包来实现一个 Web 应用。
26
+ 接下来,是通过 ` net/ http` 包来实现一个 Web 应用。
27
27
28
28
``` go
29
29
func main () {
@@ -32,13 +32,13 @@ func main() {
32
32
}
33
33
...
34
34
```
35
- ` /topic/ ` 开头的请求都交由 ` handleRequest ` 处理,它根据不同的 ` Method ` 执行相应的增删改查,详细代码可以查看 [ server.go] ( code/src/chapter09/httptest/server.go ) 。
35
+ ` /topic/ ` 开头的请求都交由 ` handleRequest ` 处理,它根据不同的 ` Method ` 执行相应的增删改查,详细代码可以查看 [ server.go] ( / code/src/chapter09/httptest/server.go) 。
36
36
37
37
准备好 Web 应用后,我们启动它。
38
38
39
39
> go run server.go data.go
40
40
41
- 通过 curl 进行简单的测试:
41
+ 通过 ` curl ` 进行简单的测试:
42
42
43
43
> 增:curl -i -X POST http://localhost:2017/topic/ -H 'content-type: application/json' -d '{"title":"The Go Standard Library","content":"It contains many packages."}'
44
44
@@ -50,7 +50,7 @@ func main() {
50
50
51
51
## 通过 httptest 进行测试
52
52
53
- 上面,我们通过 curl 对我们的 Web 应用的接口进行了测试。现在,我们通过 httptest 进行测试 。
53
+ 上面,我们通过 ` curl ` 对我们的 Web 应用的接口进行了测试。现在,我们通过 ` net/http/ httptest` 包进行测试 。
54
54
55
55
我们先测试创建帖子,也就是测试 ` handlePost ` 函数。
56
56
@@ -79,9 +79,9 @@ mux := http.NewServeMux()
79
79
mux.HandleFunc (" /topic/" , handleRequest)
80
80
```
81
81
82
- 因为 ` handlePost ` 的签名是 ` func handlePost(w http.ResponseWriter, r *http.Request) error ` ,为了测试它,我们必须创建 ` http.ResponseWriter ` 和 ` http.Request ` 的实例。
82
+ 因为 ` handlePost ` 的函数签名是 ` func handlePost(w http.ResponseWriter, r *http.Request) error ` ,为了测试它,我们必须创建 ` http.ResponseWriter ` 和 ` http.Request ` 的实例。
83
83
84
- 接下来的代码就是创建一个 ` http.Request ` 实例 和 一个 ` http.ReponseWriter ` 的实例。这里的关键是,` httptest ` 为我们提供了一个 ` http.ReponseWriter ` 接口的实现结构: ` httptest.ReponseRecorder ` ,通过它可以得到一个 ` http.ReponseWriter ` 。
84
+ 接下来的代码就是创建一个 ` http.Request ` 实例 和一个 ` http.ResponseWriter ` 的实例。这里的关键是,通过 ` httptest.NewRecorder() ` 可以获得 ` httptest.ResponseRecorder ` 结构,而此结构实现了 ` http.ResponseWriter ` 接口 。
85
85
86
86
``` go
87
87
reader := strings.NewReader (` {"title":"The Go Standard Library","content":"It contains many packages."}` )
@@ -90,7 +90,7 @@ r, _ := http.NewRequest(http.MethodPost, "/topic/", reader)
90
90
w := httptest.NewRecorder ()
91
91
```
92
92
93
- 准备好之后,可以测试目标函数了。这里,我们没有直接调用 ` handlePost(w, r) ` ,而是调用 ` mux.ServeHTTP(w, r) ` ,实际上这里直接调用 ` handlePost(w, r) ` 也是可以的,但调用 ` mux.ServeHTTP(w, r) ` 更完整的测试了整个流程 。` mux.ServeHTTP(w, r) ` 最终会调用 ` handlePost(w, r) ` 。
93
+ 准备好之后,可以测试目标函数了。这里,我们没有直接调用 ` handlePost(w, r) ` ,而是调用 ` mux.ServeHTTP(w, r) ` ,实际上这里直接调用 ` handlePost(w, r) ` 也是可以的,但调用 ` mux.ServeHTTP(w, r) ` 会更完整地测试整个流程 。` mux.ServeHTTP(w, r) ` 最终也会调用到 ` handlePost(w, r) ` 。
94
94
95
95
最后,通过 ` go test -v ` 运行测试。
96
96
@@ -131,7 +131,11 @@ mux := http.NewServeMux()
131
131
mux.HandleFunc (" /topic/" , handleRequest)
132
132
```
133
133
134
- 还有:` w := httptest.NewRecorder() ` 。
134
+ 以及:
135
+
136
+ ``` go
137
+ w := httptest.NewRecorder ()
138
+ ```
135
139
136
140
这正好是前面学习的 ` setup ` 可以做的事情,因此可以使用 ` TestMain ` 来做重构。
137
141
0 commit comments