1

cucumber-cpp github repoおよびcucumber-cpp step definition quick-start guideに記載されている指示に基づいて、cucumber ステップ定義ファイルを作成しました。機能とその step_definition ファイルはfeatures/フォルダーの下にあり、cpp コードは cucumber-cpp ヘッダーでビルドされ、指示に従って 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$ 

すぐに実行するのではなく、何も言わずにキュウリの呼び出しを待つ必要があります。cucumber-cpp のサンプル コードをプロジェクトにコピー アンド ペーストしたところ、それらもすぐに終了しました。そのため、cucumber-cpp の例と私の例の間にソース コードの違いはありませんが、動作が異なります。cmake ビルド スクリプトが別のライブラリとリンクしているのではないかと疑っていましたが、リンク プロセスもまったく同じです。

なぜこれが起こっているのか、誰にも分かりますか?

これは、私が持っているエラーを再現する最小限のコードを含むリポジトリです。https://github.com/onatbas/CucumberCppTest 完全なトレースは readme にあります。

きゅうりファイルは の下にあり、ここfeatures/にあるものと同一の機能は 1 つだけです。

ランナー実行可能ファイルはで定義されています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);
}

実行可能ファイルが追加される te​​sts/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")
4

1 に答える 1

2

あなたの例の出力

Running main() from gtest_main.cc

そのメイン メソッドは、Cucumber-CPP の代わりにテスト ランナーのデフォルトの動作を実行します。必要な主要な計算 ( src/main.cpp) は、コンパイルされた cucumber-cpp ライブラリの一部として含まれています。

他のすべての前に移動${CUCUMBER_BINARIES}するCUCUMBERTEST_TEST_DEPENDENCIESか、メイン メソッドを含まないテスト ライブラリにリンクしてみてください (たとえば、GoogleTest には、メイン メソッドを含むライブラリと含まないライブラリの 2 つが付属しています)。

于 2017-01-02T21:15:59.700 に答える