Cucumber-cpp step defiinition runner exits immediately

682 views Asked by At

Based on the instructions given at cucumber-cpp github repo and cucumber-cpp step definition quick-start guide , I created my cucumber step definition files. The features and their step_definition files are under features/ folder, and the cpp code is built with cucumber-cpp headers and linked against libcucumber-cpp.a as instructed.

Cucumber step definition runners should stay running as a seperate process and cucumber command should execute while the runner is running. Indeed, the examples in the cucumber-cpp repository execute like that, but when I create my own step definitions, with gtest or boost test, they execute immediately, without waiting for calls from cucumber.

Onats-MacBook-Pro:bin onatbas$ ./tests/AdditionTest_TESTTARGET 
Running main() from gtest_main.cc
[==========] Running 0 tests from 0 test cases.
[==========] 0 tests from 0 test cases ran. (0 ms total)
[  PASSED  ] 0 tests.
Onats-MacBook-Pro:bin onatbas$ 

Instead of executing immediately, it should say nothing and wait for cucumber calls. I copy-pasted the example code from the cucumber-cpp into my project and they, too, exit immediately. So even though there's no source code difference between cucumber-cpp's examples and mine, they act differently. I suspected the cmake build scripts might be linking with different libraries, but the linkage process is exactly the same too.

Does anybody have any idea on why this might be happening?

Here's the repository with minimum code that reproduces the error I have. https://github.com/onatbas/CucumberCppTest The complete trace is at readme.

The cucumber files are under features/, and ther's only one feature that's identical to what's here

The runner executable is defined in tests/CMakeLists.txt


For quick reference: Here's the step-definition file AdditionTest.cxx

#include <boost/test/unit_test.hpp>
#include <cucumber-cpp/defs.hpp>

#include <CucumberApp.hxx>

using cucumber::ScenarioScope;

struct CalcCtx {
    Calculator calc;
    double result;
};

GIVEN("^I have entered (\\d+) into the calculator$") {
    REGEX_PARAM(double, n);
    ScenarioScope<CalcCtx> context;

    context->calc.push(n);
}

WHEN("^I press add") {
    ScenarioScope<CalcCtx> context;

    context->result = context->calc.add();
}

WHEN("^I press divide") {
    ScenarioScope<CalcCtx> context;

    context->result = context->calc.divide();
}

THEN("^the result should be (.*) on the screen$") {
    REGEX_PARAM(double, expected);
    ScenarioScope<CalcCtx> context;

    BOOST_CHECK_EQUAL(expected, context->result);
}

and here's the tests/CMakeLists.txt file where the executable is added.

cmake_minimum_required(VERSION 3.1)

find_package(Threads)
set(CUCUMBERTEST_TEST_DEPENDENCIES cucumberTest
    ${CMAKE_THREAD_LIBS_INIT} 
    ${GTEST_BOTH_LIBRARIES}
    ${GMOCK_BOTH_LIBRARIES}
    ${CMAKE_THREAD_LIBS_INIT}
    ${Boost_LIBRARIES}
    ${CUCUMBER_BINARIES} 
)

macro(ADD_NEW_CUCUMBER_TEST TEST_SOURCE FOLDER_NAME)
    set (TARGET_NAME ${TEST_SOURCE}_TESTTARGET)
    add_executable(${TARGET_NAME} ${CMAKE_SOURCE_DIR}/features/step_definitions/${TEST_SOURCE})
    target_link_libraries(${TARGET_NAME} ${CUCUMBERTEST_TEST_DEPENDENCIES})
    add_test(NAME ${TEST_SOURCE} COMMAND ${TARGET_NAME})
    set_property(TARGET ${TARGET_NAME} PROPERTY FOLDER ${FOLDER_NAME})
endmacro()

ADD_NEW_CUCUMBER_TEST(AdditionTest  "cucumberTest_tests")
1

There are 1 answers

1
Paolo On BEST ANSWER

Your example outputs

Running main() from gtest_main.cc

That main method will run the test runner's default behaviour instead of Cucumber-CPP's. The main mathod that you want (src/main.cpp) is included as part of the compiled cucumber-cpp library.

Try moving ${CUCUMBER_BINARIES} in CUCUMBERTEST_TEST_DEPENDENCIES before all others, or linking to testing libraries that do not contain a main method (e.g. GoogleTest ships with two libraries: one with and one without the main method).