如何在Golang中捕获测试日志_使用t.Log记录测试过程

t.Log用于测试中输出不影响结果的日志,需加-v参数才可见,适合记录中间状态等;t.Errorf则标记测试失败但继续执行;t.Logf提供更灵活的格式化输出。

在 Go 的测试中,t.Log 是调试和理解测试执行过程的重要工具。它不会影响测试结果(无论成功或失败),但会在测试运行时输出日志信息,尤其在使用 go test -v 时可见。

什么时候用 t.Log?

适合记录测试中的中间状态、输入输出、关键分支判断等辅助信息,比如:

  • 函数调用前后的参数和返回值
  • 循环中每次迭代的变量值
  • 条件分支进入的具体路径(如 if err != nil 被触发时)
  • 模拟依赖行为时的“打点”日志(如 mock 数据生成)

t.Log 和 t.Errorf 的区别

t.Log 只是输出信息,不标记测试失败;而 t.Errorf 会记录错误并让测试以失败状态结束(但继续执行后续语句)。两者可共存:

示例:

func TestDivide(t *testing.T) {
    result, err := divide(10, 0)
    t.Log("尝试除零:", 10, "/", 0) // 总会打印
    if err != nil {
        t.Log("捕获到预期错误:", err) // 辅助说明
        t.Errorf("期望无错,但得到:%v", err) // 导致测试失败
    }
}

让日志真正可见:必须加 -v 参数

默认情况下,go test 不显示 t.Log 输出。要看到它们,需显式启用详细模式:

  • go test -v:显示所有测试函数名 + 其 t.Log 内容
  • go test -v -run=^TestDivide$:只运行并显示指定测试的日志
  • go test -v -failfast:遇到第一个失败就停,但仍显示已执行测试的日志

替代方案:t.Logf 格式化更灵活

当需要拼接字符串或格式化数值时,t.Logft.Log 更简洁:

  • t.Log("count:", i, "value:", v)
  • t.Logf("count: %d, value: %s", i, v) —— 更易读、支持类型格式化

注意:t.Logf 同样需要 -v 才可见,且不改变测试结果。