should close #137
Этот коммит содержится в:
родитель
cb8e8cae52
коммит
634a1d19e9
3 изменённых файлов: 158 добавлений и 16 удалений
|
@ -33,15 +33,26 @@ var (
|
||||||
import (
|
import (
|
||||||
"github.com/DATA-DOG/godog"
|
"github.com/DATA-DOG/godog"
|
||||||
{{if .Contexts}}_test "{{.ImportPath}}"{{end}}
|
{{if .Contexts}}_test "{{.ImportPath}}"{{end}}
|
||||||
|
{{if .XContexts}}_xtest "{{.ImportPath}}_test"{{end}}
|
||||||
|
{{if .XContexts}}"testing/internal/testdeps"{{end}}
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
{{if .XContexts}}
|
||||||
|
func init() {
|
||||||
|
testdeps.ImportPath = "{{.ImportPath}}"
|
||||||
|
}
|
||||||
|
{{end}}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
status := godog.Run("{{ .Name }}", func (suite *godog.Suite) {
|
status := godog.Run("{{ .Name }}", func (suite *godog.Suite) {
|
||||||
os.Setenv("GODOG_TESTED_PACKAGE", "{{.ImportPath}}")
|
os.Setenv("GODOG_TESTED_PACKAGE", "{{.ImportPath}}")
|
||||||
{{range .Contexts}}
|
{{range .Contexts}}
|
||||||
_test.{{ . }}(suite)
|
_test.{{ . }}(suite)
|
||||||
{{end}}
|
{{end}}
|
||||||
|
{{range .XContexts}}
|
||||||
|
_xtest.{{ . }}(suite)
|
||||||
|
{{end}}
|
||||||
})
|
})
|
||||||
os.Exit(status)
|
os.Exit(status)
|
||||||
}`))
|
}`))
|
||||||
|
@ -349,14 +360,16 @@ func makeImportValid(r rune) rune {
|
||||||
func buildTestMain(pkg *build.Package) ([]byte, bool, error) {
|
func buildTestMain(pkg *build.Package) ([]byte, bool, error) {
|
||||||
var (
|
var (
|
||||||
contexts []string
|
contexts []string
|
||||||
|
xcontexts []string
|
||||||
err error
|
err error
|
||||||
name, importPath string
|
name, importPath string
|
||||||
)
|
)
|
||||||
if nil != pkg {
|
if nil != pkg {
|
||||||
contexts, err = processPackageTestFiles(
|
contexts, err = processPackageTestFiles(pkg.TestGoFiles)
|
||||||
pkg.TestGoFiles,
|
if err != nil {
|
||||||
pkg.XTestGoFiles,
|
return nil, false, err
|
||||||
)
|
}
|
||||||
|
xcontexts, err = processPackageTestFiles(pkg.XTestGoFiles)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false, err
|
return nil, false, err
|
||||||
}
|
}
|
||||||
|
@ -368,17 +381,21 @@ func buildTestMain(pkg *build.Package) ([]byte, bool, error) {
|
||||||
data := struct {
|
data := struct {
|
||||||
Name string
|
Name string
|
||||||
Contexts []string
|
Contexts []string
|
||||||
|
XContexts []string
|
||||||
ImportPath string
|
ImportPath string
|
||||||
}{
|
}{
|
||||||
Name: name,
|
Name: name,
|
||||||
Contexts: contexts,
|
Contexts: contexts,
|
||||||
|
XContexts: xcontexts,
|
||||||
ImportPath: importPath,
|
ImportPath: importPath,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hasContext := len(contexts) > 0 || len(xcontexts) > 0
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
if err = runnerTemplate.Execute(&buf, data); err != nil {
|
if err = runnerTemplate.Execute(&buf, data); err != nil {
|
||||||
return nil, len(contexts) > 0, err
|
return nil, hasContext, err
|
||||||
}
|
}
|
||||||
return buf.Bytes(), len(contexts) > 0, nil
|
return buf.Bytes(), hasContext, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseImport parses the import path to deal with go module.
|
// parseImport parses the import path to deal with go module.
|
||||||
|
|
|
@ -17,7 +17,57 @@ func TestGodogBuildWithModuleOutsideGopath(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
dir := filepath.Join(os.TempDir(), "godogs")
|
dir := filepath.Join(os.TempDir(), "godogs")
|
||||||
err = buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile)
|
err = buildTestPackage(dir, map[string]string{
|
||||||
|
"godogs.feature": builderFeatureFile,
|
||||||
|
"godogs.go": builderMainCodeFile,
|
||||||
|
"godogs_test.go": builderTestFile,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
os.RemoveAll(dir)
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(dir)
|
||||||
|
|
||||||
|
prevDir, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.Chdir(dir); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.Chdir(prevDir)
|
||||||
|
|
||||||
|
if out, err := exec.Command("go", "mod", "init", "godogs").CombinedOutput(); err != nil {
|
||||||
|
t.Log(string(out))
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var stdout, stderr bytes.Buffer
|
||||||
|
cmd := exec.Command("godog", "godogs.feature")
|
||||||
|
cmd.Stdout = &stdout
|
||||||
|
cmd.Stderr = &stderr
|
||||||
|
cmd.Env = os.Environ()
|
||||||
|
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
t.Log(stdout.String())
|
||||||
|
t.Log(stderr.String())
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGodogBuildWithModuleOutsideGopathWithXTest(t *testing.T) {
|
||||||
|
_, err := exec.LookPath("godog")
|
||||||
|
if err != nil {
|
||||||
|
t.SkipNow() // no command installed
|
||||||
|
}
|
||||||
|
|
||||||
|
dir := filepath.Join(os.TempDir(), "godogs")
|
||||||
|
err = buildTestPackage(dir, map[string]string{
|
||||||
|
"godogs.feature": builderFeatureFile,
|
||||||
|
"godogs.go": builderMainCodeFile,
|
||||||
|
"godogs_test.go": builderXTestFile,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
os.RemoveAll(dir)
|
os.RemoveAll(dir)
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -59,7 +109,11 @@ func TestGodogBuildWithModuleInsideGopath(t *testing.T) {
|
||||||
}
|
}
|
||||||
gopath := filepath.Join(os.TempDir(), "_gp")
|
gopath := filepath.Join(os.TempDir(), "_gp")
|
||||||
dir := filepath.Join(gopath, "src", "godogs")
|
dir := filepath.Join(gopath, "src", "godogs")
|
||||||
err = buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile)
|
err = buildTestPackage(dir, map[string]string{
|
||||||
|
"godogs.feature": builderFeatureFile,
|
||||||
|
"godogs.go": builderMainCodeFile,
|
||||||
|
"godogs_test.go": builderTestFile,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
os.RemoveAll(gopath)
|
os.RemoveAll(gopath)
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
|
|
@ -20,7 +20,7 @@ var builderFeatureFile = `Feature: eat godogs
|
||||||
Then there should be 7 remaining
|
Then there should be 7 remaining
|
||||||
`
|
`
|
||||||
|
|
||||||
var builderTestFile = `package main
|
var builderTestFile = `package godogs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -59,7 +59,47 @@ func FeatureContext(s *godog.Suite) {
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
var builderMainCodeFile = `package main
|
var builderXTestFile = `package godogs_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/DATA-DOG/godog"
|
||||||
|
"godogs"
|
||||||
|
)
|
||||||
|
|
||||||
|
func thereAreGodogs(available int) error {
|
||||||
|
godogs.Godogs = available
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func iEat(num int) error {
|
||||||
|
if godogs.Godogs < num {
|
||||||
|
return fmt.Errorf("you cannot eat %d godogs, there are %d available", num, godogs.Godogs)
|
||||||
|
}
|
||||||
|
godogs.Godogs -= num
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func thereShouldBeRemaining(remaining int) error {
|
||||||
|
if godogs.Godogs != remaining {
|
||||||
|
return fmt.Errorf("expected %d godogs to be remaining, but there is %d", remaining, godogs.Godogs)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func FeatureContext(s *godog.Suite) {
|
||||||
|
s.Step("^there are (\\d+) godogs$", thereAreGodogs)
|
||||||
|
s.Step("^I eat (\\d+)$", iEat)
|
||||||
|
s.Step("^there should be (\\d+) remaining$", thereShouldBeRemaining)
|
||||||
|
|
||||||
|
s.BeforeScenario(func(interface{}) {
|
||||||
|
godogs.Godogs = 0 // clean the state before every scenario
|
||||||
|
})
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
var builderMainCodeFile = `package godogs
|
||||||
|
|
||||||
// Godogs available to eat
|
// Godogs available to eat
|
||||||
var Godogs int
|
var Godogs int
|
||||||
|
@ -68,7 +108,21 @@ func main() {
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
func buildTestPackage(dir, feat, src, testSrc string) error {
|
func buildTestPackage(dir string, files map[string]string) error {
|
||||||
|
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for name, content := range files {
|
||||||
|
if err := ioutil.WriteFile(filepath.Join(dir, name), []byte(content), 0644); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildTestPackage2(dir, feat, src, testSrc string) error {
|
||||||
if err := os.MkdirAll(dir, 0755); err != nil {
|
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -97,7 +151,11 @@ func TestGodogBuildWithSourceNotInGoPath(t *testing.T) {
|
||||||
t.SkipNow() // no command installed
|
t.SkipNow() // no command installed
|
||||||
}
|
}
|
||||||
dir := filepath.Join(os.TempDir(), "godogs")
|
dir := filepath.Join(os.TempDir(), "godogs")
|
||||||
err = buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile)
|
err = buildTestPackage(dir, map[string]string{
|
||||||
|
"godogs.feature": builderFeatureFile,
|
||||||
|
"godogs.go": builderMainCodeFile,
|
||||||
|
"godogs_test.go": builderTestFile,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
os.RemoveAll(dir)
|
os.RemoveAll(dir)
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -133,7 +191,9 @@ func TestGodogBuildWithoutSourceNotInGoPath(t *testing.T) {
|
||||||
t.SkipNow() // no command installed
|
t.SkipNow() // no command installed
|
||||||
}
|
}
|
||||||
dir := filepath.Join(os.TempDir(), "godogs")
|
dir := filepath.Join(os.TempDir(), "godogs")
|
||||||
err = buildTestPackage(dir, builderFeatureFile, "", "")
|
err = buildTestPackage(dir, map[string]string{
|
||||||
|
"godogs.feature": builderFeatureFile,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
os.RemoveAll(dir)
|
os.RemoveAll(dir)
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -169,7 +229,10 @@ func TestGodogBuildWithoutTestSourceNotInGoPath(t *testing.T) {
|
||||||
t.SkipNow() // no command installed
|
t.SkipNow() // no command installed
|
||||||
}
|
}
|
||||||
dir := filepath.Join(os.TempDir(), "godogs")
|
dir := filepath.Join(os.TempDir(), "godogs")
|
||||||
err = buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, "")
|
err = buildTestPackage(dir, map[string]string{
|
||||||
|
"godogs.feature": builderFeatureFile,
|
||||||
|
"godogs.go": builderMainCodeFile,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
os.RemoveAll(dir)
|
os.RemoveAll(dir)
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -206,7 +269,11 @@ func TestGodogBuildWithinGopath(t *testing.T) {
|
||||||
}
|
}
|
||||||
gopath := filepath.Join(os.TempDir(), "_gp")
|
gopath := filepath.Join(os.TempDir(), "_gp")
|
||||||
dir := filepath.Join(gopath, "src", "godogs")
|
dir := filepath.Join(gopath, "src", "godogs")
|
||||||
err = buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile)
|
err = buildTestPackage(dir, map[string]string{
|
||||||
|
"godogs.feature": builderFeatureFile,
|
||||||
|
"godogs.go": builderMainCodeFile,
|
||||||
|
"godogs_test.go": builderTestFile,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
os.RemoveAll(gopath)
|
os.RemoveAll(gopath)
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -255,7 +322,11 @@ func TestGodogBuildWithVendoredGodog(t *testing.T) {
|
||||||
}
|
}
|
||||||
gopath := filepath.Join(os.TempDir(), "_gp")
|
gopath := filepath.Join(os.TempDir(), "_gp")
|
||||||
dir := filepath.Join(gopath, "src", "godogs")
|
dir := filepath.Join(gopath, "src", "godogs")
|
||||||
err = buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile)
|
err = buildTestPackage(dir, map[string]string{
|
||||||
|
"godogs.feature": builderFeatureFile,
|
||||||
|
"godogs.go": builderMainCodeFile,
|
||||||
|
"godogs_test.go": builderTestFile,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
os.RemoveAll(gopath)
|
os.RemoveAll(gopath)
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче