Go调试测试笔记总结| 青训营

59 阅读2分钟

简介

测试在软件开发中起到至关重要的作用,它确保了代码的质量和功能的正确性。Go语言为开发者提供了一个内置的、功能丰富的测试框架,用于进行单元测试和基准测试。下面我就以课程为框架总结了一下笔记

单元测试

  • 规则

    • 测试文件以_test.go结尾。
    • 测试函数以Test开头,接着是首字母大写的函数名称,例如TestFunctionName
    • 测试函数的签名为:func TestXxx(t *testing.T)
  • 示例

    func TestSum(t *testing.T) {
        result := Sum(2, 3)
        if result != 5 {
            t.Errorf("Expected 5, but got %d", result)
        }
    }
    
  • 运行: 使用go test命令运行当前包的所有测试。可以通过go test ./...运行当前目录及其子目录中的所有测试。

  • 覆盖率: 使用go test -cover来检查测试的覆盖率。

  • 依赖和Mock

    1. 定义接口

      假设我们有以下的服务接口:

      type StorageService interface {
          Store(data string) error
      }
      
    2. 使用接口的函数

      func SaveImportantData(s StorageService, data string) error {
          if data == "" {
              return fmt.Errorf("no data provided")
          }
          return s.Store(data)
      }
      
    3. Mock生成

      使用gomock等库,我们可以生成模拟的存储服务。首先,需要安装gomockmockgen工具。然后,我们可以使用mockgen为上述接口生成模拟。

    4. 测试使用Mock

      使用生成的mock,我们可以编写单元测试,模拟存储服务的行为:

      func TestSaveImportantData(t *testing.T) {
          ctrl := gomock.NewController(t)
          defer ctrl.Finish()
      
          mockStorage := NewMockStorageService(ctrl)
          mockStorage.EXPECT().Store("test_data").Return(nil)
      
          err := SaveImportantData(mockStorage, "test_data")
          if err != nil {
              t.Errorf("Unexpected error: %v", err)
          }
      }
      

基准测试

  • 示例

    func BenchmarkSum(b *testing.B) {
        for i := 0; i < b.N; i++ {
            Sum(4, 9)
        }
    }
    
  • 运行: 使用go test -bench .命令运行基准测试。注意,.表示运行所有基准测试,但可以更明确地指定特定的测试。

总结:

Go的测试框架简单而强大,使开发者能够方便地为代码编写测试,确保其质量和性能。单元测试帮助我们验证代码的逻辑正确性,而基准测试则帮助我们衡量代码的性能。Mock和接口为测试提供了灵活性和控制权,让我们可以轻松地模拟和验证代码中的各种情况,这提高了我们测试时对代码的理解。