为确保 go 代码的正确运行,请遵循以下单元测试最佳实践:为每个函数编写一个测试(1);使用 mock 和 stub 模拟外部依赖关系(2);使用表格驱动测试验证多种输入(3);遵循行为驱动开发(bdd)(4);使用测试覆盖率工具(5)。
Go 单元测试的最佳实践
单元测试是确保代码正确运行的至关重要的实践。Go 为编写和运行单元测试提供了广泛的支持。以下是 Go 单元测试的最佳实践:
- 为每个函数编写一个测试:每个函数都应该至少有一个测试,验证其正确行为。
- 使用 mock 和 stub 模拟外部依赖关系:mock 和 stub 可防止意外调用外部依赖关系,确保测试只验证你想要的内容。
- 使用表格驱动测试验证多种输入:表格驱动测试允许您使用一个测试函数,针对多个输入验证行为。这简化了测试多个预期情况的任务。
- 遵循 BDD (行为驱动开发):BDD 将业务需求转化为测试,增强了测试的可读性和可维护性。
- 使用测试覆盖率工具:测试覆盖率工具衡量了您的测试对代码库的覆盖程度,帮助识别未覆盖的代码路径。
实战案例
立即学习“go语言免费学习笔记(深入)”;
考虑以下函数,用于计算字符串中元音的个数:
func CountVowels(s string) int {
vowels := "aeiouAEIOU"
var count int
for _, letter := range s {
if strings.Contains(vowels, string(letter)) {
count++
}
}
return count
}
相应的单元测试如下:
import (
"testing"
"strings"
)
func TestCountVowels(t *testing.T) {
// 测试用例
tests := []struct {
input string
want int
}{
{"hello", 2},
{"WORLD", 3},
{"aeiou", 5},
{"bcdfghjklmnpqrstvwxyz", 0},
}
// 遍历测试用例
for _, tt := range tests {
t.Run(tt.input, func(t *testing.T) {
got := CountVowels(tt.input)
if got != tt.want {
t.Errorf("CountVowels(%q) = %d, want %d", tt.input, got, tt.want)
}
})
}
}