使用命令行参数在VSCode中调试Go测试

4

我需要在Go中构建一个测试用例,在执行时接受一些命令行参数。

测试文件看起来很简单:

package somelogic_test

import (
    sl "example.com/somelogic"
    "flag"
    "testing"
)

func TestSomeLogic(t *testing.T) {
    flag.Parse()
    strSlice := flag.Args()
    sl.SomeLogic(strSlice)
}

当我以go test -v somelogic_test.go -args arg1 arg2 arg3的形式运行测试时,它能正常工作,接受arg1、arg2、arg3作为字符串切片,并将其传递给SomeLogic函数。到目前为止,一切顺利。
现在我想在VSCode中调试执行过程。我找到了这个链接,它建议将所有命令行参数都放在launch.json文件的"args"字段中。所以我按照建议进行了操作,我的launch.json配置如下:
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch file",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}",
            "env": {},
            "args": ["-v","somelogic_test.go","-args","arg1","arg2","arg3"]
        }
    ]
}

然而,这根本不起作用,因为当我在“运行测试”和“调试测试”模式下运行“somelogic_test.go”时,flag.Parse()flag.Args() 命令都不会接受任何参数,结果 strSlice 只是一个空的切片。
请建议如何修改 launch.json,以便命令行参数被flag.Parse() 接受并可供进一步调试使用?

如果您正在测试 SomeLogic 函数,该函数接受标志的值(而不是处理标志逻辑),那么您不能只是将预期值传递给它吗? - Charlie Clarke
我肯定可以硬编码strSlice并将其传递给SomeLogic。但是,我想要一些灵活性,这就是为什么我尝试使用命令行参数使其工作的原因。 - vtm11
我不知道你在这里想要做什么,但我认为这不是测试所必需的。你不需要测试标志模块是否正常工作,只需要测试给定标志值时SomeLogic函数是否正常运行即可。 - Charlie Clarke
1个回答

1
请参考go help testflag

'go test'命令既可以使用适用于'go test'本身的标志,也可以使用适用于生成的测试二进制文件的标志。

您需要区分这两种类型的标志,因为在使用Go扩展程序的VSCode调试测试时,它首先编译测试二进制文件,然后将参数传递给它。在您的go test命令行中,-v somelogic_test.go应该是适用于go test本身的标志,而arg1 arg2 arg3应该是适用于生成的测试二进制文件的标志,对吗?

尝试一下这个,在我的环境中有效:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Test file",
            "type": "go",
            "request": "launch",
            "mode": "test",
            // Indicate the target here
            "program": "${fileDirname}/somelogic_test.go",
            // or just use "The current opened file"
            // "program": "${file}", 
            "env": {},
            "args": ["-test.v", "--", "arg1","arg2","arg3"]
        }
    ]
}

然而,这根本不起作用,因为当我在Run Test和Debug Test模式下运行somelogic_test.go时,flag.Parse()和flag.Args()都不接受任何参数,结果strSlice只是一个空的slice。
请注意,上面测试函数上方出现的“run test”和“debug test”按钮不使用launch.json。转到“Run and debug”侧边栏以启动您设置的特定配置。

有没有使用命名参数的方法?我在这里遇到了问题:https://dev59.com/z3cPtIcB2Jgan1znLYGH - Vitor Estevam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接