4.5. Step - 03 : Run tests with Wire and Cucumber

As mentioned in Design of Cucumber for C/C++, the Ruby based cucumber would interact with the C/++ application. For that we need to create a cucumber.wire file. Let’s create the wire file so that we can run tests with Cucumber based on Ruby and C/C++.

The updated directory structure would be like this:

.
|-- features
|   |-- step_definitions
|   |   |-- cucumber.wire
|   |   `-- steps_addition.cpp
|   |-- CMakeLists.txt
|   `-- simple-addition.feature
`-- CMakeLists.txt
  • features/step_definitions/cucumber.wire

    This new file has the values that cucumber will use to run tests.

    host: localhost
    port: 3902
    

4.5.1. Changes

As compared to previous step (Step - 02 : Add feature files), the diff is:

Files old/CMakeLists.txt and new/CMakeLists.txt are identical
Files old/features/CMakeLists.txt and new/features/CMakeLists.txt are identical
Files old/features/simple-addition.feature and new/features/simple-addition.feature are identical
diff '--unified=3' --new-file --ignore-all-space --text --recursive --show-c-function --report-identical-files old/features/step_definitions/cucumber.wire new/features/step_definitions/cucumber.wire
--- old/features/step_definitions/cucumber.wire	1970-01-01 05:30:00.000000000 +0530
+++ new/features/step_definitions/cucumber.wire	2022-12-11 00:00:00.000000000 +0530
@@ -0,0 +1,2 @@
+host: localhost
+port: 3902
Files old/features/step_definitions/steps_addition.cpp and new/features/step_definitions/steps_addition.cpp are identical

4.5.2. Pre-Compile

As mentioned in Step - 01 : Setup of C/C++ Code, please ensure you run CMake so that workspace is created, and run make all so that feature executable is compiled.

4.5.3. Running feature executable

As a first step, we need to run the feature executable in background.

./features/features -v &

If everything is setup perfectly, the file would run in background and wait for connection and the output looks like this:

Listening on 127.0.0.1:3902

4.5.4. Running cucumber

Now let’s run Cucumber.

cucumber

So far, with what ever we have done, an output which shows failures is expected. We have not setup any steps and hence cucumber gives too many warnings about undefined steps (and helper snippets as well).

The output is as follows.

*** THIS RUBY IMPLEMENTATION DOESN'T REPORT FILE AND LINE FOR PROCS ***
# features/sample-addition.feature
Feature: Simple Addition
  
    Showcase simple addition for the BDD Book.

  Scenario: Addition of single digit numbers # features/simple-addition.feature:7
    Given I have '1' and '3'                 # features/simple-addition.feature:8
    When I add them                          # features/simple-addition.feature:9
    Then The result must be '4'              # features/simple-addition.feature:10

  Scenario: Addition of double digit numbers # features/simple-addition.feature:12
    Given I have '70' and '29'               # features/simple-addition.feature:13
    When I add them                          # features/simple-addition.feature:14
    Then The result must be '99'             # features/simple-addition.feature:15

2 scenarios (2 undefined)
6 steps (6 undefined)
0m0.023s

You can implement step definitions for undefined steps with these snippets:

GIVEN("^I have '1' and '3'$") {
    pending();
}

Given(/^I have '(\d+)' and '(\d+)'$/) do |arg1, arg2|
  pending # Write code here that turns the phrase above into concrete actions
end

WHEN("^I add them$") {
    pending();
}

When(/^I add them$/) do
  pending # Write code here that turns the phrase above into concrete actions
end

THEN("^The result must be '4'$") {
    pending();
}

Then(/^The result must be '(\d+)'$/) do |arg1|
  pending # Write code here that turns the phrase above into concrete actions
end

GIVEN("^I have '70' and '29'$") {
    pending();
}

Given(/^I have '(\d+)' and '(\d+)'$/) do |arg1, arg2|
  pending # Write code here that turns the phrase above into concrete actions
end

THEN("^The result must be '99'$") {
    pending();
}

Then(/^The result must be '(\d+)'$/) do |arg1|
  pending # Write code here that turns the phrase above into concrete actions
end