每次测试在 golang 中 运行 如何获得不同的 UUID?
How to get different UUID each time a test is run in golang?
我有一个集成测试,每次 运行 时都需要一个 不同的 UUID,但是下面的代码会生成 相同的 [=21] =] uuid 每次.
package service
import (
"fmt"
"testing"
"github.com/google/uuid"
)
func TestOne(t *testing.T) {
id, _ := uuid.NewRandom()
fmt.Println(id)
}
Go Playground 中有类似的代码:https://play.golang.org/p/85yecbn4F80
如何在每次执行时将其设置为 return 一个新值?
正如用户在评论中指出的那样,Go playground 中的输出已被缓存。如果在他们自己的命令行上尝试此操作,则会在每个 运行.
上打印一个新的 UUID
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
id, _ := uuid.NewRandom()
fmt.Println(id)
}
和
$ go run .
604f5ea8-d146-4aac-9a15-4dc33a84eb59
$ go run .
3bc094cf-99c8-4250-98a0-9831fdadedac
$ go run .
b0c13db3-e466-4b5c-a179-e0a16469f11a
无论如何,可以通过更改脚本(例如,添加或修改注释)使 Go playground 缓存失效。这将导致生成新的 UUID。
将使用 playground 的问题的可重复性放在一边,因为你的问题是专门关于测试的,为了完整起见,我将在现有答案中添加命令 go test
缓存结果——尽管它并不总是如此(见下文)。我不使用 VSCode,所以我无法判断 IDE 本身 是否做了一些缓存,但考虑一下如果你 运行从命令行使用 uuid.NewRandom()
进行单元测试,测试通过,第二次 运行 ,打印输出也将相同。
特别是,go test
在(引用)“使用显式包参数调用时缓存成功结果”。 ./...
和 .
是包参数。
所以如果你有:
func TestUUID(t *testing.T) {
u, err := uuid.NewRandom()
fmt.Println(u)
assert.Nil(t, err)
}
和运行 go test -v ./uuidtest/
:
=>$ go test -v ./uuidtest/
=== RUN TestUUID
b1a912ea-0dd2-4ed6-a5af-00ce106b1017
--- PASS: TestUUID (0.00s)
PASS
ok testproj/uuidtest 0.025s
=>$ go test -v ./uuidtest/
=== RUN TestUUID
b1a912ea-0dd2-4ed6-a5af-00ce106b1017
--- PASS: TestUUID (0.00s)
PASS
ok testproj/uuidtest (cached)
=>$ go test -v ./uuidtest/
=== RUN TestUUID
b1a912ea-0dd2-4ed6-a5af-00ce106b1017
--- PASS: TestUUID (0.00s)
PASS
ok testproj/uuidtest (cached)
顺便说一句,终端输出很好地提醒你结果确实是 (cached)
。
要避免成功缓存,您可以将参数 count=1
添加到命令调用中:go test -v ./uuidtest/ -count=1
我有一个集成测试,每次 运行 时都需要一个 不同的 UUID,但是下面的代码会生成 相同的 [=21] =] uuid 每次.
package service
import (
"fmt"
"testing"
"github.com/google/uuid"
)
func TestOne(t *testing.T) {
id, _ := uuid.NewRandom()
fmt.Println(id)
}
Go Playground 中有类似的代码:https://play.golang.org/p/85yecbn4F80
如何在每次执行时将其设置为 return 一个新值?
正如用户在评论中指出的那样,Go playground 中的输出已被缓存。如果在他们自己的命令行上尝试此操作,则会在每个 运行.
上打印一个新的 UUIDpackage main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
id, _ := uuid.NewRandom()
fmt.Println(id)
}
和
$ go run .
604f5ea8-d146-4aac-9a15-4dc33a84eb59
$ go run .
3bc094cf-99c8-4250-98a0-9831fdadedac
$ go run .
b0c13db3-e466-4b5c-a179-e0a16469f11a
无论如何,可以通过更改脚本(例如,添加或修改注释)使 Go playground 缓存失效。这将导致生成新的 UUID。
将使用 playground 的问题的可重复性放在一边,因为你的问题是专门关于测试的,为了完整起见,我将在现有答案中添加命令 go test
缓存结果——尽管它并不总是如此(见下文)。我不使用 VSCode,所以我无法判断 IDE 本身 是否做了一些缓存,但考虑一下如果你 运行从命令行使用 uuid.NewRandom()
进行单元测试,测试通过,第二次 运行 ,打印输出也将相同。
特别是,go test
在(引用)“使用显式包参数调用时缓存成功结果”。 ./...
和 .
是包参数。
所以如果你有:
func TestUUID(t *testing.T) {
u, err := uuid.NewRandom()
fmt.Println(u)
assert.Nil(t, err)
}
和运行 go test -v ./uuidtest/
:
=>$ go test -v ./uuidtest/
=== RUN TestUUID
b1a912ea-0dd2-4ed6-a5af-00ce106b1017
--- PASS: TestUUID (0.00s)
PASS
ok testproj/uuidtest 0.025s
=>$ go test -v ./uuidtest/
=== RUN TestUUID
b1a912ea-0dd2-4ed6-a5af-00ce106b1017
--- PASS: TestUUID (0.00s)
PASS
ok testproj/uuidtest (cached)
=>$ go test -v ./uuidtest/
=== RUN TestUUID
b1a912ea-0dd2-4ed6-a5af-00ce106b1017
--- PASS: TestUUID (0.00s)
PASS
ok testproj/uuidtest (cached)
顺便说一句,终端输出很好地提醒你结果确实是 (cached)
。
要避免成功缓存,您可以将参数 count=1
添加到命令调用中:go test -v ./uuidtest/ -count=1