使用go语言做开发差不多快一年了,主要用来写后端Web服务,从一开始吐槽他的结构体,比如创建个复杂的JSON格式数据,那是相当的痛苦。还有 err 处理写的巨麻烦。
当然,go 也有爽的地方,创建个线协程简直太简单了。
到后来慢慢接受,觉得效率还行,因为是静态强类型语言,在修改完项目代码之后,反而很有信心(如果出现低级的类型错误,直接编译出错了),相比 Python 就要反复检查两边,对修改的代码总时心里发虚。
go语言测试相关的东西都不咋地,比如自带的测试框架相比较 pytest 那是相当的简陋。今年开始给后端写单元测试(其实应该叫接口测试),发现 apitest库 眼前一亮。采用链式调用,和 HttpRunner 3.x 的链式调用颇有几分相似。
- # httprunner 3.x
- from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
-
-
- class TestCaseTestCase(HttpRunner):
-
- config = Config("basic test config").base_url("http://127.0.0.1:8000/api")
-
- teststeps = [
- Step(
- RunRequest(" test_add_event_all_null")
- .post("/add_event/")
- .with_data({"eid": "", "limit": "", "address": "", "start_time": ""})
- .validate()
- .assert_equal("body.status", 10021)
- .assert_equal("body.message", "parameter error")
- )
- ]
-
-
- if __name__ == "__main__":
- TestCaseTestCase().test_start()
一个简单且可扩展的行为测试库。
测试库: GitHub - steinfletcher/apitest: A simple and extensible behavioural testing library for Go. You can use api test to simplify REST API, HTTP handler and e2e tests. jsonpath库: github.com/steinfletcher/apitest-jsonpath
- package api
-
- import (
- "net/http"
- "testing"
- "time"
-
- "github.com/steinfletcher/apitest"
- )
-
- func Client() http.Client {
- cli := &http.Client{
- Timeout: time.Second * 10,
- }
- return *cli
- }
-
- func TestGetSample(t *testing.T) {
- cli := Client()
- apitest.New().
- EnableNetworking(&cli).
- Get("http://httpbin.org/get").
- Expect(t).
- Status(http.StatusOK).
- End()
- }
New()
: 创建一个新的API测试。
EnableNetworking()
: EnableNetworking为提供的客户端启用网络,需要一个 http.Clinet。
Get()
: 发送get 请求,需要一个URL。
Expect()
: Expect将请求规范标记为完整。
Status()
: 断言http状态。http.StatusOK = 200
End()
: End运行测试,将结果返回给调用者。
- import (
- ...
- jsonpath "github.com/steinfletcher/apitest-jsonpath"
- )
-
- ...
-
- func TestGetParams(t *testing.T) {
- cli := Client()
- apitest.New().
- EnableNetworking(&cli).
- Intercept(func(req *http.Request) {
- req.URL.RawQuery = "id=1&name=jack"
- }).
- Get("http://httpbin.org/get").
- Expect(t).
- Assert(
- jsonpath.Contains(`$.args.id`, "1")).
- Assert(
- jsonpath.Equal(`$.args.name`, "jack")).
- End()
- }
req.URL.RawQuery
: 用于定义get请求参数。
Assert()
,方法用于断言。
jsonpath 提供了断言方法,Contains判断包含,Equal判断相等。
- ...
-
- func TestPostFormData(t *testing.T) {
- cli := Client()
- apitest.New().
- EnableNetworking(&cli).
- Post("http://httpbin.org/post").
- FormData("key1", "value1").
- FormData("key2", "value2").
- Expect(t).
- Assert(
- jsonpath.Chain().
- Equal(`$.form.key1`, "value1").
- Equal(`$.form.key2`, "value2").
- End()).
- End()
- }
FormData()
用于设置form-Data格式的参数。
jsonpath 提供的断言同样支持链式调用。
- ...
-
- func TestPostJson(t *testing.T) {
- cli := Client()
- apitest.New().
- EnableNetworking(&cli).
- Post("http://httpbin.org/post").
- JSON(`{"message": "hi"}`).
- Expect(t).
- Assert(
- jsonpath.Chain().
- Contains(`$.data`, "message").
- Contains(`$.data`, "hi").
- End()).
- End()
- }
JSON()
用于设置JSON()请求方法。
官网:apitest | HTTP testing for Go
apitest 在完成http接口测试方面还是非常方便的,如果你被 go语言的 http 库蹂躏过一段时间之后感触更深;怎么说了,比如你经常被老板PUA,突然有一天老板居然当面表扬了你,大概就这种感觉。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!