golang中的单元测试

时间:2016-11-18 15:49:50

标签: unit-testing go

我目前正在考虑为Go中的服务创建一些单元测试,以及在该功能之上构建的其他功能,我想知道什么是单元测试的最佳方式在Go?我的代码如下:

foreach

测试此代码的最有效方法是使用这些函数来启动单独的goroutine以像服务器一样运行,使用http.httptest包,还是其他什么?那是我第一次尝试写测试然后我不知道如何。

1 个答案:

答案 0 :(得分:1)

这完全取决于。 Go提供了在每个级别测试应用程序所需的几乎所有工具。

单元测试

设计很重要,因为动态提供模拟/存根对象的技巧并不多。您可以覆盖测试的变量,但它可以解决清理中的各种问题。我将专注于IO免费单元测试,以检查您的特定逻辑是否有效。

例如,您可以通过使BBPeripheral.Get成为接口来测试client方法,在实例化期间需要它,并为测试提供存根。

func Test_BBPeripheral_Get_Success(*testing.T) {
  bb := BBPeripheral{client: &StubSuccessClient, ...}
  p, err := bb.Get(...) 
  if err != nil {
     t.Fail()
  }
}

然后,您可以创建一个存根错误客户端,在Get方法中执行错误处理:

func Test_BBPeripheral_Get_Success(*testing.T) {
  bb := BBPeripheral{client: &StubErrClient, ...}
  _, err := bb.Get(...) 
  if err == nil {
     t.Fail()
  }
}

组件/集成测试

这些测试有助于锻炼包装中的每个单元可以协同工作。由于您的代码通过http进行讨论,因此Go提供了可以使用的httptest包。

为此,测试可以创建一个httptest服务器,其中注册了一个处理程序以提供this.endpoint期望的响应。然后,您可以通过请求NewBBPeripheral,传入与Server.URL属性相对应的this.endpoint来使用其公共界面来运用您的代码。

这允许您模拟与真实服务器通信的代码。

进行常规测试

Go使得编写并发代码变得如此简单,并且使其易于测试。测试产生NewBBPeripheral的go例程的顶级代码看起来非常像上面的测试。除了启动测试服务器之外,您的测试还必须等待异步代码完成。如果您没有服务范围的取消/关闭/信号完成,则可能需要使用go例程对其进行测试。

RaceCondition /负载测试

使用go的内置bechmark测试结合-race标志,您可以轻松地运用您的代码,并根据竞争条件对其进行分析,并利用您在上面编写的测试。

要记住的一件事是,如果您的应用程序的实现仍然不稳定,编写单元测试可能会花费大量时间。创建一些运行代码公共接口的测试应该可以让您轻松验证应用程序是否正常工作,同时允许实现更改。