首页 > 后端开发 > Golang > 正文

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

花韻仙語
发布: 2025-02-06 23:44:14
转载
587人浏览过

如今

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

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

package main

import (
    "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 main

import (
    "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 main

import (
    "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 main

import (
    "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 main

import (
    "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调用的最佳方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
相关标签:
来源:dev.to网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号