摘要:单元测试和代码覆盖率提高了 go 代码的质量和可维护性。单元测试使用 go 的 testing 包,而代码覆盖率使用 cover 包。单元测试涉及定义输入、预期输出并比较结果。代码覆盖率追踪代码中执行的语句或分支的百分比。实战示例展示了如何使用单元测试和代码覆盖率分析 calculatefibonacci() 函数。
Golang 架构单元测试与代码覆盖率
介绍
单元测试对于确保代码的准确性和健壮性至关重要。在 Go 应用程序中实现单元测试和代码覆盖率可以提高代码质量和可维护性。
单元测试
-
使用 Go 的 testing 包
package mypkg import "testing" func TestMyFunc(t *testing.T) { // 定义输入和预期输出 input := 5 expected := 10 // 调用函数并比较结果 result := myFunc(input) if result != expected { t.Errorf("myFunc(%d) = %d, want %d", input, result, expected) } }
代码覆盖率
使用 Go 的 cover 包
// package main import ( "coverage" "log" "os" ) var coverProfile string func init() { coverProfile = os.Getenv("COVER_PROFILE") if coverProfile != "" { err := coverage.Start(coverage.CoverageOptions{ CoverProfile: coverProfile, }) if err != nil { log.Fatalf("Coverage Error: %vn", err) } defer coverage.Stop() } } func main() { log.Println("Hello, World!") }
实战案例
考虑一个简单的 CalculateFibonacci() 函数,它计算一个给定正整数的斐波那契数。
单元测试
// package mypkg
import (
"fmt"
"testing"
)
func TestCalculateFibonacci(t *testing.T) {
// 定义测试用例
testCases := []struct {
input int
expected int
}{
{0, 0},
{1, 1},
{2, 1},
{3, 2},
{4, 3},
}
// 运行测试用例
for _, testCase := range testCases {
result := CalculateFibonacci(testCase.input)
if result != testCase.expected {
t.Errorf(
"CalculateFibonacci(%d) = %d, want %d",
testCase.input,
result,
testCase.expected,
)
}
fmt.Printf(
"Test Passed: CalculateFibonacci(%d) = %dn",
testCase.input,
result,
)
}
}
代码覆盖率
// package mypkg
// import "coverage"
var (
cov *coverage.Coverage
)
// func init() {}
func CalculateFibonacci(n int) int {
if n == 0 || n == 1 {
return n
}
// 计算分支覆盖率
if cov != nil {
cov.Line(18)
}
return CalculateFibonacci(n-1) + CalculateFibonacci(n-2)
}
可以通过运行 go test -cover 命令来生成代码覆盖率报告。