2017-01-01 99 views
1

根据cucumber-cpp github repocucumber-cpp step definition quick-start guide的说明,我创建了我的黄瓜步骤定义文件。这些功能及其step_definition文件位于features/文件夹下,cpp代码使用cucumber-cpp标题构建,并按照指示与libcucumber-cpp.a链接。Cucumber-cpp step defiinition runner立即退出

黄瓜步骤定义运动员应该保持运行作为一个单独的过程,黄瓜命令应该在跑步者跑步时执行。事实上,cucumber-cpp存储库中的例子就是这样执行的,但是当我使用gtest或boost测试创建自己的步骤定义时,它们立即执行,而不用等待来自黄瓜的调用。

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$ 

而不是立即执行,它应该什么也不说,并等待黄瓜的电话。我将cucumber-cpp中的示例代码复制粘贴到我的项目中,他们也立即退出。因此,即使cucumber-cpp的例子和我的例子没有源代码的区别,它们的行为也不同。 我怀疑cmake构建脚本可能与不同的库链接,但链接过程也完全相同。

有没有人有任何想法,为什么这可能会发生?

下面是存储库中的最小代码,它重现了我的错误。 https://github.com/onatbas/CucumberCppTest 完整的跟踪文件位于自述文件中。

黄瓜文件features/下,和疗法只有一个功能,就是等同于什么here

转轮可执行文件在tests/CMakeLists.txt


定义为快速参考:这里的步骤定义文件 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); 
} 

这里是添加可执行文件的tests/CMakeLists.txt文件。

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") 

回答

2

你的榜样输出

Running main() from gtest_main.cc 

这主要方法将运行测试运行的默认行为,而不是黄瓜-CPP的。您想要的主要方法(src/main.cpp)作为编译的cucumber-cpp库的一部分。

尝试在CUCUMBERTEST_TEST_DEPENDENCIES之前移动${CUCUMBER_BINARIES},或链接到不包含主要方法的测试库(例如,GoogleTest附带两个库:一个带有而另一个没有主要方法)。

+0

谢谢,最初当我尝试时,boost链接器错误使我认为我做错了什么。看起来我没有链接一些增强库。所以,我所做的是,首先将CUCUMBER_TEST_DEPENDENCIES中的CUCUMBER_BINARIES移动到最上方,其次,我将这些增强目标添加到了configure_boost.cmake,chrono和program_options中。 现在它像一个魅力和正确的主要方法链接,确实。 谢谢! 我会提交最新版本,并将其留作未来参考。 – Akaedintov