为 Go 框架编写单元测试时应避免的常见错误:不测试错误依赖于 DBMS 详情测试 Godoc 文档依赖于外部服务测试过于宽泛
为 Go 框架编写单元测试时应避免的常见错误
单元测试在维护可扩展、稳定和可靠的 Go 框架方面至关重要。然而,如果没有遵循最佳实践,单元测试可能会流于形式,甚至导致错误的信息。本文重点介绍为 Go 框架编写单元测试时应该避免的 5 个常见错误。
错误 1:不测试错误
func SomeFunc(input int) int { return input + 1 }
import "testing" func TestSomeFunc(t *testing.T) { if got := SomeFunc(0); got != 1 { t.Errorf("SomeFunc(0) = %d, want 1", got) } }
错误 2:依赖于 DBMS 详情
import "database/sql" func GetUsers(db *sql.DB) []User { rows, err := db.Query("SELECT * FROM users") if err != nil { return nil } // ...
func GetUsers(repo UserRepository) []User { rows, err := repo.Query("SELECT * FROM users") if err != nil { return nil } // ...
错误 3:测试 Godoc 文档
单元测试的目的是验证代码的功能,而不是测试文档是否准确。避免在单元测试中测试 Godoc 文档中的示例或描述。
错误 4:依赖于外部服务
import "net/http" func GetXKCDComic(id int) (*http.Response, error) { req, err := http.NewRequest("GET", fmt.Sprintf("https://xkcd.com/%d/info.0.json", id), nil) if err != nil { return nil, err } // ...
func GetXKCDComic(repo XKCDRepository, id int) (*http.Response, error) { req, err := repo.NewRequest("GET", fmt.Sprintf("https://xkcd.com/%d/info.0.json", id), nil) if err != nil { return nil, err } // ...
错误 5:测试过于宽泛
func TestSomeFunc(t *testing.T) { if got := SomeFunc(-1); got > 0 { t.Error("SomeFunc(-1) should be negative") } }
func TestSomeFunc(t *testing.T) { if got := SomeFunc(-1); got != -1 { t.Errorf("SomeFunc(-1) = %d, want -1", got) } }