为了账号安全,请及时绑定邮箱和手机立即绑定

Go Test Coverage - Go Tool Not Recognize err !

Go Test Coverage - Go Tool Not Recognize err !

Go
暮色呼如 2022-10-24 15:28:27
我正在学习一些有关 Golang 测试覆盖率的知识,并且遇到了一些有趣的问题。我有一个公平的基本代码来调用 API 和执行http.Client.Do(request). 执行后,我检查错误并在找到时返回。resp, err := Client.Do(request)if err != nil {    return response, err}此外,我还为它添加了测试。我在哪里模拟Do函数并返回错误。mocks.DoFunc = func(*http.Request) (*http.Response, error) {    return nil, errors.New("hello world")}当我记录if err != nil条件时,我可以看到我的代码正在运行并被这个简单的评估捕获。我的问题在执行时开始 go tool cover -html=coverage.out。输出表明未涵盖此条件。所以,为什么我可以在登录时检查它,而 go 工具没有检测到它,我错过了什么?
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

好的。不确定,但工作。

似乎测试顺序在 TestCoverage 上非常重要,创建从最少到第一个评估的测试就可以if err != nil了。

我的代码做一个简单的获取 API:

  1. 创建一个响应对象

  2. 格式化 URL + ID

  3. 创建一个 Http.NewREquest

  4. 评估 NewRequest 错误

  5. 执行 http.Client.Do(request)

  6. 评估做错

  7. 等等等等……

...

response := &Response{}


url := fmt.Sprintf(pokeapiURLById, pokeId)


request, err := http.NewRequest(http.MethodGet, url, nil)


if err != nil {

    return nil, err

}


resp, err := Client.Do(request)


if err != nil {

    return nil, err

}

...


按以下顺序创建的测试。


func TestFetchById_WhenHttpNewRequestFails(t *testing.T) {...


func TestFetchById_WhenClientDoFails(t *testing.T) {...

首先,我测试 NewRequest 错误,然后测试 Client.Do(req) 错误。这样我就获得了 80% 的测试覆盖率......


当我更改测试方法的顺序时:


func TestFetchById_WhenClientDoFails(t *testing.T) {...


func TestFetchById_WhenHttpNewRequestFails(t *testing.T) {...

我有 100% 的测试覆盖率。我不知道这是一个问题还是应该是那样的......但是,现在,它运行良好。


查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号