婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

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

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

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

前言

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

golang中的http請求

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

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語句用來調度一個函數調用(被延期的函數),使其在執行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 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))

}

執行結果響應

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請求基本上就以照上面的版本執行,當然我們現在需要做的是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次套件開始執行"
 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.TestHttpGet

gocheckhttp_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)
FAIL
FAIL command-line-arguments 0.613s

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

小結

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

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

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

巨人網絡通訊聲明:本文標題《golang分層測試之http接口測試入門教程》,本文關鍵詞  golang,分層,測,試之,http,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang分層測試之http接口測試入門教程》相關的同類信息!
  • 本頁收集關于golang分層測試之http接口測試入門教程的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲午夜电影网| 亚洲v日本v欧美v久久精品| 国产精品福利av| 国产在线一区观看| 欧美xxxxxxxx| 奇米精品一区二区三区在线观看一| 在线免费观看成人短视频| 中文字幕亚洲综合久久菠萝蜜| 国产很黄免费观看久久| 国产精品卡一卡二| 色综合一个色综合| 日韩在线一区二区| 精品噜噜噜噜久久久久久久久试看| 卡一卡二国产精品| 中文字幕一区二区三区在线播放| 欧美在线999| 久久黄色级2电影| 欧美激情一二三区| 欧美精品亚洲二区| 国产成人亚洲精品狼色在线| 亚洲最新视频在线观看| 欧美成人vps| 色偷偷88欧美精品久久久| 人人精品人人爱| 亚洲视频一二三| 26uuu精品一区二区三区四区在线| aaa欧美日韩| 精品一区二区三区免费视频| 亚洲精品视频免费看| 26uuu亚洲婷婷狠狠天堂| 91久久精品一区二区| 久久超级碰视频| 亚洲国产精品一区二区久久| 日本一区二区视频在线观看| 91精品一区二区三区在线观看| 99国产一区二区三精品乱码| 韩国精品主播一区二区在线观看| 亚洲自拍欧美精品| 国产日韩欧美一区二区三区乱码 | 一本大道综合伊人精品热热| 日本sm残虐另类| 亚洲gay无套男同| 亚洲欧洲综合另类在线| 久久久一区二区三区| 欧美日韩国产精品成人| 91在线精品一区二区| 国产精品一区免费视频| 久久99蜜桃精品| 麻豆精品新av中文字幕| 五月婷婷久久丁香| 五月婷婷综合在线| 丝袜诱惑制服诱惑色一区在线观看| 亚洲精品国产视频| 国产精品久久久久永久免费观看| 精品久久久久久久人人人人传媒| 91精品国产aⅴ一区二区| 欧美性受xxxx黑人xyx| 一本久道中文字幕精品亚洲嫩| www.日韩精品| 99综合电影在线视频| 99视频精品在线| 91老师片黄在线观看| 一本色道久久加勒比精品 | 中文字幕的久久| 久久九九久精品国产免费直播| 精品国产123| 久久天堂av综合合色蜜桃网| 精品国产乱码久久久久久浪潮| 精品美女被调教视频大全网站| 精品免费国产二区三区| 国产女同性恋一区二区| 1000部国产精品成人观看| 亚洲色大成网站www久久九九| 亚洲嫩草精品久久| 日韩福利电影在线| 国产一区二区三区电影在线观看| 国产精品18久久久久| 成人自拍视频在线| 色先锋资源久久综合| 制服丝袜中文字幕一区| 欧美一级一区二区| 国产免费久久精品| 亚洲高清视频中文字幕| 看电影不卡的网站| 97久久超碰国产精品| 这里只有精品电影| 国产精品美日韩| 五月激情六月综合| 国产99久久久国产精品| 在线观看日韩电影| 久久综合视频网| 亚洲精品国产一区二区精华液 | 黄色日韩三级电影| 成人激情文学综合网| 欧美亚洲综合在线| 欧美成人在线直播| 亚洲日本在线a| 久久激情五月激情| 欧美中文字幕一区二区三区亚洲| 日韩欧美成人一区二区| 亚洲日本成人在线观看| 经典一区二区三区| 色噜噜狠狠色综合欧洲selulu| 精品国产1区二区| 午夜精品久久久久久久99樱桃| 国产成人精品免费一区二区| 欧美色图在线观看| 国产精品欧美一级免费| 青青草97国产精品免费观看无弹窗版 | 日韩欧美激情四射| 亚洲视频狠狠干| 国产露脸91国语对白| 在线不卡的av| 亚洲精品老司机| 成人午夜大片免费观看| 欧美xxxx在线观看| 视频一区欧美精品| 欧美在线制服丝袜| 国产精品不卡在线观看| 国产精品香蕉一区二区三区| 欧美一级一区二区| 日韩精彩视频在线观看| 91国偷自产一区二区三区观看| 国产三级精品三级| 国内精品伊人久久久久影院对白| 欧美一区二区三区免费在线看| 亚洲国产一二三| 在线中文字幕一区| 亚洲欧美激情小说另类| 99久久99久久精品免费看蜜桃 | 国产一区二区美女诱惑| 欧美一级在线免费| 看片网站欧美日韩| 精品日韩欧美在线| 国产在线一区观看| 欧美激情一区不卡| 成人av在线影院| 综合久久给合久久狠狠狠97色| 成人91在线观看| 亚洲在线观看免费视频| 精品视频全国免费看| 亚洲综合999| 在线播放欧美女士性生活| 日韩av在线发布| 欧美xingq一区二区| 国产一区二区三区免费观看| 2017欧美狠狠色| 99久久精品免费看| 亚洲一区二区三区在线| 欧美精三区欧美精三区| 久久国产精品色| 国产欧美日韩精品一区| 欧美亚洲自拍偷拍| 九九久久精品视频| 中文av一区二区| 欧美天天综合网| 蜜臀a∨国产成人精品| 国产女同互慰高潮91漫画| 色吧成人激情小说| 麻豆高清免费国产一区| 中文字幕av免费专区久久| 日本久久电影网| 美女爽到高潮91| 亚洲欧洲成人精品av97| 欧美精品久久久久久久多人混战| 精品一区二区三区免费视频| 中文字幕在线免费不卡| 91精品国产综合久久久久久久| 国产原创一区二区| 夜夜嗨av一区二区三区网页 | 精品日韩一区二区三区免费视频| 国内成+人亚洲+欧美+综合在线| 国产精品久久免费看| 日韩欧美一级特黄在线播放| voyeur盗摄精品| 久久爱另类一区二区小说| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 91在线一区二区| 久久精品99国产精品日本| 亚洲免费观看高清完整版在线观看| 日韩女优av电影| 欧美在线一二三| 成人黄色在线看| 久久99深爱久久99精品| 无码av免费一区二区三区试看| 亚洲欧美综合网| 久久精品一区二区三区不卡| 欧美一卡二卡在线观看| 欧美视频日韩视频在线观看| www.亚洲精品| 成人开心网精品视频| 国内精品久久久久影院色| 日韩经典一区二区| 亚洲国产精品欧美一二99| 中文字幕亚洲欧美在线不卡| 久久精品亚洲国产奇米99| 欧美成人a∨高清免费观看| 777奇米成人网| 7777精品久久久大香线蕉| 欧美日韩一区二区三区四区五区|