测试出站API调用的最佳方法

如今

>日常工作中的另一个重要角色是编写测试。测试确保(或应保证:d)美国编写的所有代码都在其预期方面工作,因此,当该功能在生产环境下运行时,它不会发生任何惊喜。>因此,很自然地认为,对出站api呼叫的编写测试对于有能力的软件工程师至关重要。在这篇文章中,我想分享一些可以减轻您的测试写作的技术!

因此,第一步是构建将要测试的服务。这真的很简单:我们将称呼pokédexapi(我在pokémontcgpocket hype),并列出所有现有的pokémon。

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() {    pkmns, err := fetchpokemon(url)    if err != nil {        fmt.println(err)        return    }    for _, pkmn := range pkmns {        fmt.println(pkmn.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"    "fmt"    "net/http")type respbody struct {    results []pokemon `json:"results"`}type pokemon struct {    name string `json:"name"`}const url = "https://pokeapi.co"func main() {    pkmns, err := fetchpokemon(url)    if err != nil {        fmt.println(err)        return    }    for _, pkmn := range pkmns {        fmt.println(pkmn.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}

登录后复制登录后复制

摩卡

摩卡是一个受nock和wiremock启发的自由。它允许检查模拟是否被调用,这是一个不错的功能。像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启发的lib,具有无限匹配者和功能。它还允许用户构建其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")}

登录后复制minetto 关于此lib的文章很棒!值得检查!

结论

我认为,一种方法并不比另一种方法更好。这取决于哪些对您和您的团队的效果更好。如果没有额外的依赖性是不做的,并且您不介意手动编写比赛,请选择最高的依赖性,然后开心!

>

如果没有问题,请检查其他条件。您希望一个更丰富的api吗?更完整的依赖性还是较小的依赖性?在您的情况下选择有意义的事物。就我个人而言,我最喜欢apitest,我主张它在团队中使用,因为我认为这是最完整的。
>。

如果您想检查整个示例,请访问此链接!

>

以上就是测试出站API调用的最佳方法的详细内容,更多请关注【创想鸟】其它相关文章!

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

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

(0)
上一篇 2025年2月28日 11:47:02
下一篇 2025年2月19日 08:21:41

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

相关推荐

  • 以最佳方式对API进行测试

    Web开发人员的工作很大一部分涉及API调用,无论是与合作伙伴系统集成还是与供应商集成。 编写测试是开发流程中不可或缺的一部分。测试确保代码按预期工作,避免在生产环境中出现意外情况。 熟练掌握API测试对于合格的软件工程师至关重要。本文将介…

    2025年2月28日
    200
  • 格式说明符: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
  • 掌握代码设计: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

发表回复

登录后才能评论