Cucumber-cpp 步骤定义运行程序立即退出
Cucumber-cpp step defiinition runner exits immediately
根据 cucumber-cpp github repo and cucumber-cpp step definition quick-start guide 给出的说明,我创建了我的黄瓜步骤定义文件。这些功能及其 step_definition 文件位于 features/
文件夹下,cpp 代码是使用 cucumber-cpp headers 构建的,并按照说明链接到 libcucumber-cpp.a。
Cucumber 步骤定义运行程序应保持 运行 作为单独的进程,并且 cucumber 命令应在运行程序为 运行 时执行。事实上,cucumber-cpp 存储库中的示例就是这样执行的,但是当我使用 gtest 或 boost 测试创建自己的步骤定义时,它们会立即执行,而无需等待 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$
与其立即执行,不如什么也不说,等待黄瓜调用。我 copy-pasted 将 cucumber-cpp 中的示例代码添加到我的项目中,它们也立即退出。因此,尽管 cucumber-cpp 的示例和我的示例之间没有源代码差异,但它们的行为不同。
我怀疑 cmake 构建脚本可能与不同的库链接,但链接过程也完全相同。
有人知道为什么会这样吗?
这是重现我遇到的错误的最少代码的存储库。 https://github.com/onatbas/CucumberCppTest
完整的跟踪在自述文件中。
黄瓜文件在 features/
下,只有一个功能与 here
相同
runner 可执行文件在 tests/CMakeLists.txt
中定义
供快速参考:这是 step-definition 文件
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")
您的示例输出
Running main() from gtest_main.cc
该主要方法将 运行 测试 运行ner 的默认行为而不是 Cucumber-CPP 的默认行为。您想要的主要方法 (src/main.cpp
) 包含在已编译的 cucumber-cpp 库中。
尝试将 ${CUCUMBER_BINARIES}
移动到 CUCUMBERTEST_TEST_DEPENDENCIES
之前,或者链接到不包含 main 方法的测试库(例如 GoogleTest 附带两个库:一个有 main 方法,一个没有 main 方法).
根据 cucumber-cpp github repo and cucumber-cpp step definition quick-start guide 给出的说明,我创建了我的黄瓜步骤定义文件。这些功能及其 step_definition 文件位于 features/
文件夹下,cpp 代码是使用 cucumber-cpp headers 构建的,并按照说明链接到 libcucumber-cpp.a。
Cucumber 步骤定义运行程序应保持 运行 作为单独的进程,并且 cucumber 命令应在运行程序为 运行 时执行。事实上,cucumber-cpp 存储库中的示例就是这样执行的,但是当我使用 gtest 或 boost 测试创建自己的步骤定义时,它们会立即执行,而无需等待 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$
与其立即执行,不如什么也不说,等待黄瓜调用。我 copy-pasted 将 cucumber-cpp 中的示例代码添加到我的项目中,它们也立即退出。因此,尽管 cucumber-cpp 的示例和我的示例之间没有源代码差异,但它们的行为不同。 我怀疑 cmake 构建脚本可能与不同的库链接,但链接过程也完全相同。
有人知道为什么会这样吗?
这是重现我遇到的错误的最少代码的存储库。 https://github.com/onatbas/CucumberCppTest 完整的跟踪在自述文件中。
黄瓜文件在 features/
下,只有一个功能与 here
runner 可执行文件在 tests/CMakeLists.txt
供快速参考:这是 step-definition 文件 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")
您的示例输出
Running main() from gtest_main.cc
该主要方法将 运行 测试 运行ner 的默认行为而不是 Cucumber-CPP 的默认行为。您想要的主要方法 (src/main.cpp
) 包含在已编译的 cucumber-cpp 库中。
尝试将 ${CUCUMBER_BINARIES}
移动到 CUCUMBERTEST_TEST_DEPENDENCIES
之前,或者链接到不包含 main 方法的测试库(例如 GoogleTest 附带两个库:一个有 main 方法,一个没有 main 方法).