有没有一种方法可以在go“测试”中获得命令行参数,
当你调用go test
时,显然你的main
没有运行,那么有没有一种方法来处理命令行参数,
一种方法是使用flags
包并检查每个测试或正在测试的函数中的命令行参数,但这并不理想,因为您需要在很多很多地方这样做,而不像在运行应用程序时仅在main
中这样做。
有人可能认为这是一件错误的事情,而且这是违反单元测试的纯洁性的:
1.并非所有测试都是单元测试
1.不依赖于“ENV”变量并实际在命令行中将其作为参数传递是非常实用的,
为了记录在案,我最后把一个init()
函数放在我的一个_test
文件中,并设置变量,当以这种方式调用main时,该变量通过标志来设置。
5条答案
按热度按时间kuhbmx9i1#
根据我的经验,环境配置最好保存在环境变量中。你可以像这样依赖全局变量:
或者,如果必须使用标志,可以将初始化代码放在一个名为init()的函数中。
at0kjp5o2#
你可以直接测试main函数并传递参数。
显示一个标志和一对位置参数的简单示例
注意:不要称之为“TestMain”,因为它对Go 1.8的测试框架有特殊的意义。
5cg8jx4n3#
另一种方法是让
main()
成为一个stub,在flag.Parse()
处理完参数后,它只会调用另一个函数,例如:然后在测试中,可以在调用
submain(...)
模拟命令行建立标志和参数之前设置标志变量并建立参数。这种方法可以用来最大化测试覆盖率,而不需要实际使用命令行。例如,在main_test.go中,你可以这样写:lsmepo6l4#
请注意,配置文件名是硬编码的。
bwntbbo35#
当我在测试设置中使用
init()
来解析标志时,我发现了jbowen's post,它提供了一种在测试运行中访问传入标志的更简单的方法,这是基于flag.Parse()
已经由go test
执行的事实。这需要在包作用域中定义,以便标志模块在解析之前提取它。否则,它为您提供了对额外定义的标志的轻松访问,我想它可以在可重用的测试夹具包中定义。