- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
12.8.1 测试 HTTP handler
在这节我们将学习如果用 Go 测试 HTTP handlers,这是一个用 Go 测试的特别例子。我们将已 www.go
的代码为基础,修改需要调整的地方。
新版本的 www.go
命名为 testWWW.go
,并分为三部分展示。testWWW.go
的第一部分代码如下:
package main
import (
"fmt"
"net/http"
"os"
)
func CheckStatusOK(w http.ResponseWriter, r *http.Request){
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, `Fine!`)
}
testWWW.go
的第二部分代码如下:
func StatusNotFound(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Serving: %s\n", r.URL.Path)
fmt.Printf("Served: %s\n", r.Host)
}
func MyHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Serving: %s\n", r.URL.Path)
fmt.Printf("Served: %s\n", r.Host)
}
testWWW.go
余下代码如下:
func main() {
PORT := ":8001"
arguments := os.Args
if len(arguments) == 1 {
fmt.Println("Using default port number:", PORT)
} else {
PORT = ":" + arguments[1]
}
http.HandleFunc("/CheckStatusOK", CheckStatusOK)
http.HandleFunc("/StatusNotFound", StatusNotFound)
http.HandleFunc("/", MyHandler)
err := http.ListenAndServe(PORT, nil)
if err != nil {
fmt.Println(err)
return
}
}
我们现在需要开始测试 testWWW.go
了,为此我们应该创建一个 testWWW_test.go
文件。这个文件的内容由四部分展示。
testWWW_test.go
的第一部分包容如下代码:
package main
import (
"fmt"
"net/http"
"net/http/httptest"
"testing"
)
注意,为了用 Go 测试 web 应用,您需要引入 net/http/httptest
标准包。
testWWW_tesst.go
的第二部分如下:
func TestCheckStatusOK(t *testing.T) {
req, err := http.NewRequest("GET", "/CheckStatusOK", nil)
if err != nil {
fmt.Println(err)
return
}
rr := httptest.NewRecorder()
handler := http.HandlerFunc(CheckStatusOK)
handler.ServeHTTP(rr, req)
httptest.NewRecorder()
函数返回一个 httptest.ResponseRecorder
对象,它被用于记录 HTTP 响应。
testWWW_test.go
的第三部分如下:
status := rr.Code
if status != http.StatusOK {
t.Errorf("handler returned %v", status)
}
expect := `Fine!`
if rr.Body.String() != expect {
t.Errorf("handler returned %v", rr.Body.String())
}
}
您首先检查返回码是所期望的,然后再验证返回消息体也是您期望的。
testWWW_test.go
的余下代码如下:
func TestStatusNotFound(t *testing.T) {
req, err := http.NewRequest("GET", "/StatusNotFound", nil)
if err != nil {
fmt.Println(err)
return
}
rr := httptest.NewRecorder()
handler := http.HandlerFunc(StatusNotFound)
handler.ServeHTTP(rr, req)
status := rr.Code
if status != http.StatusNotFound {
t.Errorf("handler returned %v", status)
}
}
这个测试函数验证 main
包中的 StatusNotFound()
函数是否如期运行。
执行 testWWW_test.go
的这俩个测试函数将产生如下输出:
$ go test testWWW.go testWWW_test.go -v
=== RUN TestCheckStatusOK
--- PASS: TestCheckStatusOK (0.00s)
=== RUN TestStatusNotFound
--- PASS: TestStatusNotFound (0.00s)
PASS
ok command-line-arguments (cached)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论