以最佳方式对API进行测试

以最佳方式对api进行测试

Web开发人员的工作很大一部分涉及API调用,无论是与合作伙伴系统集成还是与供应商集成。

编写测试是开发流程中不可或缺的一部分。测试确保代码按预期工作,避免在生产环境中出现意外情况。 熟练掌握API测试对于合格的软件工程师至关重要。本文将介绍几种简化API功能测试的技术。

首先,我们需要构建一个待测试的服务。这是一个简单的例子:我们调用Pokédex API(受Pokémon TCG Pocket的启发)并列出现有的宝可梦

package mainimport (    "encoding/json"    "fmt"    "net/http")type RespBody struct {    Results []Pokemon `json:"results"`}type Pokemon struct {    Name string `json:"name"`}const URL = "https://pokeapi.co"func main() {    pkms, err := FetchPokemon(URL)    if err != nil {        fmt.Println(err)        return    }    for _, pkm := range pkms {        fmt.Println(pkm.Name)    }}func FetchPokemon(u string) ([]Pokemon, error) {    r, err := http.Get(fmt.Sprintf("%s/api/v2/pokemon", u))    if err != nil {        return nil, err    }    defer r.Body.Close()    resp := RespBody{}    err = json.NewDecoder(r.Body).Decode(&resp)    if err != nil {        return nil, err    }    return resp.Results, nil}

登录后复制

httptest

httptest是Go语言自带的包。它允许在测试中创建模拟服务器。其主要优点是不需要引入外部依赖。但它不会自动拦截请求。

package mainimport (    "encoding/json"    "net/http"    "net/http/httptest"    "testing"    "github.com/stretchr/testify/assert")func Test_httptest(t *testing.T) {    j, err := json.Marshal(RespBody{Results: []Pokemon{{Name: "charizard"}}})    assert.Nil(t, err)    server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        if r.URL.Path != "/api/v2/pokemon" {            t.Errorf("expected to request '/api/v2/pokemon', got: %s", r.URL.Path)        }        w.WriteHeader(http.StatusOK)        w.Write([]byte(j))    }))    defer server.Close()    p, err := FetchPokemon(server.URL)    assert.Nil(t, err)    assert.Equal(t, p[0].Name, "charizard")}

登录后复制

Mocha

Mocha是一个受Nock和Wires启发的库。一个有趣的功能是能够验证模拟是否被调用。与httptest类似,它也不会自动拦截请求。

package mainimport (    "encoding/json"    "fmt"    "testing"    "github.com/stretchr/testify/assert"    "github.com/vitorsalgado/mocha/v3"    "github.com/vitorsalgado/mocha/v3/expect"    "github.com/vitorsalgado/mocha/v3/reply")func Test_mocha(t *testing.T) {    j, err := json.Marshal(RespBody{Results: []Pokemon{{Name: "charizard"}}})    assert.Nil(t, err)    m := mocha.New(t)    m.Start()    scoped := m.AddMocks(mocha.Get(expect.URLPath("/api/v2/pokemon")).        Reply(reply.OK().BodyString(string(j))))    p, err := FetchPokemon(m.URL())    fmt.Println(m.URL())    assert.Nil(t, err)    assert.True(t, scoped.Called())    assert.Equal(t, p[0].Name, "charizard")}

登录后复制

Gock

Gock是另一个不错的选择,它也是一个受Nock启发的库,具有简洁易用的API。它能够拦截任何http.Client发出的HTTP请求,并提供验证模拟调用的机制。如果模拟不存在,则返回错误;如果启用实际网络模式,则请求正常进行。

package mainimport (    "encoding/json"    "testing"    "github.com/h2non/gock"    "github.com/stretchr/testify/assert")func Test_gock(t *testing.T) {    defer gock.Off()    j, err := json.Marshal(RespBody{Results: []Pokemon{{Name: "charizard"}}})    assert.Nil(t, err)    gock.New("https://pokeapi.co").        Get("/api/v2/pokemon").        Reply(200).        JSON(j)    p, err := FetchPokemon(URL)    assert.Nil(t, err)    assert.Equal(t, p[0].Name, "charizard")}

登录后复制

apitest

最后,apitest是一个受Gock启发的库,具有丰富的匹配器和功能。它甚至允许生成HTTP调用的序列图。一个很酷的特性是它有一个很棒的网站,其中包含示例。

package mainimport (    "encoding/json"    "net/http"    "testing"    "github.com/steinfletcher/apitest"    "github.com/stretchr/testify/assert")func Test_APItest(t *testing.T) {    j, err := json.Marshal(RespBody{Results: []Pokemon{{Name: "Charizard"}}})    assert.Nil(t, err)    defer apitest.NewMock().        Get("https://pokeapi.co/api/v2/pokemon").        RespondWith().        Body(string(j)).        Status(http.StatusOK).        EndStandalone()()    p, err := FetchPokemon(URL)    assert.Nil(t, err)    assert.Equal(t, p[0].Name, "Charizard")}

