互联网就业技术指南

golang分层测试之http接口测试入门

2018-12-10  本文已影响0人  Chole121

前言

本节主要讲使用golang进行接口测试,其中主要以http协议的接口测试来讲

golang中的http请求

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))
}
defer resp.Body.Close()
  1. bufio.Reader,这层尝试将多次小的读操作替换为一次大的读操作,减少系统调用的次数,提高性能;
  2. io.LimitedReader,tcp连接在读取完body后不会关闭,继续读会导致阻塞,所以需要LimitedReader在body读完后发出eof终止读取;
  3. chunkedReader,解析chunked格式编码(如果不是chunked略过);
  4. bodyEOFSignal,在读到eof,或者是提前关闭body时会对readLoop发出回收连接的通知;
  5. gzipReader,解析gzip压缩(如果不是gizp压缩略过);

带json的post请求

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

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"
}

golang中的http接口测试

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

小结

感谢作者:周学习的名字被占了
查看原文:golang分层测试之http接口测试入门

添加小编微信:grey0805,加入知识学习小分队~!

上一篇 下一篇

猜你喜欢

热点阅读