should close #137
Этот коммит содержится в:
родитель
cb8e8cae52
коммит
634a1d19e9
3 изменённых файлов: 158 добавлений и 16 удалений
|
@ -33,15 +33,26 @@ var (
|
|||
import (
|
||||
"github.com/DATA-DOG/godog"
|
||||
{{if .Contexts}}_test "{{.ImportPath}}"{{end}}
|
||||
{{if .XContexts}}_xtest "{{.ImportPath}}_test"{{end}}
|
||||
{{if .XContexts}}"testing/internal/testdeps"{{end}}
|
||||
"os"
|
||||
)
|
||||
|
||||
{{if .XContexts}}
|
||||
func init() {
|
||||
testdeps.ImportPath = "{{.ImportPath}}"
|
||||
}
|
||||
{{end}}
|
||||
|
||||
func main() {
|
||||
status := godog.Run("{{ .Name }}", func (suite *godog.Suite) {
|
||||
os.Setenv("GODOG_TESTED_PACKAGE", "{{.ImportPath}}")
|
||||
{{range .Contexts}}
|
||||
_test.{{ . }}(suite)
|
||||
{{end}}
|
||||
{{range .XContexts}}
|
||||
_xtest.{{ . }}(suite)
|
||||
{{end}}
|
||||
})
|
||||
os.Exit(status)
|
||||
}`))
|
||||
|
@ -349,14 +360,16 @@ func makeImportValid(r rune) rune {
|
|||
func buildTestMain(pkg *build.Package) ([]byte, bool, error) {
|
||||
var (
|
||||
contexts []string
|
||||
xcontexts []string
|
||||
err error
|
||||
name, importPath string
|
||||
)
|
||||
if nil != pkg {
|
||||
contexts, err = processPackageTestFiles(
|
||||
pkg.TestGoFiles,
|
||||
pkg.XTestGoFiles,
|
||||
)
|
||||
contexts, err = processPackageTestFiles(pkg.TestGoFiles)
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
xcontexts, err = processPackageTestFiles(pkg.XTestGoFiles)
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
|
@ -368,17 +381,21 @@ func buildTestMain(pkg *build.Package) ([]byte, bool, error) {
|
|||
data := struct {
|
||||
Name string
|
||||
Contexts []string
|
||||
XContexts []string
|
||||
ImportPath string
|
||||
}{
|
||||
Name: name,
|
||||
Contexts: contexts,
|
||||
XContexts: xcontexts,
|
||||
ImportPath: importPath,
|
||||
}
|
||||
|
||||
hasContext := len(contexts) > 0 || len(xcontexts) > 0
|
||||
var buf bytes.Buffer
|
||||
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.
|
||||
|
|
|
@ -17,7 +17,57 @@ func TestGodogBuildWithModuleOutsideGopath(t *testing.T) {
|
|||
}
|
||||
|
||||
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 {
|
||||
os.RemoveAll(dir)
|
||||
t.Fatal(err)
|
||||
|
@ -59,7 +109,11 @@ func TestGodogBuildWithModuleInsideGopath(t *testing.T) {
|
|||
}
|
||||
gopath := filepath.Join(os.TempDir(), "_gp")
|
||||
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 {
|
||||
os.RemoveAll(gopath)
|
||||
t.Fatal(err)
|
||||
|
|
|
@ -20,7 +20,7 @@ var builderFeatureFile = `Feature: eat godogs
|
|||
Then there should be 7 remaining
|
||||
`
|
||||
|
||||
var builderTestFile = `package main
|
||||
var builderTestFile = `package godogs
|
||||
|
||||
import (
|
||||
"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
|
||||
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 {
|
||||
return err
|
||||
}
|
||||
|
@ -97,7 +151,11 @@ func TestGodogBuildWithSourceNotInGoPath(t *testing.T) {
|
|||
t.SkipNow() // no command installed
|
||||
}
|
||||
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)
|
||||
|
@ -133,7 +191,9 @@ func TestGodogBuildWithoutSourceNotInGoPath(t *testing.T) {
|
|||
t.SkipNow() // no command installed
|
||||
}
|
||||
dir := filepath.Join(os.TempDir(), "godogs")
|
||||
err = buildTestPackage(dir, builderFeatureFile, "", "")
|
||||
err = buildTestPackage(dir, map[string]string{
|
||||
"godogs.feature": builderFeatureFile,
|
||||
})
|
||||
if err != nil {
|
||||
os.RemoveAll(dir)
|
||||
t.Fatal(err)
|
||||
|
@ -169,7 +229,10 @@ func TestGodogBuildWithoutTestSourceNotInGoPath(t *testing.T) {
|
|||
t.SkipNow() // no command installed
|
||||
}
|
||||
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 {
|
||||
os.RemoveAll(dir)
|
||||
t.Fatal(err)
|
||||
|
@ -206,7 +269,11 @@ func TestGodogBuildWithinGopath(t *testing.T) {
|
|||
}
|
||||
gopath := filepath.Join(os.TempDir(), "_gp")
|
||||
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 {
|
||||
os.RemoveAll(gopath)
|
||||
t.Fatal(err)
|
||||
|
@ -255,7 +322,11 @@ func TestGodogBuildWithVendoredGodog(t *testing.T) {
|
|||
}
|
||||
gopath := filepath.Join(os.TempDir(), "_gp")
|
||||
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 {
|
||||
os.RemoveAll(gopath)
|
||||
t.Fatal(err)
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче