Godog 步间传球 arguments/state

Godog pass arguments/state between steps

为了满足并发要求,我想知道如何在 Godog 中的多个步骤之间传递参数或状态。

func FeatureContext(s *godog.Suite) {
    // This step is called in background
    s.Step(`^I work with "([^"]*)" entities`, iWorkWithEntities)
    // This step should know about the type of entity
    s.Step(`^I run the "([^"]*)" mutation with the arguments:$`, iRunTheMutationWithTheArguments)

我想到的唯一想法是内联被调用的函数:

state := make(map[string]string, 0)
s.Step(`^I work with "([^"]*)" entities`, func(entityName string) error {
    return iWorkWithEntities(entityName, state)
})
s.Step(`^I run the "([^"]*)" mutation with the arguments:$`, func(mutationName string, args *messages.PickleStepArgument_PickleTable) error {
    return iRunTheMutationWithTheArguments(mutationName, args, state)
})

但这感觉有点像解决方法。 Godog 库本身是否有任何功能可以传递这些信息?

Godog 目前没有这样的功能,但我过去通常所做的(需要进行并发测试)是创建一个 TestContext 结构来存储数据并创建一个每个场景前新鲜一个。

func FeatureContext(s *godog.Suite) {
    config := config.NewConfig()
    context := NewTestContext(config)

    t := &tester{
        TestContext: context,
    }

    s.BeforeScenario(func(interface{}) {
        // reset context between scenarios to avoid
        // cross contamination of data
        context = NewTestContext(config)
    })
}

我这里也有一个旧例子的 link:https://github.com/jaysonesmith/godog-baseline-example

我发现在步骤中使用方法而不是函数很幸运。然后,将状态放入结构中。

func FeatureContext(s *godog.Suite) {
    t := NewTestRunner()

    s.Step(`^I work with "([^"]*)" entities`, t.iWorkWithEntities)
}

type TestRunner struct {
    State map[string]interface{}
}

func (t *TestRunner) iWorkWithEntities(s string) error {
    t.State["entities"] = s
    ...
}

godog 的最新版本 (v0.12.0+) 允许在挂钩和步骤之间链接 context.Context

您可以将 context.Context 作为步骤定义参数和 return,测试运行器将提供上一步的上下文作为输入,并使用 returned 上下文传递给下一个挂钩和步骤.

func iEat(ctx context.Context, arg1 int) context.Context {
    if v, ok := ctx.Value(eatKey{}).int; ok {
        // Eat v from context.
    }
    // Eat arg1.
    
    return context.WithValue(ctx, eatKey{}, 0)
}

其他信息和示例:https://github.com/cucumber/godog/blob/main/release-notes/v0.12.0.md#contextualized-hooks