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