登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  Golang >  Go问答

Go testing.T.ArtifactDir 怎样保存失败测试的现场文件

来源:17golang原创

时间:2026-11-03 00:42:02 196浏览 收藏

如果测试失败后只剩一行断言信息,排查往往还缺请求样本、序列化结果或中间文件。Go 1.26 起,可以用 testing.T.ArtifactDir 为当前测试或子测试取得专属产物目录,把现场文件写进去;运行时再配合 -artifacts 和 -outputdir,这些文件就能留在指定输出目录中。

官方文档:https://pkg.go.dev/testing#T.ArtifactDir

关键点是:ArtifactDir 负责给出目录,-artifacts 决定是否把目录放到输出目录而不是临时目录。它不是测试断言,也不会替你上传 CI 产物。

testing.T、ArtifactDir、测试或子测试、现场文件与临时目录的静态关系说明图
图1:结构说明图,查看 ArtifactDir 的调用对象、产物目录和持久化边界。

ArtifactDir 解决的是什么问题

过去常见的做法是手写临时目录,或者把调试文件直接写到当前工作目录。前者需要自己管理命名和归属,后者容易被并行测试互相覆盖。ArtifactDir 把目录归属交给测试框架:每个测试或子测试有独立目录,同一个测试里重复调用会得到同一个目录,子测试也不会把产物混进父测试目录。

官方文档还明确了版本和生命周期:T.ArtifactDir 是 Go 1.26 新增能力;不传 -artifacts 时,目录是测试完成后会删除的临时目录。也就是说,调用 API 不等于自动保留现场。

用 t.ArtifactDir 写入失败现场

把现场写入目录时,建议使用稳定文件名,并检查创建和写入错误。下面的例子保存一份响应正文,文件名只由当前测试逻辑决定,不把个人路径、密钥或 Token 写进产物。

package report_test

import (
    "os"
    "path/filepath"
    "testing"
)

func TestExport(t *testing.T) {
    // ArtifactDir 按当前测试分配独立目录,避免并行测试共用现场路径。
    dir := t.ArtifactDir()
    body := []byte(`{"status":"failed","reason":"sample mismatch"}`)

    // 现场文件写入测试产物目录;权限只给当前用户读写。
    path := filepath.Join(dir, "response.json")
    if err := os.WriteFile(path, body, 0o600); err != nil {
        t.Fatalf("写入测试现场失败: %v", err)
    }
}

这个目录可以写 JSON、文本日志或脱敏后的请求样本。若现场内容来自外部输入,仍要控制大小并先做脱敏;ArtifactDir 只解决目录隔离,不改变文件内容的安全责任。

用 -artifacts 保留失败现场

本地临时目录适合短时排查,但 CI 需要把文件带出测试进程。Go 官方的做法是传入 -artifacts,再用 -outputdir 指定输出根目录:

# 把测试产物集中放到仓库外的目录,便于 CI 收集。
go test -run TestExport -artifacts -outputdir ./test-artifacts ./...

在这个组合下,测试框架会把各测试的 ArtifactDir 放到输出目录下;官方文档还说明,首次调用 ArtifactDir 时会把目录位置写进测试日志。不同测试包、测试名称和子测试会形成不同的目录归属,CI 只需要收集 test-artifacts。

go test 的 artifacts 与 outputdir 参数将测试现场文件放入 CI 产物目录的依赖说明图
图2:依赖说明图,查看 go test 参数如何决定测试现场文件的落点。

和 TempDir 怎么区分

t.TempDir() 适合测试过程中的临时输入、缓存和中间文件,测试完成后会清理;t.ArtifactDir() 面向希望作为测试产物查看的输出文件。默认情况下 ArtifactDir 同样是临时目录,只有 -artifacts 才把它切换到输出根目录下。

因此可以这样选择:

需求选择原因
构造输入,测试后不再看t.TempDir()生命周期短,适合隔离中间文件
保存失败响应、诊断日志t.ArtifactDir()按测试归属,配合 -artifacts 可交给 CI
同一测试多次取目录重复调用 ArtifactDir返回同一个测试专属目录

常见问题

为什么调用了 ArtifactDir,测试结束后文件还是没了? 因为没有传 -artifacts,此时官方语义是临时目录,测试完成后会删除。

子测试能否直接复用父测试的目录? 不建议这样设计。每个测试或子测试都有独立产物目录,按当前测试对象调用即可,避免现场文件互相覆盖。

ArtifactDir 会自动上传 CI 文件吗? 不会。它只负责目录位置;CI 仍需把 -outputdir 对应目录配置为产物收集路径。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>