掌握Golang中`go test`的优秀学习资源

掌握Golang中go test的优秀学习资源 大家好,

能否分享一些掌握 go test*_test.go 的优秀资源?

我只知道 go test 用于检查错误和进行基准测试。

但我认为它的功能远不止于此,还有更多用途。

因此请分享您关于以下方面的有用知识:

  1. 什么是 go test
  2. 如何创建测试文件?
  3. 为什么要进行测试?
  4. 我没有得到任何输出,如何确认“我的代码没问题”?
2 回复

这些问题涉及面太广,难以全面回答,因此我将仅针对每个问题提供概括性说明。

  • go test 是用于运行在 _test.go 文件中定义测试的命令。它帮助您使用 testing 包,该包的文档位于:https://golang.org/pkg/testing/
  • 您需要按以下格式创建测试文件:yourname_test.go。Go 会默认所有以 _test.go 结尾的文件都应包含测试代码
  • 测试代码的主要原因是在代码进入生产环境前发现开发阶段的问题。测试也可用于优化目的,比如基准测试
  • 编写测试时,您需要借助 testing 包添加失败条件。当满足任何失败条件时,您将获得输出。还可以通过 verbose 模式运行测试来获取更详细输出,但首要步骤是实际编写一些会失败的测试

测试可以根据需要设计得简单或复杂。以下是一个针对自定义整数加法函数的简单测试示例。为清晰起见,这个示例写得较为详细,如有错误敬请谅解。TestAddition 应放在 _test.go 文件中。

func TestAddition(t *testing.T) {
	    addend1 := 2
        addend2 := 2 
        expectedAnswer := 4
        myAnswer := myCustomAddFunc(addend1, addend2)
        if myAnswer != expectedAnswer {
	        t.Errorf("Expected %d, got %d", expectedAnswer, myAnswer)
        }
}

如果测试失败,您将收到上述 t.Errorf() 中的错误输出(针对您的问题 #4)。通过使用 -v 参数,您还可以获得通过的测试用例名称而不仅仅是失败用例的输出。

但仅测试一组加数并不够可靠,对吧?如果您的自定义函数实际接收 ...int 参数以便一次性相加多个整数,而您也想测试这种情况呢?您可以为每个测试用例创建类似上面的新测试函数,或者使用表驱动测试来针对不同数据集测试代码。示例:

func TestAddition(t *testing.T) {
	// 定义测试用例:
	testCases := []struct {
		addends []int
		expectedAnswer int
	}{
		{[]int{2,2}, 4},
		{[]int{1,1,1,1}, 4},
		{[]int{-1,0}, -1},
		{[]int{1}, 1},
	}

	// 遍历每个定义的测试用例
	for _, tc := range testCases {
		// 运行测试!第一个参数是测试名称,可以是任意字符串
		t.Run(fmt.Sprintf("%v", tc.addends), func(t *testing.T) {
			myAnswer := myCustomAddFunc(tc.addends...)
			if myAnswer != tc.expectedAnswer {
				t.Errorf("Expected %d, got %d", tc.expectedAnswer, myAnswer)
			}
		})
	}
}

通过这种方式,您可以添加任意数量的测试用例,而无需重写其余测试代码。

这个回答甚至没有触及 go test 的皮毛。我建议从上面链接的 testing 包文档开始学习。您还可以在此处阅读更多关于表驱动测试/子测试的内容:https://blog.golang.org/subtests

更多关于掌握Golang中`go test`的优秀学习资源的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是针对您关于Golang中go test问题的专业解答,我将逐一回答您的四个问题,并提供示例代码以帮助理解。

1. 什么是 go test

go test是Go语言内置的测试工具,用于运行以*_test.go文件编写的测试代码。它支持单元测试、基准测试和示例测试。通过go test,您可以自动发现并执行测试函数,验证代码的正确性、性能以及输出示例。

示例:假设您有一个简单的Go包,包含一个math.go文件:

// math.go
package math

func Add(a, b int) int {
    return a + b
}

对应的测试文件math_test.go

// math_test.go
package math

import "testing"

func TestAdd(t *testing.T) {
    result := Add(2, 3)
    expected := 5
    if result != expected {
        t.Errorf("Add(2, 3) = %d; expected %d", result, expected)
    }
}

运行go test命令将执行TestAdd函数,并报告测试结果。

2. 如何创建测试文件?

测试文件必须命名为*_test.go(例如math_test.go),并位于与被测试代码相同的包中。在测试文件中,使用testing包定义测试函数,函数名以Test开头(用于单元测试)、Benchmark开头(用于基准测试)或Example开头(用于示例测试)。

示例:创建一个测试文件来测试上述Add函数。

// math_test.go
package math

import "testing"

func TestAdd(t *testing.T) {
    tests := []struct {
        a, b, expected int
    }{
        {1, 2, 3},
        {0, 0, 0},
        {-1, 1, 0},
    }
    for _, test := range tests {
        result := Add(test.a, test.b)
        if result != test.expected {
            t.Errorf("Add(%d, %d) = %d; expected %d", test.a, test.b, result, test.expected)
        }
    }
}

运行go test -v可以查看详细的测试输出,包括每个测试用例的结果。

3. 为什么要进行测试?

测试是软件开发的关键部分,用于确保代码按预期工作,防止回归错误,并提高代码质量。在Go中,测试帮助验证函数逻辑、边界条件和性能。通过自动化测试,您可以快速检测代码更改是否引入错误。

示例:在math_test.go中添加一个基准测试来评估Add函数的性能。

// math_test.go
package math

import "testing"

func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add(1, 2)
    }
}

运行go test -bench=.将执行基准测试并输出每次操作的执行时间。

4. 我没有得到任何输出,如何确认“我的代码没问题”?

如果运行go test没有输出,通常表示所有测试通过。默认情况下,go test只在测试失败或使用-v标志时输出详细信息。要确认代码没问题,请检查测试覆盖率或使用-v标志查看测试执行。

示例:运行测试并检查覆盖率。

  • 运行go test -cover:输出测试覆盖率百分比。
  • 运行go test -v:输出每个测试函数的详细结果。

如果所有测试通过且覆盖率足够高(例如,通过go test -coverprofile=coverage.out生成覆盖率报告,然后使用go tool cover -html=coverage.out查看详细覆盖),则代码很可能没问题。

示例代码:假设您有一个更复杂的函数,并希望确保高覆盖率。

// math.go
package math

func Multiply(a, b int) int {
    return a * b
}

math_test.go中添加测试:

// math_test.go
package math

import "testing"

func TestMultiply(t *testing.T) {
    result := Multiply(3, 4)
    expected := 12
    if result != expected {
        t.Errorf("Multiply(3, 4) = %d; expected %d", result, expected)
    }
}

运行go test -cover,如果输出类似coverage: 100.0% of statements,则表明测试覆盖了所有代码路径。

总之,go test是一个强大的工具,通过编写全面的测试用例,您可以确保代码的可靠性和性能。建议参考官方Go文档(如“Testing”章节)和社区资源(如Go博客或GitHub上的示例项目)来深入学习。

回到顶部