亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

golang分層測試之http接口測試入門教程

2020-04-01 18:50:47
字體:
來源:轉載
供稿:網友

前言

前幾話主要講解關于使用golang進行單元測試,在單元測試的上一層就是接口測試,本節主要講使用golang進行接口測試,其中主要以http協議的接口測試來講解

golang中的http請求

golang中擁有一個原生的http依賴庫:net/http,http服務器的建立還是http客戶端的開發,都會使用到這個依賴庫,這里主要講解時client部分,作為請求發起方應用于日常的接口測試,例示代碼如下:

get請求

package mainimport ( "fmt" "io/ioutil" "net/http")func main() { //模擬一個get提交請求 resp, err := http.Get("http://127.0.0.1:12345/checkon") if err != nil {  panic(err) } defer resp.Body.Close() //關閉連接 body, err := ioutil.ReadAll(resp.Body) //讀取body的內容 fmt.Println(string(body))}

返回結果

E:/go_project>go run testget.go{ "code": 200, "data": "", "msg": "online", "state": "success"}

post請求:

package mainimport ( "fmt" "io/ioutil" "net/http" "strings")func main() { //模擬一個post提交請求 resp, err := http.Post("http://www.baidu.com", "application/x-www-form-urlencoded", strings.NewReader("id=1")) if err != nil {  panic(err) } //關閉連接 defer resp.Body.Close() //讀取報文中所有內容 body, err := ioutil.ReadAll(resp.Body) //輸出內容 fmt.Println(string(body))}

上面的post請求以form的方式,最后會返回一個頁面

這里說明一下以下這行代碼

defer resp.Body.Close()

首先是defer, Go的defer語句用來調度一個函數調用(被延期的函數),使其在執行defer的函數即將返回之前才被運行,被延期執行的函數,它的參數(包括接受者)實在defer執行的時候被求值的,而不是在調用執行的時候。也就是說被延期執行的函數的參數是按正常順序被求值的,簡單理解為,無論defer對應的代碼行放在代碼段的哪個位置,defer是在return前執行的代碼行,但defer代碼行中的參數是需要先聲明再調用的,對應響應中的處理,golang的Response.Body需要被關閉的,body實際上是一個嵌套了多層的net.TCPConn:

  • bufio.Reader,這層嘗試將多次小的讀操作替換為一次大的讀操作,減少系統調用的次數,提高性能;
  • io.LimitedReader,tcp連接在讀取完body后不會關閉,繼續讀會導致阻塞,所以需要LimitedReader在body讀完后發出eof終止讀取;
  • chunkedReader,解析chunked格式編碼(如果不是chunked略過);
  • bodyEOFSignal,在讀到eof,或者是提前關閉body時會對readLoop發出回收連接的通知;
  • gzipReader,解析gzip壓縮(如果不是gizp壓縮略過);

從上面可以看出如果body既沒有被完全讀取,也沒有被關閉,那么這次http事務就沒有完成,除非連接因超時終止了,否則相關資源無法被回收,所以需要我們進行關閉連接的操作,這個是很多golang新手會忽略的一個點,作為client端處理response的時候,body一定要close,否則會造成GC回收不到,繼而產生內存泄露

帶json的post請求

我們大部分應用到的restful接口都是用json格式的請求體,對應的golang的http請求也會有相關的方式post json請求體

package mainimport ( "fmt" "io/ioutil" "net/http"  "bytes" "encoding/json")type HttpData struct { Flag int `json:"flag"` Msg string `json:"msg"`}func main() { url := "http://127.0.0.1:12345/postdata" contentType := "application/json;charset=utf-8" var httpdata HttpData httpdata.Flag = 1 httpdata.Msg = "terrychow"  b ,err := json.Marshal(httpdata) if err != nil {  fmt.Println("json format error:", err)  return } body := bytes.NewBuffer(b) resp, err := http.Post(url, contentType, body) if err != nil {  fmt.Println("Post failed:", err)  return } defer resp.Body.Close() content, err := ioutil.ReadAll(resp.Body) if err != nil {  fmt.Println("Read failed:", err)  return } fmt.Println("header:", resp.Header) fmt.Println("content:", string(content))}

執行結果響應

E:/go_project>go run gohttptest.goheader: map[Content-Type:[application/json] Content-Length:[78] Server:[Werkzeug/0.14.1 Python/2.7.15] Date:[Thu, 06 Dec 2018 16:35:11 GMT]]content: { "code": 200, "data": 1, "msg": "terrychow", "state": "success"}

對于常用的get和post請求基本上就以照上面的版本執行,當然我們現在需要做的是http接口的測試,那就需要引入測試框架進行相關的校驗,本文先講解用之前提到的gocheck來進行斷言

golang中的http接口測試

引入gocheck之后我們得到了以下的腳本

package hello_testimport ( "testing" "fmt" "strconv" "io/ioutil" "net/http"  "bytes" "encoding/json" . "gopkg.in/check.v1")var a int =1// Hook up gocheck into the "go test" runner.func Test(t *testing.T) { TestingT(t) }type MySuite struct{}type HttpData struct { Flag int `json:"flag"` Msg string `json:"msg"`}var _ = Suite(&MySuite{})var testurl string ="http://127.0.0.1:12345"func (s *MySuite) SetUpSuite(c *C) { str3:="第1次套件開始執行" fmt.Println(str3) //c.Skip("Skip TestSutie")}func (s *MySuite) TearDownSuite(c *C) { str4:="第1次套件執行完成" fmt.Println(str4)}func (s *MySuite) SetUpTest(c *C) { str1:="第"+strconv.Itoa(a)+"條用例開始執行" fmt.Println(str1)}func (s *MySuite) TearDownTest(c *C) { str2:="第"+strconv.Itoa(a)+"條用例執行完成" fmt.Println(str2) a=a+1}func (s *MySuite) TestHttpGet(c *C) { geturl := fmt.Sprintf("%v/checkon", testurl) respget, err := http.Get(geturl) if err != nil {  panic(err) } defer respget.Body.Close() //關閉連接 body, err := ioutil.ReadAll(respget.Body) //讀取body的內容 var gdat map[string]interface{} //定義map用于解析resp.body的內容 if err := json.Unmarshal([]byte(string(body)), &gdat); err == nil {  fmt.Println(gdat) } else {  fmt.Println(err) } var gmsg=gdat["msg"] c.Assert(gmsg, Equals, "terrychow") //模擬失敗的斷言}func (s *MySuite) TestHttpPost(c *C) { url := fmt.Sprintf("%v/postdata", testurl) contentType := "application/json;charset=utf-8" var httpdata HttpData httpdata.Flag = 1 httpdata.Msg = "terrychow"  b ,err := json.Marshal(httpdata) if err != nil {  fmt.Println("json format error:", err)  return } body := bytes.NewBuffer(b) resp, err := http.Post(url, contentType, body) if err != nil {  fmt.Println("Post failed:", err)  return } defer resp.Body.Close() content, err := ioutil.ReadAll(resp.Body) if err != nil {  fmt.Println("Read failed:", err)  return } var dat map[string]interface{} //定義map用于解析resp.body的內容 if err := json.Unmarshal([]byte(string(content)), &dat); err == nil {  fmt.Println(dat) } else {  fmt.Println(err) } var msg=dat["msg"] c.Assert(msg, Equals, "terrychow") //模擬成功的斷言}

最后的輸出內容:

E:/go_project>go test -v gocheckhttp_test.go=== RUN Test第1次套件開始執行第1條用例開始執行map[code:200 data: msg:online state:success]第1條用例執行完成----------------------------------------------------------------------FAIL: gocheckhttp_test.go:56: MySuite.TestHttpGetgocheckhttp_test.go:72: c.Assert(gmsg, Equals, "terrychow")... obtained string = "online"... expected string = "terrychow"第2條用例開始執行map[msg:terrychow state:success code:200 data:1]第2條用例執行完成第1次套件執行完成OOPS: 1 passed, 1 FAILED--- FAIL: Test (0.02s)FAILFAIL command-line-arguments 0.613s

輸出的結果符合預期,這也是比較基本的http接口測試

小結

就上文來說,我們基本可以通過本文掌握如何做http接口測試,其核心還是使用http依賴庫發出請求獲取響應,利用gocheck進行斷言,當然還可以用testing,下一節繼續講一下http接口測試,但會重點講專門做http接口測試的測試框架httpexpect以及用于mock的httptest,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久综合免费视频| 亚洲乱亚洲乱妇无码| 亚洲视频在线观看| 久久精品视频中文字幕| 亚洲女人天堂视频| 久久精品夜夜夜夜夜久久| 国产精彩精品视频| 成人做爰www免费看视频网站| 自拍亚洲一区欧美另类| 免费97视频在线精品国自产拍| 亚洲一区二区在线播放| 色综合久久中文字幕综合网小说| 日韩在线精品视频| 国产精品福利在线观看网址| 欧美第一黄色网| 欧美成人剧情片在线观看| 国产日韩专区在线| 欧美激情a∨在线视频播放| 久久精品久久久久电影| 91av视频在线| 精品久久久999| 91精品久久久久久久久不口人| 欧美激情久久久久久| 国产精品三级美女白浆呻吟| 欧美裸体男粗大视频在线观看| 亚洲免费一在线| 色yeye香蕉凹凸一区二区av| 国产精品6699| 亚洲性视频网站| 欧美精品久久久久久久免费观看| 亚洲一区二区在线| 亚洲大尺度美女在线| 久久91亚洲精品中文字幕奶水| 国产精品亚洲片夜色在线| 国产亚洲精品久久久久久777| 精品动漫一区二区三区| 日韩禁在线播放| 91久久国产综合久久91精品网站| 日韩美女视频免费在线观看| 久久久久九九九九| 久久99国产精品久久久久久久久| 欧美日韩综合视频| 成年无码av片在线| 国产精品入口免费视| 色综合伊人色综合网| 国产69精品99久久久久久宅男| 精品国产欧美一区二区五十路| 懂色av一区二区三区| 亚洲欧美成人网| 欧美高清在线播放| 国产精品一区二区久久久久| 福利视频第一区| 国产精品视频精品| 欧美老女人性生活| 亚洲高清不卡av| 亚洲欧美中文日韩在线v日本| 欧美日韩中文字幕在线| 97精品视频在线| 久久久精品中文字幕| 亚洲男人av在线| 精品美女久久久久久免费| 欧美日韩国产色视频| 国产美女91呻吟求| 伊人久久久久久久久久久| 日韩欧美在线视频日韩欧美在线视频| 欧美午夜片在线免费观看| 亚洲国产精品999| 国产91九色视频| 久久久久国产精品免费| 亚洲成人久久网| 日韩视频在线免费| 成人国产精品久久久久久亚洲| 国内精品久久久久久影视8| 91精品国产综合久久久久久蜜臀| 日日噜噜噜夜夜爽亚洲精品| 亚洲欧美日韩一区二区三区在线| 国产精品88a∨| 色一情一乱一区二区| 久久久久久国产精品美女| 亚洲成人黄色网址| 久久这里有精品视频| 国产精品自拍偷拍视频| 国产美女直播视频一区| 国产精品三级久久久久久电影| 精品免费在线视频| 精品亚洲国产成av人片传媒| 欧美精品在线免费播放| 国产免费一区视频观看免费| 亚洲国产精品美女| 91精品国产色综合久久不卡98| 777午夜精品福利在线观看| 91欧美精品成人综合在线观看| 欧美视频二区36p| 久久精品99国产精品酒店日本| 91九色国产视频| 午夜精品久久久久久久白皮肤| 国产精品久久久久久久av大片| 国产97在线亚洲| 成人激情视频在线观看| 久久久久久久久久久成人| 在线成人一区二区| 国产日韩综合一区二区性色av| 性金发美女69hd大尺寸| 亚洲成人av片在线观看| 欧美激情一区二区三区在线视频观看| 中文字幕综合一区| 欧美激情视频网站| 精品女同一区二区三区在线播放| 国产精品美女www爽爽爽视频| 久久久久久久国产精品| 欧美大肥婆大肥bbbbb| 成人动漫网站在线观看| 久久久久久999| 亚洲视频国产视频| 亚洲а∨天堂久久精品9966| 日韩精品丝袜在线| 国产成人自拍视频在线观看| 国产精品丝袜一区二区三区| 91精品国产91久久久久久最新| 国产精品久久久久福利| 久久久久这里只有精品| 成人精品视频久久久久| 日韩在线观看免费全| 欧美在线视频在线播放完整版免费观看| 国语自产精品视频在线看| 欧美精品videosex牲欧美| 91丝袜美腿美女视频网站| 日韩中文在线不卡| 日韩在线视频免费观看| 日韩av成人在线观看| 色综合色综合网色综合| 欧美成人精品一区二区| 欧美激情精品久久久久久黑人| 国产午夜精品免费一区二区三区| 久久成年人免费电影| 538国产精品视频一区二区| 日韩综合中文字幕| 亚洲一品av免费观看| 97成人在线视频| 国产成人精品一区二区三区| 日韩av一区在线观看| 日韩电影在线观看中文字幕| 亚洲精品在线观看www| 国产精品爱啪在线线免费观看| 精品中文字幕在线| 黑人狂躁日本妞一区二区三区| 中文在线资源观看视频网站免费不卡| 久久久久中文字幕2018| 欧美性生活大片免费观看网址| 色综合久久悠悠| 国产精品欧美激情在线播放| 亚洲女人天堂成人av在线| 午夜精品久久久久久久99热| 色综合久久中文字幕综合网小说| 色综合天天综合网国产成人网| 国产成人在线播放| 欧美电影在线观看完整版| 日韩精品中文字幕在线观看| 久久国产天堂福利天堂| 欧美黑人xxxx| 大量国产精品视频| 久久久久久国产精品久久| 国产精品观看在线亚洲人成网| 欧美在线性爱视频|