有没有一种方法可以按预定义的顺序在GoLang中执行测试用例。

附注:我正在为事件的生命周期编写测试用例。因此,对于所有CURD操作,我都有不同的api。我想按特定顺序运行这些测试用例,因为只有创建事件后才能销毁它。

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

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

提前致谢

最佳答案

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

请注意,尽管测试可以按照编写的顺序运行,但我找不到文档说明这实际上是某种契约(Contract)。因此,即使您可以按顺序编写它们并将状态保留为外部全局变量,也不建议这样做。

自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)
}

关于unit-testing - 按照预定义的顺序执行测试用例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30171693/

10-14 14:09
查看更多