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。
为了满足并发要求,我想知道如何在 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。