Bar*_*rim 2 error-handling unit-testing go
我一直在尝试了解 Go 的内置测试框架并获得适当的测试覆盖率。
在我正在测试的文件之一中,我只获得了约 87% 的覆盖率:
coverage: 87.5% of statements
这是测试中涵盖的代码部分:
// Check that the working directory is set
if *strctFlags.PtrWorkDir == "" {
// if the working directory is empty, set it to the current directory
strTemp, err := os.Getwd()
if err != nil {
return "", errors.New("Could not get current working directory")
}
*strctFlags.PtrWorkDir = strTemp
} else if stat, err := os.Stat(*strctFlags.PtrWorkDir); err != nil ||
!stat.IsDir() {
// Existence check of the work dir
return "", errors.New("Specified directory \"" + *strctFlags.PtrWorkDir + "\" could not be found or was not a directory")
}
*strctFlags.PtrWorkDir, err = filepath.Abs(*strctFlags.PtrWorkDir)
if err != nil {
return "", errors.New("Could not determine absolute filepath: " + err.Error())
}
Run Code Online (Sandbox Code Playgroud)
根据 .out 文件,测试中未涵盖的部分是“if err != nil {}”块,这将是从标准库调用返回的错误。
虽然我认为除非出现硬件故障,否则标准库传递错误的可能性很小,但我认为知道错误在应用程序中得到正确处理会很好。此外,根据我的理解,检查返回的错误是惯用的 Go,所以我认为能够正确测试错误处理会很好。
人们如何处理上述情况的测试错误?是否有可能获得 100% 的覆盖率,或者我是否在做或构造错误的东西?或者人们是否跳过测试这些条件?
正如@flimzy 在他的回答中解释的那样,以 100% 的覆盖率为目标而不是以有用的测试覆盖率为目标是不好的。
尽管您可以像这样对代码稍作修改来测试系统调用
package foo
// Get Working directory function
var osGetWd = os.Getwd
func GetWorkingDirectory() (string,error){
strTemp, err := osGetWd() // Using the function defined above
if err != nil {
return "", errors.New("Could not get current working directory")
return strTemp,nil
}
Run Code Online (Sandbox Code Playgroud)
并且在测试时
package foo
func TestGetWdError() {
// Mocked function for os.Getwd
myGetWd := func() (string,error) {
myErr := errors.New("Simulated error")
return "",myErr
}
// Update the var to this mocked function
osGetWd = myGetWd
// This will return error
val,err := GetWorkingDirectory()
}
Run Code Online (Sandbox Code Playgroud)
这将帮助您实现 100% 的覆盖率
| 归档时间: |
|
| 查看次数: |
1182 次 |
| 最近记录: |