问题记录:flag provided but not defined: -test.v 异常处理过程

问题描述

工作需求,写了一个底层调用的方法,就想测一测这个接口别有什么问题,于是写了一个单元测试用例,试着跑了一下,就报了下面这个错误
flag provided but not defined: -test.v
单元测试代码:

func TestA(t *testing.T) {
    type args struct {
        ctx    context.Context
        key    string
        secret string
        msg    string
    }
    tests := []struct {
        name    string
        args    args
        want    []byte
        wantErr bool
    }{
        {
            name: "正常",
            args: args{
                ctx:    context.Background(),
                key:    "key_test",
                secret: "secret_test",
                msg:    "你好呀,小朋友",
            },
        },
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            got, err := baseService.A(tt.args.ctx, tt.args.key, tt.args.secret, tt.args.msg)
            if (err != nil) != tt.wantErr {
                t.Errorf("A() error = %v, wantErr %v", err, tt.wantErr)
                return
            }
            if !reflect.DeepEqual(got, tt.want) {
                t.Errorf("A() got = %v, want %v", got, tt.want)
            }
        })
    }
}

问题原因追溯

1. -test.v是testing包中定义的命令行参数,flag provided but not defined 是flag包的Parse()方法调用时抛的异常。
2. 测试代码中有引用自定义的参数命令行参数,再底层引用中找到了下面这段代码
var usr1 = flag.String("usr1", "", "user defined flag -usr1")
var usr2 = flag.String("usr2", "", "user defined flag -usr2")
var usr3 = flag.String("usr3", "", "user defined flag -usr3")
var usr4 = flag.String("usr4", "", "user defined flag -usr4")
var usr5 = flag.String("usr5", "", "user defined flag -usr5")

func init() {
    if !flag.Parsed() {
        flag.Parse()
    }
}

init方法中定义的flag再运行中都有提示给出,猜测是init方法中调用的Parse方法调用时,testing中的命令行参数还没有被解析

3. 再看下Parse()方法的实现代码
    s := f.args[0]  //取执行时的命令行参数
    name := s[numMinuses:] 命令行参数名称处理
    m := f.formal 已初始化的命令行参数
    flag, alreadythere := m[name] 
    if !alreadythere { //执行时带的命令行参数如果没有被初始化就报错
        if name == "help" || name == "h" { // special case for nice help message.
            f.usage()
            return false, ErrHelp
        }
        return false, f.failf("flag provided but not defined: -%s", name)
    }
4. 上面跑出的异常就是由3处的函数调用产生的,我们再确认下testing的命令行参数初始化代码
func Init() {
    chatty = flag.Bool("test.v", false, "verbose: print     additional output")
    count = flag.Uint("test.count", 1, "run tests and   benchmarks `n` times")
}
func MainStart(deps testDeps, tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) *M {
    Init()
    return &M{
        deps:       deps,
        tests:      tests,
        benchmarks: benchmarks,
        examples:   examples,
    }
}
func Main(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) {
    os.Exit(MainStart(matchStringOnly(matchString), tests, benchmarks, examples).Run())
}   

testing的命令行初始化实在运行时才开始的。所以可以确认是自定义包中的初始化函数中的flag.Parse()引起的。

问题解决

定位了问题之后,我们在测试用例中再手动引入testing.Init()方法,使其在引用了flag.Parse()包之前被初始化掉。

import (
    "context"
    "reflect"
    "testing"

    _ "app/test/init"

    "app/service/baseService"
)
//app/test/init/init.go
import "testing"

func init(){
    testing.Init()
}

再次运行测试用例,不再报错


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354