我们使用 Equal 方法编写了我们的婴儿单元测试,该方法具有下面指定的签名并来自 testify 包。

func Equal(t TestingT, expected, actual interface{}) bool

我们可以用相同的逻辑测试上面的参数函数。

在某些情况下,我们希望使用多个测试用例来测试我们的参数函数。 我们基本上可以使用 for 循环来编写这个测试,方法是创建一个带有必要参数的测试用例结构来调用我们的 Add 函数。

我们可以使用表驱动测试策略来实现此功能,而不是使用基本的 for 循环。 我们将在下一节中看到这个实现。

子测试(多次 t.Run)

我们可以使用 GoLand 创建表驱动测试,如下所示。

根据这些信息,我们重新实现了我们的 Add 函数测试,如下所示。

使用该策略,我们可以单独运行我们的测试用例。但是,为了使用该功能,我们必须在 TestCase 结构中定义 name 变量并将其作为第一个参数传递给 t.Run(test.name,...)。

测试 HTTP 处理程序

处理程序(控制器):他们负责执行您的应用程序逻辑并编写 HTTP 响应标头和正文。

在 Go 中,借助 net/http/httptest 包,我们可以轻松地测试 HTTP 处理程序,而无需进行集成测试。当我们检查这个包时,http.ResponseWriter 接口所需的所有方法都在 httptest.ResponseRecorder 中实现。要查看 httptest.ResponseRecorder 结构,您可以查看文档。 httptest.ResponseRecorder 本质上是一个实现 http.ResponseWriter ,它记录响应状态代码、标头和正文,而不是实际将它们写入 HTTP 连接。简而言之,httptest.ResponseRecorder 是一个 http.ResponseWriter 实现,它记录其突变以供以后在测试中检查。

因此,对处理程序进行单元测试的一种简单方法是创建一个新的 httptest.ResponseRecorder 结构,将其传递给处理程序函数,然后在处理程序返回后再次检查它。 在我们的示例中,我们根据上面提到的信息创建 req 和 rec 并将它们传递给我们的 GreetingAPI。 我们收到的数据将用于比较预期数据以测试我们的句柄功能,这些数据将来自 rec.Body。

感谢您的阅读! 不要忘记:

“单元测试中最困难的部分是以最低的维护成本实现最大价值。”