【问题标题】:Execute test cases in a pre-defined order以预定义的顺序执行测试用例
【发布时间】:2015-05-11 15:26:44
【问题描述】:

有没有办法在 GoLang 中按预定义的顺序执行测试用例。

P.S:我正在为事件的生命周期编写测试用例。所以我对所有的 CURD 操作都有不同的 api。我想以特定顺序运行这些测试用例,因为只有在创建事件时才能将其销毁。

我还可以从一个测试用例中获取一些值并将其作为输入传递给另一个。 (例如:- 要测试删除事件 api,我需要一个 event_id,当我调用 create_event 测试用例时会得到它)

我是 GoLang 的新手,有人可以指导我吗?

提前致谢

【问题讨论】:

    标签: unit-testing testing go


    【解决方案1】:

    做到这一点的唯一方法是将所有测试封装到一个测试函数中,该函数以正确的顺序和正确的上下文调用子函数,并将testing.T 指针传递给每个子函数,这样它们就可以失败。不利的一面是它们都将作为一个测试出现。但事实上就是这样——就测试框架而言,测试是无状态的,每个函数都是一个单独的测试用例。

    请注意,尽管测试可能会按照编写它们的顺序运行,但我没有发现任何文档说明这实际上是某种合同。因此,即使您可以按顺序编写它们并将状态保留为外部全局变量 - 也不建议这样做。

    自 go 1.4 以来,该框架为您提供的唯一灵活性是 TestMain 方法,它允许您在步骤之前/之后运行,或设置/拆卸:

    func TestMain(m *testing.M) {
    
        if err := setUp(); err != nil {
            panic(err)
        }
        rc := m.Run()
        tearDown()
        os.Exit(rc)
    }
    

    但这不会给你你想要的。安全地做到这一点的唯一方法是执行以下操作:

    // this is the whole stateful sequence of tests - to the testing framework it's just one case
    func TestWrapper(t *testing.T) {
    
       // let's say you pass context as some containing struct
       ctx := new(context)
       test1(t, ctx)
       test2(t, ctx)
       ...
    }
    
    // this holds context between methods
    type context struct {   
        eventId string
    }
    
    func test1(t *testing.T, c *context) {
       // do your thing, and you can manipulate the context
       c.eventId = "something"
    } 
    
    func test2(t *testing.T, c *context) {
       // do your thing, and you can manipulate the context
       doSomethingWith(c.eventId)
    } 
    

    【讨论】:

    • 感谢您的回答,您能否也解释一下为什么不建议将状态保留为外部全局变量。
    • @VikasVerma 你肯定可以做到,但根据我的经验,这只是自找麻烦。例如,如果您运行并行测试怎么办?最好在无状态函数之间传递上下文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2014-05-15
    • 1970-01-01
    • 2018-04-23
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多