Skip to content

Commit

Permalink
fix & style: update 09.6.md and 09.7.md
Browse files Browse the repository at this point in the history
* fix some bugs and typos
* optimize presentation and description
  • Loading branch information
ciphersaw committed Feb 1, 2020
1 parent 8096f44 commit 38942af
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 16 deletions.
2 changes: 1 addition & 1 deletion chapter09/09.2.md
Original file line number Diff line number Diff line change
Expand Up @@ -216,4 +216,4 @@ func main() {
# 导航 #

- 上一节:[testing - 单元测试](09.1.md)
- 下一节:[testing - 子测试](09.3.md)
- 下一节:[testing - 子测试与子基准测试](09.3.md)
24 changes: 14 additions & 10 deletions chapter09/09.6.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# httptest - HTTP 测试辅助工具 #

由于 Go 标准库的强大支持,Go 可以很容易的进行 Web 开发。为此,Go 标准库专门提供了 httptest 包专门用于进行 http Web 开发测试。
由于 Go 标准库的强大支持,Go 可以很容易的进行 Web 开发。为此,Go 标准库专门提供了 `net/http/httptest` 包专门用于进行 http Web 开发测试。

本节我们通过一个社区帖子的增删改查的例子来学习该包。

Expand All @@ -21,9 +21,9 @@ type Topic struct {
CreatedAt time.Time `json:"created_at"`
}
```
对于 Topic 的增删改查代码很简单,可以查看[完整代码](code/src/chapter09/httptest/data.go)
对于 `Topic` 的增删改查代码很简单,可以查看[完整代码](/code/src/chapter09/httptest/data.go)

接下来,是通过 http 包来实现一个 Web 应用。
接下来,是通过 `net/http` 包来实现一个 Web 应用。

```go
func main() {
Expand All @@ -32,13 +32,13 @@ func main() {
}
...
```
`/topic/` 开头的请求都交由 `handleRequest` 处理,它根据不同的 `Method` 执行相应的增删改查,详细代码可以查看 [server.go](code/src/chapter09/httptest/server.go)
`/topic/` 开头的请求都交由 `handleRequest` 处理,它根据不同的 `Method` 执行相应的增删改查,详细代码可以查看 [server.go](/code/src/chapter09/httptest/server.go)

准备好 Web 应用后,我们启动它。

> go run server.go data.go
通过 curl 进行简单的测试:
通过 `curl` 进行简单的测试:

> 增:curl -i -X POST http://localhost:2017/topic/ -H 'content-type: application/json' -d '{"title":"The Go Standard Library","content":"It contains many packages."}'
Expand All @@ -50,7 +50,7 @@ func main() {
## 通过 httptest 进行测试

上面,我们通过 curl 对我们的 Web 应用的接口进行了测试。现在,我们通过 httptest 进行测试
上面,我们通过 `curl` 对我们的 Web 应用的接口进行了测试。现在,我们通过 `net/http/httptest` 包进行测试

我们先测试创建帖子,也就是测试 `handlePost` 函数。

Expand Down Expand Up @@ -79,9 +79,9 @@ mux := http.NewServeMux()
mux.HandleFunc("/topic/", handleRequest)
```

因为 `handlePost` 的签名是 `func handlePost(w http.ResponseWriter, r *http.Request) error`,为了测试它,我们必须创建 `http.ResponseWriter``http.Request` 的实例。
因为 `handlePost` 的函数签名是 `func handlePost(w http.ResponseWriter, r *http.Request) error`,为了测试它,我们必须创建 `http.ResponseWriter``http.Request` 的实例。

接下来的代码就是创建一个 `http.Request` 实例 和 一个 `http.ReponseWriter` 的实例。这里的关键是,`httptest` 为我们提供了一个 `http.ReponseWriter` 接口的实现结构:`httptest.ReponseRecorder`,通过它可以得到一个 `http.ReponseWriter`
接下来的代码就是创建一个 `http.Request` 实例 和一个 `http.ResponseWriter` 的实例。这里的关键是,通过 `httptest.NewRecorder()` 可以获得 `httptest.ResponseRecorder` 结构,而此结构实现了`http.ResponseWriter` 接口

```go
reader := strings.NewReader(`{"title":"The Go Standard Library","content":"It contains many packages."}`)
Expand All @@ -90,7 +90,7 @@ r, _ := http.NewRequest(http.MethodPost, "/topic/", reader)
w := httptest.NewRecorder()
```

准备好之后,可以测试目标函数了。这里,我们没有直接调用 `handlePost(w, r)`,而是调用 `mux.ServeHTTP(w, r)`,实际上这里直接调用 `handlePost(w, r)` 也是可以的,但调用 `mux.ServeHTTP(w, r)` 更完整的测试了整个流程`mux.ServeHTTP(w, r)` 最终会调用 `handlePost(w, r)`
准备好之后,可以测试目标函数了。这里,我们没有直接调用 `handlePost(w, r)`,而是调用 `mux.ServeHTTP(w, r)`,实际上这里直接调用 `handlePost(w, r)` 也是可以的,但调用 `mux.ServeHTTP(w, r)` 会更完整地测试整个流程`mux.ServeHTTP(w, r)` 最终也会调用到 `handlePost(w, r)`

最后,通过 `go test -v` 运行测试。

Expand Down Expand Up @@ -131,7 +131,11 @@ mux := http.NewServeMux()
mux.HandleFunc("/topic/", handleRequest)
```

还有:`w := httptest.NewRecorder()`
以及:

```go
w := httptest.NewRecorder()
```

这正好是前面学习的 `setup` 可以做的事情,因此可以使用 `TestMain` 来做重构。

Expand Down
8 changes: 3 additions & 5 deletions chapter09/09.7.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
# 总结 #

除了标准库提供的测试包,还有很多优秀的第三方测试包,比如 [https://github.com/stretchr/testify](https://github.com/stretchr/testify) 用于增强 testing 进行单元测试,进行 mock 等,有机会会写文章介绍它的使用;再比如,[https://github.com/onsi/ginkgo](https://github.com/onsi/ginkgo) 用于集成测试等等
除了标准库提供的测试包,还有很多优秀的第三方测试包,比如 [testify](https://github.com/stretchr/testify) 可有助于 testing 进行单元测试,进行 mock 等,有机会会写文章介绍它的使用;再比如,[ginkgo](https://github.com/onsi/ginkgo) 有助于集成测试等等

参考阅读:https://getstream.io/blog/how-we-test-go-at-stream/
参考阅读:[Testing Go at Stream](https://getstream.io/blog/how-we-test-go-at-stream/)

# 导航 #

- 上一节:[httptest - HTTP 测试辅助工具](09.6.md)
- [第十章 进程、线程与 goroutine](chapter10/10.0.md)


- [第十章 进程、线程与 goroutine](/chapter10/10.0.md)

0 comments on commit 38942af

Please sign in to comment.