exit status on failure, test godog with godog on travis

Этот коммит содержится в:
gedi 2015-06-17 17:58:22 +03:00
родитель a3ef3361f8
коммит 743083181e
5 изменённых файлов: 88 добавлений и 17 удалений

Просмотреть файл

@ -6,7 +6,12 @@ go:
- tip
script:
# pull all dependencies
- go get -t ./...
# run standard go tests
- go test -v ./...
- go test -race ./...
# test me with myself
- go run cmd/godog/main.go

Просмотреть файл

@ -16,19 +16,21 @@ func main() {
stdout := ansicolor.NewAnsiColorWriter(os.Stdout)
builtFile := fmt.Sprintf("%s/%dgodog.go", os.TempDir(), time.Now().UnixNano())
defer os.Remove(builtFile) // comment out for debug
buf, err := godog.Build()
if err != nil {
os.Remove(builtFile)
panic(err)
}
w, err := os.Create(builtFile)
if err != nil {
os.Remove(builtFile)
panic(err)
}
_, err = w.Write(buf)
if err != nil {
os.Remove(builtFile)
panic(err)
}
w.Close()
@ -43,8 +45,10 @@ func main() {
err = cmd.Run()
switch err.(type) {
case *exec.ExitError:
os.Remove(builtFile)
os.Exit(1)
case *exec.Error:
os.Remove(builtFile)
panic(err)
}
}

Просмотреть файл

@ -3,6 +3,7 @@ package godog
import (
"flag"
"fmt"
"os"
"reflect"
"regexp"
"runtime"
@ -10,6 +11,14 @@ import (
"github.com/DATA-DOG/godog/gherkin"
)
type stepsStatus int
const (
stepsStatusPassed stepsStatus = iota
stepsStatusFailed
stepsStatusUndefined
)
type BeforeScenarioHandler interface {
BeforeScenario(scenario *gherkin.Scenario)
}
@ -66,7 +75,7 @@ type suite struct {
features []*gherkin.Feature
fmt Formatter
stop bool
failed bool
}
// New initializes a suite which supports the Suite
@ -122,12 +131,15 @@ func (s *suite) Run() {
for _, f := range s.features {
s.runFeature(f)
if s.stop {
if s.failed && cfg.stopOnFailure {
// stop on first failure
break
}
}
s.fmt.Summary()
if s.failed {
os.Exit(1)
}
}
func (s *suite) runStep(step *gherkin.Step) (err error) {
@ -168,18 +180,21 @@ func (s *suite) runStep(step *gherkin.Step) (err error) {
return
}
func (s *suite) runSteps(steps []*gherkin.Step) bool {
var failed bool
func (s *suite) runSteps(steps []*gherkin.Step) (st stepsStatus) {
for _, step := range steps {
if failed {
if st != stepsStatusPassed {
s.fmt.Skipped(step)
continue
}
if err := s.runStep(step); err != nil {
failed = true
err := s.runStep(step)
switch {
case err == errPending:
st = stepsStatusUndefined
case err != nil:
st = stepsStatusFailed
}
}
return failed
return
}
func (s *suite) skipSteps(steps []*gherkin.Step) {
@ -191,7 +206,7 @@ func (s *suite) skipSteps(steps []*gherkin.Step) {
func (s *suite) runFeature(f *gherkin.Feature) {
s.fmt.Node(f)
for _, scenario := range f.Scenarios {
var failed bool
var status stepsStatus
// run before scenario handlers
for _, h := range s.beforeScenarioHandlers {
@ -201,22 +216,27 @@ func (s *suite) runFeature(f *gherkin.Feature) {
// background
if f.Background != nil {
s.fmt.Node(f.Background)
failed = s.runSteps(f.Background.Steps)
status = s.runSteps(f.Background.Steps)
}
// scenario
s.fmt.Node(scenario)
if failed {
switch {
case status == stepsStatusFailed:
s.skipSteps(scenario.Steps)
} else {
failed = s.runSteps(scenario.Steps)
case status == stepsStatusUndefined:
s.skipSteps(scenario.Steps)
default:
status = s.runSteps(scenario.Steps)
}
if failed && cfg.stopOnFailure {
s.stop = true
if status == stepsStatusFailed {
s.failed = true
if cfg.stopOnFailure {
return
}
}
}
}
func (st *suite) printStepDefinitions() {

Просмотреть файл

@ -18,6 +18,8 @@ func (s *suiteFeature) BeforeScenario(scenario *gherkin.Scenario) {
cfg.paths = []string{}
// reset hook test references
s.befScenarioHook = nil
// reset formatter, which collects all details
s.fmt = &testFormatter{}
}
func (s *suiteFeature) iHaveBeforeScenarioHook(args ...*Arg) error {

40
utils_test.go Обычный файл
Просмотреть файл

@ -0,0 +1,40 @@
package godog
import "github.com/DATA-DOG/godog/gherkin"
type testFormatter struct {
features []*gherkin.Feature
scenarios []*gherkin.Scenario
failed []*failed
passed []*passed
skipped []*skipped
undefined []*undefined
}
func (f *testFormatter) Node(node interface{}) {
switch t := node.(type) {
case *gherkin.Feature:
f.features = append(f.features, t)
case *gherkin.Scenario:
f.scenarios = append(f.scenarios, t)
}
}
func (f *testFormatter) Summary() {}
func (f *testFormatter) Passed(step *gherkin.Step, match *stepMatchHandler) {
f.passed = append(f.passed, &passed{step})
}
func (f *testFormatter) Skipped(step *gherkin.Step) {
f.skipped = append(f.skipped, &skipped{step})
}
func (f *testFormatter) Undefined(step *gherkin.Step) {
f.undefined = append(f.undefined, &undefined{step})
}
func (f *testFormatter) Failed(step *gherkin.Step, match *stepMatchHandler, err error) {
f.failed = append(f.failed, &failed{step, err})
}