【问题标题】:go test flag: flag provided but not definedgo test flag:提供但未定义的标志
【发布时间】:2021-09-08 17:24:07
【问题描述】:

您好,我在 go 中测试时使用了一个标志:
file_test.go var ip = flag.String("ip", "noip", "test")

我只在一个测试文件中使用它。只测试一个测试文件时它工作正常,但是当我运行时: go test ./... -ip 127.0.0.1 alle 的其他测试文件说:flag provided but not defined

你见过吗?

问候

【问题讨论】:

    标签: go


    【解决方案1】:

    flag.Parse() 在你的标志被定义之前被调用。

    您必须确保在调用flag.Parse() 之前发生所有标志定义,通常通过在init() 函数中定义所有标志。

    【讨论】:

    • 谢谢,它仍然只能在同一个包中工作,但在运行所有测试时不能使用:./...
    • @ChrisG。如果您正在测试多个包,则您提供的任何标志都必须在所有包中都有效。没有办法解决这个问题。
    • 谢谢!你知道如何使用 regexp -run 忽略测试吗?
    • @ChrisG.:忽略测试没有帮助。你是说在./... 通配符上运行go test。这不是一次单独的测试运行,而是连续测试每个匹配的包。只需不要使用./... 并测试您要测试的包。
    【解决方案2】:

    如果您已迁移到 golang 13,它会更改测试初始化​​程序的顺序, 所以它可能会导致类似

    flag provided but not defined: -test.timeout
    

    作为一种可能的解决方法,您可以使用

    var _ = func() bool {
        testing.Init()
        return true
    }()
    

    这将在应用程序之前调用测试初始化​​。更多信息可以在原始线程中找到:

    https://github.com/golang/go/issues/31859#issuecomment-489889428

    【讨论】:

      【解决方案3】:

      不要在任何 init() 中调用 flag.Parse()

      【讨论】:

      • 好的,谢谢,很高兴知道,然后你会如何测试它?
      • 您想在调用它们之前定义标志,您也可以在init() 中执行此操作。但是,使用 init 来做事情会使测试变得困难,最好使用脱离 main 的辅助函数来完成这项工作。
      • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
      猜你喜欢
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多