注意: test文件要和逻辑代码在同一个包中 不然显示不出来 控制台 godoc命令要自己安装 格式正确的话是可以运行的,在代码中不要有多余的注释,不然运行不起来的
测试
DEBUG
,多Testing
// 如果要测试add函数,那么文件名就叫做add_test.go // 测试方法名字就叫做TestAdd package main import "testing" func add(a, b int) int { return a + b } func TestAdd(t *testing.T) { tests := []struct{ a, b, c int }{ {3, 4, 7}, {1, 2, 3}, {4, 5, 1}, //模拟出错 {1, 1, 1}, // 模拟出错 } for _, tt := range tests { if actual := add(tt.a, tt.b); actual != tt.c { t.Errorf("%d + %d got %d ;expected %d ", tt.a, tt.b, tt.c, actual) } } }
GOROOT=/usr/local/go #gosetup GOPATH=/Users/xiao_xiaoxiao/go #gosetup /usr/local/go/bin/go test -c -o /private/var/folders/db/mpycn34j5534hjnxy33y6h9m0000gn/T/___TestAdd_in_learn2_testing learn2/testing #gosetup /usr/local/go/bin/go tool test2json -t /private/var/folders/db/mpycn34j5534hjnxy33y6h9m0000gn/T/___TestAdd_in_learn2_testing -test.v -test.run ^TestAdd$ #gosetup === RUN TestAdd TestAdd: add_test.go:19: 4 + 5 got 1 ;expected 9 TestAdd: add_test.go:19: 1 + 1 got 1 ;expected 2 --- FAIL: TestAdd (0.00s) FAIL
用命令行测试
go test
命令
不通过
通过
代码覆盖率
这个项目里面的代码都会统计覆盖率用命令行操作
go test -coverprofile=c.out
生成文件go tool cover -html=c.out
页面观看覆盖率
性能测试
// BenchmarkXxx testing.B func BenchmarkAdd(b *testing.B) { a, j, c := 1, 2, 3 //一般性能测试选择最复杂的那个用例, // 如果在这里做测试用的数据的生成,不想把这个时间加进去,可以在生成数据之后reset一下时间 b.ResetTimer() for i := 0; i < b.N; i++ { //性能测试一般循环多次,具体不用我们定,用b.N系统自动帮我们确定多少次 actual := Add(a, j) if actual != c { b.Errorf("%d + %d got %d ;expected %d ", a, j, c, actual) } } }
GOROOT=/usr/local/go #gosetup GOPATH=/Users/xiao_xiaoxiao/go #gosetup /usr/local/go/bin/go test -c -o /private/var/folders/db/mpycn34j5534hjnxy33y6h9m0000gn/T/___BenchmarkAdd_in_learn2_testing learn2/testing #gosetup /private/var/folders/db/mpycn34j5534hjnxy33y6h9m0000gn/T/___BenchmarkAdd_in_learn2_testing -test.v -test.bench ^BenchmarkAdd$ -test.run ^$ #gosetup goos: darwin goarch: amd64 pkg: learn2/testing BenchmarkAdd # 100000000次 每次操作 0.512 ns BenchmarkAdd-4 1000000000 0.512 ns/op PASS
用命令行
go test -bench .
性能调优
go test -bench . -cpuprofile=cpu.out
生成二进制文件go tool pprof cpu.out
:进入pprof
环境pprof
环境之后,使用web
命令生成图(要先安装graphviz工具)
(大概长这样,我的用例太简单了,所以截图了其他的用例的图)
http测试
request
和response
,然后测试函数对各种返回是否正常,第二种是测试服务器是否正常,构造一个server
,然后通过通信,看看是否正常package main import ( "errors" "fmt" "io/ioutil" "net/http" "net/http/httptest" "os" "strings" "testing" ) // 测试errWrapper // 入参是appHandler :::type appHandler func(writer http.ResponseWriter, request *http.Request) error // func errWrapper(handler appHandler) func(http.ResponseWriter, *http.Request) { // } // ******************* 入参构造 ***********************// // 模拟抛出错误 func errPanic(_ http.ResponseWriter, _ *http.Request) error { panic(123) } type testingUserError string func (e testingUserError) Error() string { return e.Message() } func (e testingUserError) Message() string { return string(e) } // 模拟用户错误 func errUserError(_ http.ResponseWriter, _ *http.Request) error { return testingUserError("user error") } //模拟。。。 func errNotFound(_ http.ResponseWriter, _ *http.Request) error { return os.ErrNotExist } func errNoPermission(_ http.ResponseWriter, _ *http.Request) error { return os.ErrPermission } func errUnknown(_ http.ResponseWriter, _ *http.Request) error { return errors.New("unknown error") } // 没有错误 func noError(writer http.ResponseWriter, _ *http.Request) error { fmt.Fprintln(writer, "no error") return nil } // 这个是 测试用例 var tests = []struct { h appHandler // 入参 // 返回的信息 code int message string }{ {errPanic, 500, "Internal Server Error"}, {errUserError, 400, "user error"}, {errNotFound, 404, "Not Found"}, {errNoPermission, 403, "Forbidden"}, {errUnknown, 500, "Internal Server Error"}, {noError, 200, "no error"}, } //测试errWrapper // 只是测试errWrapper这个函数 func TestErrWrapper(t *testing.T) { for _, tt := range tests { f := errWrapper(tt.h) //入参 // httptest 可以虚构request 和 response // response request 是 指针类型 response := httptest.NewRecorder() request := httptest.NewRequest(http.MethodGet, "https://www.imooc.com", nil) f(response, request) // 执行 verifyResponse(response.Result(), tt.code, tt.message, t) } } // 测试整个服务器是否正常,这个是真的发请求, func TestErrWrapperInServer(t *testing.T) { for _, tt := range tests { f := errWrapper(tt.h) // 发请求 构造一个server server := httptest.NewServer( http.HandlerFunc(f)) // 传入处理函数 resp, _ := http.Get(server.URL) verifyResponse(resp, tt.code, tt.message, t) } } // 判断 是否正确 func verifyResponse(resp *http.Response, expectedCode int, expectedMsg string, t *testing.T) { b, _ := ioutil.ReadAll(resp.Body) body := strings.Trim(string(b), "n") if resp.StatusCode != expectedCode || body != expectedMsg { t.Errorf("expect (%d, %s); "+ "got (%d, %s)", expectedCode, expectedMsg, resp.StatusCode, body) } }
生成文档和示例代码
文档
go doc # 显示struct结构 和引入哪些包 # package queue // import "imooc.com/ccmouse/learngo/lang/queue" # type Queue []int go doc Push #方法 #package queue // import "." # func (q *Queue) Push(v int) # Pushes the element into the queue. go doc Queue # package queue // import "." #type Queue []int # A FIFO queue. #func (q *Queue) IsEmpty() bool #func (q *Queue) Pop() int #func (q *Queue) Push(v int) go help doc
godoc -http :8080
注释
package queue // A FIFO queue. type Queue []int // Pushes the element into the queue. 注释会记录下来 // e.g. q.Push(123) 会缩进而且用框框框起来 func (q *Queue) Push(v int) { *q = append(*q, v) } // Pops element from head. func (q *Queue) Pop() int { head := (*q)[0] *q = (*q)[1:] return head } // Returns if the queue is empty or not. func (q *Queue) IsEmpty() bool { return len(*q) == 0 }
example
func ExampleQueue_Pop() { q := Queue{1} q.Push(2) q.Push(3) fmt.Println(q.Pop()) fmt.Println(q.Pop()) fmt.Println(q.IsEmpty()) fmt.Println(q.Pop()) fmt.Println(q.IsEmpty()) // Output: // 1 // 2 // false // 3 // true }
-生成文件
总结
go doc
/godoc
来查看/生成文档
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算