由于内置的testing
包,GO中的编写单元测试很简单。这是编写单元测试的分步方法:
foo.go
的源文件,在同一软件包中创建一个名为foo_test.go
的测试文件。写测试函数:inside foo_test.go
,写下从Test
开始的功能,然后是要测试的函数的名称。这些函数采用*testing.T
参数。例如:
<code class="go">func TestFoo(t *testing.T) { // Test code here }</code>
断言:使用t.Error
或t.Errorf
记录错误并使测试失败。如果重要的事情失败,则可以使用t.Fatal
或t.Fatalf
立即停止测试。
<code class="go">if result != expected { t.Errorf("expected %v, but got %v", expected, result) }</code>
go test
命令执行测试。go test -cover
。表驱动的测试:使用表驱动的方法来减少代码重复并有效测试多个方案。
<code class="go">func TestFoo(t *testing.T) { tests := []struct { input int expected int }{ {1, 2}, {2, 4}, {-1, -2}, } for _, tt := range tests { result := foo(tt.input) if result != tt.expected { t.Errorf("foo(%d) = %d, want %d", tt.input, result, tt.expected) } } }</code>
遵守GO编写单元测试的最佳实践可以显着提高测试的质量和可维护性。以下是一些关键实践:
TestFooReturnsDoubleOfInput
比TestFoo
更具描述性。并行测试:使用t.Parallel()
并行运行测试,这可以显着加快您的测试套件,尤其是对于大型项目。
<code class="go">func TestFoo(t *testing.T) { t.Parallel() // Test code here }</code>
在GO中进行嘲笑可以通过用受控的假物体替换其依赖项来帮助隔离测试的单元。这是您可以使用模拟来增强单元测试的方法:
选择一个模拟库:流行的GO模拟库包括GoMock
, testify/mock
和gomock
。例如,用testify/mock
:
<code class="go">import ( "testing" "github.com/stretchr/testify/mock" ) type MockDependency struct { mock.Mock } func (m *MockDependency) SomeMethod(input string) string { args := m.Called(input) return args.String(0) }</code>
设置期望:在执行测试的函数之前,请使用库的API设置模拟的预期行为。
<code class="go">mockDependency := new(MockDependency) mockDependency.On("SomeMethod", "input").Return("output")</code>
断言模拟呼叫:测试后,验证该模拟是否按预期拨打。
<code class="go">mockDependency.AssertCalled(t, "SomeMethod", "input")</code>
几种工具可以帮助您有效地管理和运行单元测试。这是一些受欢迎的清单:
go test
命令用途广泛,可以与各种标志一起使用以自定义测试执行。例如, go test -v
go test -coverprofile=coverage.out
生成覆盖范围报告。Gomega
一起用于比赛和断言。require
, assert
流利的主张,测试组织suite
以及模拟依赖的mock
。组合使用这些工具可以帮助简化测试过程,改善测试覆盖范围并使您的测试套件更加可维护和高效。
以上是您如何在GO中编写单元测试?的详细内容。更多信息请关注PHP中文网其他相关文章!