我希望能够使用测试资源管理器或代码镜头在VS代码中运行和调试单元测试。
但是为了运行我的测试,我需要添加以下标志:
-ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn"
因此,在我的vscode settings.json文件中,添加了以下json:
"go.testFlags": [
"-ldflags",
"\"-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn\""
]
现在,当我在测试资源管理器或代码镜头中单击Run Test按钮时,VS code将生成以下命令:
/opt/homebrew/bin/go test -timeout 30s -run ^TestCreateNamespace$ github.com/SomePath/SomeRepo/internal/models/v2 -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn"
但是测试用例失败了,出现了以下错误:
panic: proto: extension number 1042 is already registered on message google.protobuf.FileOptions
See https://developers.google.com/protocol-buffers/docs/reference/go/faq#namespace-conflict
如果我在go测试命令中不支持-ldflags
,那么这正是我所期望的错误。但令人惊讶的是,当我复制上面提到的完全相同的vs代码生成的测试命令并在我的终端中运行它时,测试用例就会通过。
除了运行Vs代码中的测试之外,我还希望能够通过设置断点和逐步执行代码来调试它们。
开发环境:,如果这件事重要的话,我在arm64苹果M1 Mac上。
更新:在修改了go.testFlags
值之后,我发现:
run test
功能:"go.testFlags": [
"-ldflags",
"-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn"
]
debug test
功能:"go.testFlags": [
"-ldflags",
"'-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn'"
]
(注意调试配置中的额外单引号)。
现在,我需要找到一个同时适用于run test
和debug test
功能的配置,或者在vs代码的settings.json
文件中为run test
和debug test
指定两种不同的配置,这样我就可以使用这两种功能,而无需每次更改settings.json
文件。(我怀疑这可能是件令人费解的事情)
发布于 2022-09-15 09:03:50
我不能代表VS代码,但是当涉及到调试测试时,这些测试需要更复杂的步骤(例如,godog黄瓜风格的测试),我通常会编译测试二进制代码,如下所示:
go test -c -gcflags="all=-N -l"
您可以用go test -c
替换go build
,所以我不明白为什么您不能简单地使用
go test -c -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn" -gcflags="all=-N -l"
然后,您可以以无头模式启动dlv
会话,供编辑器连接。假设go test -c
生成了一个名为"foo.test“的二进制文件
dlv exec ./foo.test --headless --listen=:2345 --log --api-version=2 -- -count=1 -- $(pwd)/some/path
如果-count=1
是通常传递给go test
的标志的占位符,那么-- $(pwd)/some/path
可以是一个.feature
文件的路径(如果您有黄瓜样式测试的话)。现在可以将编辑器连接到dlv会话并开始调试。在询问我的一些同事如何在VSCode中工作时,他们谈到了命令调色板和运行Debug: Open launch.json
,它应该如下所示:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Test",
"type": "go",
"request": "attach",
"mode": "remote",
"port": 2345,
"host": "127.0.0.1",
"showLog":true,
"trace":"log"
}
]
}
设置断点,您应该能够打开调试面板并运行Debug test
。
如果有人想知道,Vim的流几乎是一样的,只是不需要json文件。使用vim-go
插件,一旦dlv会话运行,就可以设置断点(:GoDebugBreakpoint
),并连接到dlv::GoDebugConnect 127.0.0.1:2345
。
从那时起,它与任何调试会话:GoDebugContinue
、:GoDebugStep
、:GoDebugStepOut
、:GoDebugPrint varname
等等几乎是一样的)
发布于 2022-09-11 04:19:52
你试过这个吗?
"go.testFlags": [
"-ldflags",
"-X",
"google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn"
]
在VSCode中创建新任务时,需要将每个空格分隔的单词/字符写入不同的参数。
https://stackoverflow.com/questions/73647814
复制