在构建此 API 时,我们涵盖了身份验证、日志记录、Docker 化等内容。但我们还没有讨论的一件事是测试!如果您希望 API 能够投入生产,那么添加可靠的单元测试至关重要。在这篇文章中,我们将介绍 Go 中单元测试的基础知识,以便您可以及早发现错误并交付高质量的代码。
单元测试可帮助您验证代码库的每个部分是否按预期工作。它们是您抵御错误、回归和其他令人讨厌的意外情况的第一道防线。使用 Go 的内置测试库,您可以快速设置测试:
准备好开始了吗?让我们深入了解一下! ?
Go 的测试框架很简单并且直接集成到语言中。您可以通过使用 _test.go 后缀命名来创建测试文件。让我们首先测试 main.go 中的一个简单函数:
// main.go package main func Add(a, b int) int { return a b }
现在,创建一个名为 main_test.go 的文件并添加以下代码:
// main_test.go package main import "testing" func TestAdd(t *testing.T) { result := Add(2, 3) expected := 5 if result != expected { t.Errorf("Add(2, 3) = %d; want %d", result, expected) } }
要运行测试,只需使用:
go test
如果一切正常,您将看到一条 ok 消息。 ?
现在,让我们为我们的 HTTP 处理程序之一编写一个测试。我们将使用 Go 的 httptest 包来创建模拟 HTTP 请求和响应记录器。
// main_test.go package main import ( "net/http" "net/http/httptest" "testing" ) func TestGetBooksHandler(t *testing.T) { req, err := http.NewRequest("GET", "/books", nil) if err != nil { t.Fatal(err) } rr := httptest.NewRecorder() handler := http.HandlerFunc(getBooks) handler.ServeHTTP(rr, req) if status := rr.Code; status != http.StatusOK { t.Errorf("handler returned wrong status code: got %v want %v", status, http.StatusOK) } }
这样,您可以隔离和测试您的处理程序,而无需启动完整的服务器。 ?
Go 有一种内置的方法来检查测试覆盖率。要查看测试覆盖了代码的百分比,您可以运行:
go test -cover
如需更详细的报道,请生成 HTML 报告:
go test -coverprofile=coverage.out go tool cover -html=coverage.out
打开生成的 HTML 文件以可视化覆盖了代码的哪些部分。这是查看哪里可能需要额外测试的绝佳方法。
当测试依赖于外部服务的功能(例如数据库或外部API调用)时,您可以使用接口来模拟这些依赖关系。
// Define a simple interface for our database type Database interface { GetBooks() ([]Book, error) } // Implement a mock database type MockDatabase struct{} func (m MockDatabase) GetBooks() ([]Book, error) { return []Book{{Title: "Mock Book"}}, nil }
通过使用接口,您可以在测试过程中用您的模拟替换实际的依赖关系。这可以让您的测试快速、隔离且可重复。
既然您已经开始构建单元测试,请尝试将测试添加到 API 的其他部分! ?下周,我们将研究集成 CI/CD 管道,以便这些测试可以在每次更改时自动运行。敬请关注!
向您提问:您最喜欢的测试工具或技术是什么?请在下面发表评论——我很想听听其他 Go 开发人员如何进行测试!
有了这些基础知识,您就可以编写可靠的测试,使您的 Go API 更加可靠。有关更多测试技巧和高级技术,请继续关注未来的帖子。测试愉快! ?
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3