Coder Social home page Coder Social logo

cucumber-ruby-core's Introduction

#cucumber-core

Chat with us Build Status Code Climate Coverage Status Dependency Status

Cucumber Core is the inner hexagon for the Ruby flavour of Cucumber.

It contains the core domain logic to execute Cucumber features. It has no user interface, just a Ruby API. If you're interested in how Cucumber works, or in building other tools that work with Gherkin documents, you've come to the right place.

##An overview

The entry-point is a single method on the module Cucumber::Core called #execute. Here's what it does:

  1. Parses the plain-text Gherkin documents into an AST
  2. Compiles the AST down to test cases
  3. Passes the test cases through any filters
  4. Executes the test cases, emitting events as it goes

We've introduced a number of concepts here, so let's go through them in detail.

###The AST

The Abstract Syntax Tree or AST is an object graph that represents the Gherkin documents you've passed into the core. Things like Feature, Scenario and ExamplesTable.

These are immutable value objects.

###Test cases

Your gherkin might contain scenarios, as well as examples from tables beneath a scenario outline.

Test cases represent the general case of both of these. We compile the AST down to instances of Cucumber::Core::Test::Case, each containing a number of instances of Cucumber::Core::Test::Step. It's these that are then filtered and executed.

Test cases and their test steps are also immutable value objects.

###Filters

Once we have the test cases, and they've been activated by the mappings, you may want to pass them through a filter or two. Filters can be used to do things like activate, sort, replace or remove some of the test cases or their steps before they're executed.

###Events

Events are how you find out what is happening during your test run. As the test cases and steps are executed, the runner emits events to signal what's going on.

The following events are emitted during a run:

That's probably best illustrated with an example.

##Example

Here's an example of how you might use Cucumber::Core#execute

require 'cucumber/core'
require 'cucumber/core/filter'

# This is the most complex part of the example. The filter takes test cases as input,
# activates each step with an action block, then passes a new test case with those activated
# steps in it on to the next filter in the chain.
class ActivateSteps < Cucumber::Core::Filter.new
  def test_case(test_case)
    test_steps = test_case.test_steps.map do |step|
      activate(step)
    end

    test_case.with_steps(test_steps).describe_to(receiver)
  end

  private

  def activate(step)
    case step.name
    when /fail/
      step.with_action { raise Failure }
    when /pass/
      step.with_action {}
    else
      step
    end
  end
end

# Create a Gherkin document to run
feature = Cucumber::Core::Gherkin::Document.new(__FILE__, <<-GHERKIN)
Feature:
  Scenario:
    Given passing
    And failing
    And undefined
GHERKIN

# Create a runner class that uses the Core's DSL
class MyRunner
  include Cucumber::Core
end

# Now execute the feature, using the filter we built, and subscribing to
# an event so we can print the output.
MyRunner.new.execute([feature], [ActivateSteps.new]) do |events|
  events.on(:test_step_finished) do |event|
    test_step, result = event.test_step, event.result
    puts "#{test_step.name} #{result}"
  end
end

If you run this little Ruby script, you should see the following output:

passing ✓
failing ✗
undefined ?

Copyright

Copyright (c) Cucumber Limited.

cucumber-ruby-core's People

Contributors

mattwynne avatar tooky avatar brasmusson avatar adbatista avatar tom025 avatar benjis avatar aslakhellesoy avatar os97673 avatar orend avatar richarda avatar almostwhitehat avatar erran avatar splattael avatar pdswan avatar twalpole avatar kgrz avatar kevgo avatar kosmas avatar gitter-badger avatar

Watchers

James Cloos avatar Teoti Nathaniel avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.