前言
前几话主要讲解关于使用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:
从上面可以看出如果body既没有被完全读取,也没有被关闭,那么这次http事务就没有完成,除非连接因超时终止了,否则相关资源无法被回收,所以需要我们进行关闭连接的操作,这个是很多golang新手会忽略的一个点,作为client端处理response的时候,body一定要close,否则会造成GC回收不到,继而产生内存泄露










