⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ This module is deprecated. Use
github.com/godogx/expandvarsinstead.
A lifesaver expander for cucumber/godog because, sometimes, you have to use variables in your steps.
Go >= 1.16
go get github.com/nhatthm/expandogInitiate a new StepExpander with expandog.NewStepExpander() then add it to ScenarioInitializer by
calling StepExpander.RegisterContext(*testing.T, *godog.ScenarioContext)
package main
import (
"fmt"
"math/rand"
"strings"
"testing"
"github.com/cucumber/godog"
"github.com/nhatthm/expandog"
"github.com/stretchr/testify/assert"
)
func TestIntegration(t *testing.T) {
expander := expandog.NewStepExpander(
strings.NewReplacer("$TO", "Berlin"),
expandog.Pairs{
"HUSBAND": "John",
},
func() expandog.Pairs {
return expandog.Pairs{
"RAND": fmt.Sprintf("%d", rand.Int63()),
}
},
expandog.BeforeScenario(func() expandog.Pairs {
return expandog.Pairs{
"SCENARIO_RAND": fmt.Sprintf("%d", rand.Int63()),
}
}),
func(s string) string {
return strings.ReplaceAll(s, "$FROM", "Paris")
},
expandog.Expander(func(s string) string {
return strings.ReplaceAll(s, "$TRANSPORT", "by bus")
}),
// OS env vars.
expandog.EnvExpander,
)
suite := godog.TestSuite{
Name: "Integration",
ScenarioInitializer: func(ctx *godog.ScenarioContext) {
expander.RegisterContext(ctx)
},
Options: &godog.Options{
Strict: true,
Randomize: rand.Int63(),
},
}
// Run the suite.
}In your tests, just use $VARIABLE_NAME in the step or the argument, like this:
Scenario: var is replaced
Given var NAME is replaced in step text: $NAME
Then step text is:
"""
map var NAME is replaced in step text: John
"""
Given var NAME is replaced in step argument (string)
"""
NAME=$NAME
"""
Then step argument is a string:
"""
NAME=John
"""
Given env var NAME is replaced in step argument (table)
| col 1 | col 2 | col 3 |
| value 1 | $NAME | value 3 |
Then step argument is a table:
| col 1 | col 2 | col 3 |
| value 1 | John | value 3 | Scenario: .github files
Then there should be only these files in "$TEST_DIR/.github":
"""
- workflows:
- golangci-lint.yaml
- test.yaml
"""The expanders could be any of these:
- A
Replacerinterface
type Replacer interface {
Replace(string) string
}-
A
Replacerfunc(string) stringfunction.
For example, you could useos.ExpandEnvor its aliasexpandog.EnvExpander -
A map or vars (without the
$)map[string]string
var _ = expandog.NewStepExpander(expandog.Pairs{
"HUSBAND": "John",
"WIFE": "Jane",
})- A provider that provides a map of vars (without the
$)map[string]string. The provider will be called every step.
var _ = expandog.NewStepExpander(func() expandog.Pairs {
return map[string]string{
"RAND": fmt.Sprintf("%d", rand.Int63()),
}
})- A
BeforeScenarioprovides a map of vars (without the$)map[string]string. The provider will be called only once before every scenario.
Note: If you need expandog.EnvExpander or os.ExpandEnv, put it in the end of the chain. Because it replaces not-found vars with empty strings, other
expanders won't have a chance to do their jobs if you put it in the beginning.
If this project help you reduce time to develop, you can give me a cup of coffee :)
or scan this

