initial tests for event stream formatter
Этот коммит содержится в:
родитель
e71d596404
коммит
c50c2dc368
5 изменённых файлов: 163 добавлений и 13 удалений
78
features/formatter/events.feature
Обычный файл
78
features/formatter/events.feature
Обычный файл
|
@ -0,0 +1,78 @@
|
|||
Feature: event stream formatter
|
||||
In order to have universal cucumber formatter
|
||||
As a test suite
|
||||
I need to be able to support event stream formatter
|
||||
|
||||
Scenario: should fire only suite events without any scenario
|
||||
Given a feature path "features/load.feature:4"
|
||||
When I run feature suite with formatter "events"
|
||||
Then the following events should be fired:
|
||||
"""
|
||||
TestRunStarted
|
||||
TestSource
|
||||
TestRunFinished
|
||||
"""
|
||||
|
||||
Scenario: should process simple scenario
|
||||
Given a feature path "features/load.feature:21"
|
||||
When I run feature suite with formatter "events"
|
||||
Then the following events should be fired:
|
||||
"""
|
||||
TestRunStarted
|
||||
TestSource
|
||||
TestCaseStarted
|
||||
StepDefinitionFound
|
||||
TestStepStarted
|
||||
TestStepFinished
|
||||
StepDefinitionFound
|
||||
TestStepStarted
|
||||
TestStepFinished
|
||||
StepDefinitionFound
|
||||
TestStepStarted
|
||||
TestStepFinished
|
||||
TestCaseFinished
|
||||
TestRunFinished
|
||||
"""
|
||||
|
||||
Scenario: should process outline scenario
|
||||
Given a feature path "features/load.feature:29"
|
||||
When I run feature suite with formatter "events"
|
||||
Then the following events should be fired:
|
||||
"""
|
||||
TestRunStarted
|
||||
TestSource
|
||||
TestCaseStarted
|
||||
StepDefinitionFound
|
||||
TestStepStarted
|
||||
TestStepFinished
|
||||
StepDefinitionFound
|
||||
TestStepStarted
|
||||
TestStepFinished
|
||||
StepDefinitionFound
|
||||
TestStepStarted
|
||||
TestStepFinished
|
||||
TestCaseFinished
|
||||
TestCaseStarted
|
||||
StepDefinitionFound
|
||||
TestStepStarted
|
||||
TestStepFinished
|
||||
StepDefinitionFound
|
||||
TestStepStarted
|
||||
TestStepFinished
|
||||
StepDefinitionFound
|
||||
TestStepStarted
|
||||
TestStepFinished
|
||||
TestCaseFinished
|
||||
TestCaseStarted
|
||||
StepDefinitionFound
|
||||
TestStepStarted
|
||||
TestStepFinished
|
||||
StepDefinitionFound
|
||||
TestStepStarted
|
||||
TestStepFinished
|
||||
StepDefinitionFound
|
||||
TestStepStarted
|
||||
TestStepFinished
|
||||
TestCaseFinished
|
||||
TestRunFinished
|
||||
"""
|
|
@ -8,10 +8,11 @@ Savybė: užkrauti savybes
|
|||
Scenarijus: savybių užkrovimas iš aplanko
|
||||
Duota savybių aplankas "features"
|
||||
Kai aš išskaitau savybes
|
||||
Tada aš turėčiau turėti 7 savybių failus:
|
||||
Tada aš turėčiau turėti 8 savybių failus:
|
||||
"""
|
||||
features/background.feature
|
||||
features/events.feature
|
||||
features/formatter/events.feature
|
||||
features/lang.feature
|
||||
features/load.feature
|
||||
features/outline.feature
|
||||
|
|
|
@ -6,10 +6,11 @@ Feature: load features
|
|||
Scenario: load features within path
|
||||
Given a feature path "features"
|
||||
When I parse features
|
||||
Then I should have 7 feature files:
|
||||
Then I should have 8 feature files:
|
||||
"""
|
||||
features/background.feature
|
||||
features/events.feature
|
||||
features/formatter/events.feature
|
||||
features/lang.feature
|
||||
features/load.feature
|
||||
features/outline.feature
|
||||
|
|
17
fmt_test.go
17
fmt_test.go
|
@ -1,12 +1,27 @@
|
|||
package godog
|
||||
|
||||
import "github.com/DATA-DOG/godog/gherkin"
|
||||
import (
|
||||
"io"
|
||||
"time"
|
||||
|
||||
"github.com/DATA-DOG/godog/gherkin"
|
||||
)
|
||||
|
||||
type testFormatter struct {
|
||||
basefmt
|
||||
scenarios []interface{}
|
||||
}
|
||||
|
||||
func testFormatterFunc(out io.Writer) Formatter {
|
||||
return &testFormatter{
|
||||
basefmt: basefmt{
|
||||
started: time.Now(),
|
||||
indent: 2,
|
||||
out: out,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (f *testFormatter) Node(node interface{}) {
|
||||
f.basefmt.Node(node)
|
||||
switch t := node.(type) {
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package godog
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
|
@ -18,6 +20,7 @@ func SuiteContext(s *Suite) {
|
|||
s.Step(`^I parse features$`, c.parseFeatures)
|
||||
s.Step(`^I'm listening to suite events$`, c.iAmListeningToSuiteEvents)
|
||||
s.Step(`^I run feature suite$`, c.iRunFeatureSuite)
|
||||
s.Step(`^I run feature suite with formatter "([^"]*)"$`, c.iRunFeatureSuiteWithFormatter)
|
||||
s.Step(`^a feature "([^"]*)" file:$`, c.aFeatureFile)
|
||||
s.Step(`^the suite should have (passed|failed)$`, c.theSuiteShouldHave)
|
||||
|
||||
|
@ -32,6 +35,9 @@ func SuiteContext(s *Suite) {
|
|||
s.Step(`^the following steps? should be (passed|failed|skipped|undefined|pending):`, c.followingStepsShouldHave)
|
||||
s.Step(`^the undefined step snippets should be:$`, c.theUndefinedStepSnippetsShouldBe)
|
||||
|
||||
// event stream
|
||||
s.Step(`^the following events should be fired:$`, c.thereShouldBeEventsFired)
|
||||
|
||||
// lt
|
||||
s.Step(`^savybių aplankas "([^"]*)"$`, c.featurePath)
|
||||
s.Step(`^aš išskaitau savybes$`, c.parseFeatures)
|
||||
|
@ -54,20 +60,59 @@ type suiteContext struct {
|
|||
paths []string
|
||||
testedSuite *Suite
|
||||
events []*firedEvent
|
||||
fmt *testFormatter
|
||||
out bytes.Buffer
|
||||
}
|
||||
|
||||
func (s *suiteContext) ResetBeforeEachScenario(interface{}) {
|
||||
// reset whole suite with the state
|
||||
s.fmt = &testFormatter{}
|
||||
s.out.Reset()
|
||||
s.paths = []string{}
|
||||
s.testedSuite = &Suite{fmt: s.fmt}
|
||||
s.testedSuite = &Suite{}
|
||||
// our tested suite will have the same context registered
|
||||
SuiteContext(s.testedSuite)
|
||||
// reset all fired events
|
||||
s.events = []*firedEvent{}
|
||||
}
|
||||
|
||||
func (s *suiteContext) iRunFeatureSuiteWithFormatter(name string) error {
|
||||
f, err := findFmt(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s.testedSuite.fmt = f(&s.out)
|
||||
if err := s.parseFeatures(); err != nil {
|
||||
return err
|
||||
}
|
||||
s.testedSuite.run()
|
||||
s.testedSuite.fmt.Summary()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *suiteContext) thereShouldBeEventsFired(doc *gherkin.DocString) error {
|
||||
actual := strings.Split(strings.TrimSpace(s.out.String()), "\n")
|
||||
expect := strings.Split(strings.TrimSpace(doc.Content), "\n")
|
||||
if len(expect) != len(actual) {
|
||||
return fmt.Errorf("expected %d events, but got %d", len(expect), len(actual))
|
||||
}
|
||||
|
||||
type ev struct {
|
||||
Event string
|
||||
}
|
||||
|
||||
for i, event := range actual {
|
||||
exp := strings.TrimSpace(expect[i])
|
||||
var act ev
|
||||
if err := json.Unmarshal([]byte(event), &act); err != nil {
|
||||
return fmt.Errorf("failed to read event data: %v", err)
|
||||
}
|
||||
|
||||
if act.Event != exp {
|
||||
return fmt.Errorf(`expected event: "%s" at position: %d, but actual was "%s"`, exp, i, act.Event)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *suiteContext) cleanupSnippet(snip string) string {
|
||||
lines := strings.Split(strings.TrimSpace(snip), "\n")
|
||||
for i := 0; i < len(lines); i++ {
|
||||
|
@ -77,10 +122,14 @@ func (s *suiteContext) cleanupSnippet(snip string) string {
|
|||
}
|
||||
|
||||
func (s *suiteContext) theUndefinedStepSnippetsShouldBe(body *gherkin.DocString) error {
|
||||
actual := s.cleanupSnippet(s.fmt.snippets())
|
||||
f, ok := s.testedSuite.fmt.(*testFormatter)
|
||||
if !ok {
|
||||
return fmt.Errorf("this step requires testFormatter, but there is: %T", s.testedSuite.fmt)
|
||||
}
|
||||
actual := s.cleanupSnippet(f.snippets())
|
||||
expected := s.cleanupSnippet(body.Content)
|
||||
if actual != expected {
|
||||
return fmt.Errorf("snippets do not match actual: %s", s.fmt.snippets())
|
||||
return fmt.Errorf("snippets do not match actual: %s", f.snippets())
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -89,25 +138,29 @@ func (s *suiteContext) followingStepsShouldHave(status string, steps *gherkin.Do
|
|||
var expected = strings.Split(steps.Content, "\n")
|
||||
var actual, unmatched, matched []string
|
||||
|
||||
f, ok := s.testedSuite.fmt.(*testFormatter)
|
||||
if !ok {
|
||||
return fmt.Errorf("this step requires testFormatter, but there is: %T", s.testedSuite.fmt)
|
||||
}
|
||||
switch status {
|
||||
case "passed":
|
||||
for _, st := range s.fmt.passed {
|
||||
for _, st := range f.passed {
|
||||
actual = append(actual, st.step.Text)
|
||||
}
|
||||
case "failed":
|
||||
for _, st := range s.fmt.failed {
|
||||
for _, st := range f.failed {
|
||||
actual = append(actual, st.step.Text)
|
||||
}
|
||||
case "skipped":
|
||||
for _, st := range s.fmt.skipped {
|
||||
for _, st := range f.skipped {
|
||||
actual = append(actual, st.step.Text)
|
||||
}
|
||||
case "undefined":
|
||||
for _, st := range s.fmt.undefined {
|
||||
for _, st := range f.undefined {
|
||||
actual = append(actual, st.step.Text)
|
||||
}
|
||||
case "pending":
|
||||
for _, st := range s.fmt.pending {
|
||||
for _, st := range f.pending {
|
||||
actual = append(actual, st.step.Text)
|
||||
}
|
||||
default:
|
||||
|
@ -231,7 +284,9 @@ func (s *suiteContext) iRunFeatureSuite() error {
|
|||
if err := s.parseFeatures(); err != nil {
|
||||
return err
|
||||
}
|
||||
s.testedSuite.fmt = testFormatterFunc(&s.out)
|
||||
s.testedSuite.run()
|
||||
s.testedSuite.fmt.Summary()
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче