4.3. Step - 01 : Setup of C/C++ Code

Before we start running BDD Tests, we need to setup C/C++ Code first, and ensure our C/C++ compiles.

We will have the following initial directory structure:

.
|-- features
|   |-- step_definitions
|   |   `-- steps_addition.cpp
|   `-- CMakeLists.txt
`-- CMakeLists.txt

The contents of the files as under for the time being.

  • features/step_definitions/steps_addition.cpp

    This is the file would eventually have the Step Definitions. The contents of the file as as under. As of now empty.

    // features/step_definitions/steps_addition.cpp
    //
    // Just an Empty CPP File to allow compilation.
    
  • features/CMakeLists.txt

    This is the file creates the feature executable. We use CMake for compilation. The file looks like like this.

    PROJECT(features)
    
    FILE(
        GLOB
        all_files
        step_definitions/*.cpp
        step_definitions/*.hpp
    )
    
    ADD_EXECUTABLE(${PROJECT_NAME} ${all_files})
    
    TARGET_LINK_LIBRARIES(
        ${PROJECT_NAME}
        CucumberCpp::cucumber-cpp
    )
    
  • <TOP>/CMakeLists.txt

    The top level CMakeLists.txt is required for the project/solution.

    CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
    
    PROJECT(DemoBDD)
    
    INCLUDE(/usr/local/lib/cmake/CucumberCppConfig.cmake)
    
    SET(BOOST_MIN_VERSION "1.51")
    
    SET(CUKE_CORE_BOOST_LIBS
        thread
        system
        regex
        date_time
        program_options
        filesystem
    )
    FIND_PACKAGE(
        Boost
        ${BOOST_MIN_VERSION}
        COMPONENTS ${CUKE_CORE_BOOST_LIBS}
        REQUIRED
    )
    
    FIND_PACKAGE(
        GMock
        REQUIRED
    )
    FIND_PACKAGE(
        GTest
        REQUIRED
    )
    
    ADD_SUBDIRECTORY(features)
    

4.3.1. Use CMake

Using CMake, if we configure a work space, the command looks like this:

cmake -S . -B ../_01-setup-cpp-code

If everything is setup perfectly, the output looks like this:

-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Boost: /usr/lib/x86_64-linux-gnu/cmake/Boost-1.74.0/BoostConfig.cmake (found suitable version "1.74.0", minimum required is "1.51") found components: thread system regex date_time program_options filesystem 
-- Found Threads: TRUE  
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.2") 
-- Using /usr/src/googletest/googlemock/ as gmock source directory
-- Checking for module 'gtest'
--   Found gtest, version 1.11.0
-- Using GTest v1.11.0 (parsed from pkg-config)
-- Found GTest: /usr/lib/x86_64-linux-gnu/cmake/GTest/GTestConfig.cmake (found version "1.11.0")  
-- Configuring done
-- Generating done
-- Build files have been written to: /home/c6h6/data/p/book-tests/pgh_tech-bdd/book/csrc/_01-setup-cpp-code

4.3.2. Compile the feature executable

Since CMake has created workspace based on makefile, if we run:

make all

If everything is setup perfectly, the output looks like this:

[ 10%] Creating directories for 'GMock'
[ 20%] No download step for 'GMock'
[ 30%] No update step for 'GMock'
[ 40%] No patch step for 'GMock'
[ 50%] Performing configure step for 'GMock'
-- The CXX compiler identification is GNU 11.4.0
-- The C compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Found Python: /home/c6h6/.virtualenvs/ratu7env/bin/python3.10 (found version "3.10.12") found components: Interpreter 
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE  
-- Configuring done
-- Generating done
-- Build files have been written to: /home/c6h6/data/p/book-tests/pgh_tech-bdd/book/csrc/_01-setup-cpp-code/gmock
[ 60%] Performing build step for 'GMock'
[ 12%] Building CXX object /home/c6h6/data/p/book-tests/pgh_tech-bdd/book/csrc/_01-setup-cpp-code/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o
[ 25%] Linking CXX static library /home/c6h6/data/p/book-tests/pgh_tech-bdd/book/csrc/_01-setup-cpp-code/gmock/lib/libgtest.a
[ 25%] Built target gtest
[ 37%] Building CXX object CMakeFiles/gmock.dir/src/gmock-all.cc.o
[ 50%] Linking CXX static library lib/libgmock.a
[ 50%] Built target gmock
[ 62%] Building CXX object CMakeFiles/gmock_main.dir/src/gmock_main.cc.o
[ 75%] Linking CXX static library lib/libgmock_main.a
[ 75%] Built target gmock_main
[ 87%] Building CXX object /home/c6h6/data/p/book-tests/pgh_tech-bdd/book/csrc/_01-setup-cpp-code/googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o
[100%] Linking CXX static library /home/c6h6/data/p/book-tests/pgh_tech-bdd/book/csrc/_01-setup-cpp-code/gmock/lib/libgtest_main.a
[100%] Built target gtest_main
[ 70%] No install step for 'GMock'
[ 80%] Completed 'GMock'
[ 80%] Built target GMock
[ 90%] Building CXX object features/CMakeFiles/features.dir/step_definitions/steps_addition.cpp.o
[100%] Linking CXX executable features
[100%] Built target features

And, we must have a feature executable generated.

4.3.3. Executing the generated executable

We are not yet ready to run any tests, but let’s just run help command over the generated executable:

./features/features --help

If everything is setup perfectly, the output looks like this:

Allowed options:
  -h [ --help ]         help for cucumber-cpp
  -v [ --verbose ]      verbose output
  -l [ --listen ] arg   listening address of wireserver
  -p [ --port ] arg     listening port of wireserver, use '0' (zero) to select 
                        an ephemeral port
  -u [ --unix ] arg     listening unix socket of wireserver (disables listening
                        on port)