登录后复制

总结

我认为没有哪个库绝对优于其他库,选择取决于你的偏好和项目需求。如果你不想引入额外的依赖,并且不介意手动编写匹配器,那么httptest是一个不错的选择。如果你需要更丰富的API或更全面的功能,可以考虑其他库。 我个人非常喜欢apitest,并推荐在团队中使用它,因为它功能非常全面。

更多示例请访问[链接] (此处应插入实际链接)。

以上就是以最佳方式对API进行测试的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2309948.html

(0)
上一篇 2025年2月28日 11:46:44
下一篇 2025年2月25日 10:53:35

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 格式说明符:Golang编程中的精度,效率和最佳实践

    我已经学习了一段时间,我发现了一些可能与初级golang开发人员混淆的东西:格式指定器。>那么,什么是格式指定器? a 格式指定器 是用于定义在显示或以输出为输出时应格式化数据的特殊代码。了解格式指定器对于在go程序中产生可读和有效的…

    2025年2月28日
    200
  • Golang:在特定时间实施类似Cron的任务 /执行任务

    go语言任务调度:从简单计时器到云原生方案 Go语言中的任务调度是自动化、后台作业和定期任务的常见需求。本文探讨了多种方法,从简单的基于时间的执行到强大的调度库和云原生解决方案。 使用time包的原生实现 对于简单的任务调度,Go内置的ti…

    2025年2月28日
    200
  • 深入研究Net/NetIP ADDR方法

    本文将深入探讨Go语言net/netip包中addr类型的各种方法,并结合实际案例进行讲解。我们之前已经介绍过一些基础知识,现在将更详细地分析每个方法的用法和场景。 核心方法概述 addr类型提供了丰富的功能方法,理解何时使用哪个方法对高效…

    2025年2月28日
    200
  • GO API中自定义错误处理系统的最终指南

    API响应中简单的错误信息(例如{“error”: “something went wrong.”})毫无用处。有效的错误响应应该包含:问题描述、解决方法以及API的构建细节。本文介绍如何构建…

    2025年2月28日
    200
  • 重构和清理GoyAcc:理解遗产代码

    Yacc是一款著名的LALR(1)解析器,以其高效性和稳定性著称。然而,它诞生于20世纪70年代,当时代码的可读性和简洁性并非首要考虑因素。因此,Yacc的代码库往往显得古老、难以理解,并充斥着过时的编码风格。这种状况也延续到了其Go语言版…

    2025年2月28日
    200
  • 掌握代码设计:IT&#S关于依赖关系

    在之前的文章“掌握代码设计:坚实原则的重要性”中,我们探讨了扎实的设计原则如何构建高质量软件。本文将深入探讨软件架构中至关重要的一个方面:依赖管理。 什么是依赖? 依赖关系指的是功能、方法、软件包或模块间的相互依赖性。例如,一个服务可能依赖…

    2025年2月28日
    200
  • 不要通过 – 恶意包装警报

    >研究人员最近在boltdb中发现了另一个软件供应链问题,这是go编程环境中流行的数据库工具。发现boltdb go模块被发现后dotodored并包含隐藏的恶意代码。此版本利用了go如何管理和缓存其模块,从而允许它忽略了几年。此后门…

    2025年2月28日 编程技术
    200
  • 有序地图

    Go语言的omap包:线程安全的有序映射 omap是Go语言的一个软件包,提供线程安全的、有序的映射功能。它结合了Go语言内置的map、列表和互斥锁,实现了有序映射的特性。 有序映射能够记住元素的插入顺序。迭代有序映射时,元素将按照添加顺序…

    2025年2月28日
    200
  • 如何用Cloudflare页面部署雨果

    学习新技能的最佳途径是将其传授给他人。不妨从创建个人博客开始吧!本文将介绍静态站点生成器(ssg),并引导您使用hugo和cloudflare pages搭建属于您的博客。 什么是静态站点生成器? 在网站加载速度慢如蜗牛爬行的互联网时代,静…

    2025年2月28日 编程技术
    200
  • GOST-DOM如何避免进行HTTP调用

    本文介绍了GOST-DOM的实现,这是一个用Go语言编写的无头浏览器。 Go语言编写的Web应用程序非常易于测试。Web应用程序为单个功能ServeHTTP提供HTTP请求。测试代码只需调用此函数即可测试Web应用程序的行为,但仍然可以通过…

    2025年2月28日
    200

发表回复

登录后才能评论