• go测试库之apitest


    前言

    使用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 测试库

    一个简单且可扩展的行为测试库。

    测试库: 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

    • 简单的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 评价

    官网:apitest | HTTP testing for Go

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

    最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

    这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

  • 相关阅读:
    vue3 图片/视频 加载失败重试
    node_modules/.bin/vue-cli-service: Permission denied
    springboot-综合案例
    Toit faible vieil.Saluer rompre bientôt éclat.Носок очутиться коллектив болото.
    企业子网划分详解
    异步电机控制算法更新列表
    如何发布一个 NPM 包
    Java架构师系统架构设计性能评估
    技术人员的职业发展规划的思考
    前缀和 LeetCode1094 拼车
  • 原文地址:https://blog.csdn.net/qq_48811377/article/details/134222439