V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
spotfg
V2EX  ›  Go 编程语言

golang flag 单元测试跑不过

  •  1
     
  •   spotfg · 2022-01-04 12:10:42 +08:00 · 1426 次点击
    这是一个创建于 1060 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求助,怎么修改我的测试文件或者执行命令可以跑通 TestExecute

    执行命令:go test -run TestExecute -args -s qqqqq
    输出结果:

    $ go test -run TestExecute -args -s qqqqq
    flag provided but not defined: -s
    Usage of C:\Users\xxx\AppData\Local\Temp\go-build2919206642\b001\ptest.test.exe:
      -test.bench regexp
            run only benchmarks matching regexp
      -test.benchmem
            print memory allocations for benchmarks
      -test.benchtime d
      ...
    

    代码如下:

    // main.go
    
    
    package main
    
    import (
    	"flag"
    	"fmt"
    )
    
    func main() {
    	// 其他处理逻辑
    	Execute()
        // 其他处理逻辑
    }
    
    func Execute() {
    	s := flag.String("s", "abc", "xxxxxx")
    
    	fmt.Println(*s)
        
        // 对得到参数的处理
    }
    
    
    // m_test.go
    
    package main
    
    import "testing"
    
    func TestExecute(t *testing.T) {
    	Execute()
    
    }
    
    
    
    smilekung
        1
    smilekung  
       2022-01-04 13:56:46 +08:00
    根据文档 test 时 flag.Parse 并没有被调用 需要在 test 方法里显式调用
    meiyoumingzi6
        2
    meiyoumingzi6  
       2022-01-04 14:07:32 +08:00
    ```golang
    package main

    import (
    "flag"
    "fmt"
    )

    func main() {
    // 其他处理逻辑
    Execute()
    // 其他处理逻辑
    }

    func Execute() {
    s := flag.String("s", "abc", "xxxxxx")
    flag.Parse() // 加上这行
    fmt.Println(*s)
    // 对得到参数的处理
    }

    ```
    MoYi123
        3
    MoYi123  
       2022-01-04 14:26:17 +08:00
    func TestMain(m *testing.M) {
    Execute()
    }


    建议还是在 main 里把参数全部解析出了,通过参数传入 execute 比较好
    FrankFang128
        4
    FrankFang128  
       2022-01-04 14:31:03 +08:00
    如 3 楼所说 +1
    spotfg
        5
    spotfg  
    OP
       2022-01-04 15:04:59 +08:00
    @meiyoumingzi6 我试了下,不行,仍然报错了无法携带参数
    spotfg
        6
    spotfg  
    OP
       2022-01-04 15:06:22 +08:00
    @MoYi123 确实是好点,但是这老项目改起来就有点不太敢动
    spotfg
        7
    spotfg  
    OP
       2022-01-04 15:09:41 +08:00
    @smilekung google 搜出来也是这样说,可惜不对,不是我这种情况,我需要通过命令行传参。不传参是可以跑的通的
    MoYi123
        8
    MoYi123  
       2022-01-04 15:10:06 +08:00   ❤️ 1
    @spotfg
    func TestMain(m *testing.M) {
    Execute()
    }

    这样写就能跑了
    spotfg
        9
    spotfg  
    OP
       2022-01-04 15:12:39 +08:00
    @MoYi123 噢!确实!强啊!淦,翻了一大堆东西,都是说要 parse 前 testing.Init(), 但是都试了。文档翻了一遍又一遍,累了
    smilekung
        10
    smilekung  
       2022-01-04 16:58:24 +08:00
    #8  大佬 看了下 报错的核心问题是 在 flag.parse 时 flag 还没有被定义,改为 testing.m 只有 如果不执行 m.run 是不会进行 flag.prase 的,所以还有种改法就是把 flag 定义提前
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5340 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 09:37 · PVG 17:37 · LAX 01:37 · JFK 04:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.