Golang Go语言中利用 snapshot 来简化测试代码

发布于 1周前 作者 sinazl 来自 Go语言

例如,当您想要锁定函数返回值的复杂结果时,通常需要在测试中放置一大段数据代码块,或者手动在单独的文件中维护代码块,这对于维护者来说可能会让他们阅读实际测试逻辑变得混乱。

例如,这里我们想要使用 testify 来检查 ast 解析器的输出:

package main_test

import ( “go/ast” “go/parser” “go/token” “testing”

"github.com/stretchr/testify/assert"

)

func TestSnapshot(t *testing.T) { exp, err := parser.ParseExpr("(1 + 2) * 3") assert.Nil(t, err)

assert.Equal(t, exp, &ast.BinaryExpr{
	X: &ast.ParenExpr{
		Lparen: token.Pos(1),
		X: &ast.BinaryExpr{
			X: &ast.BasicLit{
				ValuePos: token.Pos(2),
				Kind:     token.Token(5),
				Value:    "1",
			},
			OpPos: token.Pos(4),
			Op:    token.Token(12),
			Y: &ast.BasicLit{
				ValuePos: token.Pos(6),
				Kind:     token.Token(5),
				Value:    "2",
			},
		},
		Rparen: token.Pos(7),
	},
	OpPos: token.Pos(9),
	Op:    token.Token(14),
	Y: &ast.BasicLit{
		ValuePos: token.Pos(11),
		Kind:     token.Token(5),
		Value:    "3",
	},
})

}

使用 snapshot ,您的代码将变得更加清晰简洁:

package main_test

import ( “go/parser” “testing”

"github.com/ysmood/got"

)

func TestSnapshot(t *testing.T) { g := got.T(t)

exp, err := parser.ParseExpr("(1 + 2) * 3")
g.E(err)

g.Snapshot("ast", exp)

}

有关 snapshot 助手的文档: link

如果想要使用 json 作为快照文件: link


Golang Go语言中利用 snapshot 来简化测试代码

更多关于Golang Go语言中利用 snapshot 来简化测试代码的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

这是所谓的 golden test ,也就是用上次代码执行的结果来 assert 下次代码执行,和普遍意义的单元测试不是一回事儿

更多关于Golang Go语言中利用 snapshot 来简化测试代码的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


并不是用上次代码执行的结果来 assert 下次代码执行。
一旦结果创建了,就不会再被覆盖了,除非你手动修改文件。这个在单元测试里很常见,很多测试框架都有 snapshot 的功能,你可以 google 下关键字。

不只是用来锁定结果保持不变。比如对于输出复杂的测试,可以先输出一个结果然后再修改 snapshot 文件到希望最终呈现的状态,再调试代码问题让输出跟 snapshot 一致。这样就不用手动写非常复杂的期望值了。

对,用快照来比对运行结果是常规测试方法。一般用在集成测试或 e2e

在Go语言中,利用snapshot(快照)来简化测试代码是一种非常有效的方法,特别是在处理复杂数据结构或状态时。快照测试允许我们在测试开始时记录一个期望的状态(即快照),然后在测试结束时将其与实际状态进行比较。这种方法的主要优点是它减少了编写和维护详细断言代码的需要,使测试更加直观和易于维护。

要实现快照测试,通常需要一个快照库,比如gotestsum结合gotestsum-snapshot插件,或者testify/assert库中的类似功能(尽管testify本身不直接提供快照功能,但可以通过扩展实现)。这些库能够捕捉和比较复杂的数据结构,包括嵌套的结构体、切片、映射等。

使用快照测试时,你需要在测试代码中指定何时捕获快照(通常在设置测试环境后)以及何时验证快照(通常在执行测试逻辑后)。在首次运行时,快照库会生成一个期望的快照文件。在后续运行中,它会将实际结果与这个快照进行比较。

需要注意的是,快照测试虽然简化了测试代码的编写,但也可能掩盖一些细微的变化。因此,在使用快照测试时,建议定期审查和更新快照,以确保它们仍然反映期望的状态。此外,对于涉及随机数据或时间戳的测试,可能需要额外的处理来确保快照的一致性和可重复性。

总之,快照测试是Go语言中一种强大的测试策略,能够显著提高测试代码的效率和可维护性。

回到顶部