go测试库之apitest

打印 上一主题 下一主题

主题 950|帖子 950|积分 2850

前言

使用go语言做开发差不多快一年了,主要用来写后端Web服务,从一开始吐槽他的结构体,比如创建个复杂的JSON格式数据,那是相当的痛苦。还有 err 处理写的巨麻烦。
当然,go 也有爽的地方,创建个线协程简直太简单了。
到后来慢慢接受,觉得效率还行,因为是静态强类型语言,在修改完项目代码之后,反而很有信心(如果出现低级的类型错误,直接编译出错了),相比 Python 就要反复检查两边,对修改的代码总时心里发虚。
go语言测试相关的东西都不咋地,比如自带的测试框架相比较 pytest 那是相当的简陋。今年开始给后端写单元测试(其实应该叫接口测试),发现 apitest库 眼前一亮。采用链式调用,和 HttpRunner 3.x 的链式调用颇有几分相似。

  • HttpRunner 3.x
  1. # httprunner 3.x
  2. from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
  3. class TestCaseTestCase(HttpRunner):
  4.     config = Config("basic test config").base_url("http://127.0.0.1:8000/api")
  5.     teststeps = [
  6.         Step(
  7.             RunRequest(" test_add_event_all_null")
  8.             .post("/add_event/")
  9.             .with_data({"eid": "", "limit": "", "address": "", "start_time": ""})
  10.             .validate()
  11.             .assert_equal("body.status", 10021)
  12.             .assert_equal("body.message", "parameter error")
  13.         )
  14.     ]
  15. if __name__ == "__main__":
  16.     TestCaseTestCase().test_start()
复制代码
apitest 测试库

一个简单且可扩展的行为测试库。
测试库: https://github.com/steinfletcher/apitest jsonpath库: github.com/steinfletcher/apitest-jsonpath

  • 简单的get接口
  1. package api
  2. import (
  3. "net/http"
  4. "testing"
  5. "time"
  6. "github.com/steinfletcher/apitest"
  7. )
  8. func Client() http.Client {
  9. cli := &http.Client{
  10.   Timeout: time.Second * 10,
  11. }
  12. return *cli
  13. }
  14. func TestGetSample(t *testing.T) {
  15. cli := Client()
  16. apitest.New().
  17.     EnableNetworking(&cli).
  18.   Get("http://httpbin.org/get").
  19.   Expect(t).
  20.   Status(http.StatusOK).
  21.   End()
  22. }
复制代码
New(): 创建一个新的API测试。
EnableNetworking(): EnableNetworking为提供的客户端启用网络,需要一个 http.Clinet。
Get(): 发送get 请求,需要一个URL。
Expect(): Expect将请求规范标记为完整。
Status(): 断言http状态。http.StatusOK = 200
End(): End运行测试,将结果返回给调用者。

  • get接口带参数
  1. import (
  2.   ...
  3. jsonpath "github.com/steinfletcher/apitest-jsonpath"
  4. )
  5. ...
  6. func TestGetParams(t *testing.T) {
  7. cli := Client()
  8. apitest.New().
  9.   EnableNetworking(&cli).
  10.   Intercept(func(req *http.Request) {
  11.    req.URL.RawQuery = "id=1&name=jack"
  12.   }).
  13.   Get("http://httpbin.org/get").
  14.   Expect(t).
  15.   Assert(
  16.    jsonpath.Contains(`$.args.id`, "1")).
  17.   Assert(
  18.    jsonpath.Equal(`$.args.name`, "jack")).
  19.   End()
  20. }
复制代码
req.URL.RawQuery: 用于定义get请求参数。
Assert() ,方法用于断言。
jsonpath 提供了断言方法,Contains判断包含,Equal判断相等。

  • post接口Form-data参数
  1. ...
  2. func TestPostFormData(t *testing.T) {
  3. cli := Client()
  4. apitest.New().
  5.   EnableNetworking(&cli).
  6.   Post("http://httpbin.org/post").
  7.   FormData("key1", "value1").
  8.   FormData("key2", "value2").
  9.   Expect(t).
  10.   Assert(
  11.    jsonpath.Chain().
  12.     Equal(`$.form.key1`, "value1").
  13.     Equal(`$.form.key2`, "value2").
  14.     End()).
  15.   End()
  16. }
复制代码
FormData() 用于设置form-Data格式的参数。
jsonpath 提供的断言同样支持链式调用。

  • post接口JSON参数
  1. ...
  2. func TestPostJson(t *testing.T) {
  3. cli := Client()
  4. apitest.New().
  5.   EnableNetworking(&cli).
  6.   Post("http://httpbin.org/post").
  7.   JSON(`{"message": "hi"}`).
  8.   Expect(t).
  9.   Assert(
  10.    jsonpath.Chain().
  11.     Contains(`$.data`, "message").
  12.     Contains(`$.data`, "hi").
  13.     End()).
  14.   End()
  15. }
复制代码
JSON() 用于设置JSON()请求方法。
apitest 评价

官网:https://apitest.dev/
apitest 在完成http接口测试方面还是非常方便的,如果你被 go语言的 http 库蹂躏过一段时间之后感触更深;怎么说了,比如你经常被老板PUA,突然有一天老板居然当面表扬了你,大概就这种感觉。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表