Go 测试覆盖率 - Go 工具无法识别 err != nil returns

Go Test Coverage - Go Tool Not Recognize err != nil returns

我正在学习一些关于 Golang 中的测试覆盖率的知识,并且遇到了一些有趣的问题。

我有一个公平的基本代码来调用 API 和执行 http.Client.Do(request)。执行后我检查错误并 return 如果发现错误。

resp, err := Client.Do(request)

if err != nil {
    return response, err
}

此外,我已经为它添加了测试。我在哪里模拟 Do 函数并 return 报错。

mocks.DoFunc = func(*http.Request) (*http.Response, error) {
    return nil, errors.New("hello world")
}

当我记录 if err != nil 条件时,我可以看到我的代码是 运行 并被这个简单的评估捕获。

我的问题是在执行 go tool cover -html=coverage.out 时出现的。输出表明不包含此条件。

所以,为什么我可以在登录时检查它,而 go 工具没有检测到它,我错过了什么?

好的。不确定,但有效。

似乎测试顺序在 TestCoverage 上真的很重要,创建从最少到最先评估的测试 if err != nil 成功了。

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

  1. 创建响应对象
  2. 格式化 URL + ID
  3. 创建 Http.NewREquest
  4. 评估 NewRequest 错误
  5. 执行http.Client.Do(请求)
  6. 评估 Do err
  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% 的测试覆盖率。 我不知道这是一个问题还是应该是这样的...但是,现在,它运行良好。