亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > golang分層測試之http接口測試入門教程

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

熱門標簽:江西轉化率高的羿智云外呼系統(tǒng) 高德地圖標注口訣 浙江高速公路地圖標注 南通如皋申請開通400電話 廣州呼叫中心外呼系統(tǒng) 地圖標注的汽車標 學海導航地圖標注 中國地圖標注省會高清 西部云谷一期地圖標注

前言

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

golang中的http請求

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

get請求

package main

import (
 "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 main

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

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

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

帶json的post請求

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

package main

import (
 "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))

}

執(zhí)行結果響應

E:\go_project>go run gohttptest.go
header: 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請求基本上就以照上面的版本執(zhí)行,當然我們現(xiàn)在需要做的是http接口的測試,那就需要引入測試框架進行相關的校驗,本文先講解用之前提到的gocheck來進行斷言

golang中的http接口測試

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

package hello_test

import (
 "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次套件開始執(zhí)行"
 fmt.Println(str3)
 //c.Skip("Skip TestSutie")
}

func (s *MySuite) TearDownSuite(c *C) {
 str4:="第1次套件執(zhí)行完成"
 fmt.Println(str4)
}

func (s *MySuite) SetUpTest(c *C) {
 str1:="第"+strconv.Itoa(a)+"條用例開始執(zhí)行"
 fmt.Println(str1)

}

func (s *MySuite) TearDownTest(c *C) {
 str2:="第"+strconv.Itoa(a)+"條用例執(zhí)行完成"
 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次套件開始執(zhí)行
第1條用例開始執(zhí)行
map[code:200 data: msg:online state:success]
第1條用例執(zhí)行完成

----------------------------------------------------------------------
FAIL: gocheckhttp_test.go:56: MySuite.TestHttpGet

gocheckhttp_test.go:72:
 c.Assert(gmsg, Equals, "terrychow")
... obtained string = "online"
... expected string = "terrychow"

第2條用例開始執(zhí)行
map[msg:terrychow state:success code:200 data:1]
第2條用例執(zhí)行完成
第1次套件執(zhí)行完成
OOPS: 1 passed, 1 FAILED
--- FAIL: Test (0.02s)
FAIL
FAIL command-line-arguments 0.613s

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

小結

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

您可能感興趣的文章:
  • Golang 使用接口實現(xiàn)泛型的方法示例
  • golang基礎之Interface接口的使用
  • golang中interface接口的深度解析
  • 初步解讀Golang中的接口相關編寫方法
  • golang中接口對象的轉型兩種方式

標簽:貴州 吐魯番 許昌 保定 東營 常州 曲靖 德宏

巨人網絡通訊聲明:本文標題《golang分層測試之http接口測試入門教程》,本文關鍵詞  golang,分層,測,試之,http,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang分層測試之http接口測試入門教程》相關的同類信息!
  • 本頁收集關于golang分層測試之http接口測試入門教程的相關信息資訊供網民參考!
  • 推薦文章
    韩国三级视频在线观看| 美国一区二区三区| 欧美爱色| 日韩在线观看网站| 国产高清在线精品一区二区| 麻豆网站在线免费观看| 日韩中文字幕在线播放| 久久99这里只有精品国产| 精品视频在线观看视频免费视频| 九九久久国产精品| 亚洲 国产精品 日韩| 99久久精品费精品国产一区二区| 欧美大片一区| 精品久久久久久中文| 精品久久久久久影院免费| 日韩一级黄色| 亚洲精品永久一区| 天天做日日干| 亚洲精品久久玖玖玖玖| 日韩在线观看视频免费| 国产伦理精品| 欧美大片毛片aaa免费看| 99久久精品国产国产毛片| 你懂的在线观看视频| 一 级 黄 中国色 片| 免费一级片在线| 二级特黄绝大片免费视频大片| 亚洲精品中文一区不卡| 精品国产三级a| 欧美一级视频免费| 国产91素人搭讪系列天堂| 成人av在线播放| 高清一级淫片a级中文字幕| 青青青草影院 | 一级毛片视频播放| 九九热国产视频| 尤物视频网站在线观看| 亚洲 国产精品 日韩| 青青久久网| 沈樵在线观看福利| 九九精品在线播放| 日本乱中文字幕系列 | 成人高清免费| 黄视频网站免费观看| 亚洲第一色在线| 精品国产亚洲一区二区三区| 日韩欧美一二三区| 国产高清在线精品一区a| 天天做人人爱夜夜爽2020 | 青青青草视频在线观看| 天天做日日爱| 999久久66久6只有精品| 成人免费高清视频| 深夜做爰性大片中文| 亚洲精品影院| 精品视频在线观看一区二区三区| 精品国产一区二区三区国产馆| 黄视频网站在线免费观看| 九九精品在线播放| 久草免费在线观看| 成人a大片在线观看| 亚洲www美色| 久久99欧美| 四虎影视库| 国产一区二区精品| 久草免费在线视频| 麻豆系列 在线视频| 欧美爱色| 国产精品1024永久免费视频| 国产一区国产二区国产三区| 91麻豆精品国产高清在线| 天天色色色| 久久精品成人一区二区三区| 深夜做爰性大片中文| 亚洲第一页乱| 国产欧美精品午夜在线播放| 精品视频在线观看一区二区| 国产精品免费精品自在线观看| 精品国产一区二区三区久| 国产精品自拍亚洲| 欧美激情影院| 成人在免费观看视频国产| a级毛片免费全部播放| a级毛片免费全部播放| 欧美大片一区| 久久精品大片| 色综合久久久久综合体桃花网| 国产视频久久久| 久久国产影视免费精品| 免费一级片在线观看| 精品国产一区二区三区久久久狼| 亚洲 男人 天堂| 黄视频网站免费观看| 国产91视频网| 韩国毛片免费大片| 欧美激情中文字幕一区二区| 你懂的国产精品| 中文字幕一区二区三区精彩视频 | 91麻豆爱豆果冻天美星空| 美女免费黄网站| 久久久久久久免费视频| 国产一区二区精品| 午夜激情视频在线观看| 久久精品欧美一区二区| 久久精品道一区二区三区| 精品在线视频播放| 欧美激情一区二区三区在线| 国产原创中文字幕| 999精品视频在线| 精品国产香蕉在线播出| 国产成+人+综合+亚洲不卡| 欧美激情在线精品video| 四虎论坛| 999久久久免费精品国产牛牛| 国产91素人搭讪系列天堂| 久草免费在线观看| 日本在线不卡视频| 99色视频| 国产视频一区在线| 精品国产一区二区三区久| 国产不卡高清| 欧美1区| 亚洲精品永久一区| 日本免费乱人伦在线观看| 亚洲天堂免费| 欧美国产日韩一区二区三区| 精品视频在线看| 国产伦久视频免费观看 视频| 一级片片| 国产伦精品一区三区视频| 国产精品免费久久| 久久成人综合网| 国产伦理精品| 国产美女在线一区二区三区| 欧美激情伊人| 午夜久久网| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 四虎久久影院| 天天做人人爱夜夜爽2020 | 九九久久99| 99久久精品国产免费| 欧美a级大片| 精品国产香蕉伊思人在线又爽又黄| a级黄色毛片免费播放视频| 成人在免费观看视频国产| 免费的黄色小视频| 欧美a级大片| 国产不卡高清| 超级乱淫伦动漫| 精品久久久久久中文| 亚洲精品影院| 欧美爱爱网| 午夜家庭影院| 欧美一级视频免费观看| 美女免费毛片| 久久久久久久免费视频| 精品国产三级a∨在线观看| 精品国产三级a| 精品国产一区二区三区久久久狼| 麻豆网站在线免费观看| 久久国产精品只做精品| 国产激情一区二区三区| 香蕉视频三级| 欧美激情一区二区三区在线播放 | 国产91精品一区| 黄色短视频网站| 国产视频一区在线| 久久成人亚洲| 欧美爱色| 一级毛片视频在线观看| a级毛片免费全部播放| 国产a视频| 精品视频在线观看视频免费视频| 久久99中文字幕| 天天做日日爱| 黄色短视频网站| 99热精品在线| 精品视频在线观看免费| 四虎论坛| 国产极品精频在线观看| 久草免费在线色站| 日韩综合| 黄色免费网站在线| 高清一级淫片a级中文字幕| 黄色福利| 色综合久久天天综合绕观看| 91麻豆国产| 国产网站在线| 精品美女| 日韩一级精品视频在线观看| 91麻豆精品国产高清在线| 国产精品自拍亚洲| 黄色免费三级| 美女免费精品视频在线观看| 黄色福利片| 亚洲 男人 天堂| 亚欧乱色一区二区三区| 国产网站在线| 欧美国产日韩在线| 天天做人人爱夜夜爽2020毛片|