【问题标题】:cmake test: Every test is run on each ctestcmake test:每个测试都在每个 ctest 上运行
【发布时间】:2014-10-14 07:54:33
【问题描述】:

奇怪的是,当我构建测试并运行它们时,我定义的每个测试(boost 的 BOOST_AUTO_TEST_CASE())都将在每个 cmake 定义的测试(cmake 的 add_test())上运行。我很确定我在配置中做错了什么,但我一生都无法弄清楚它是什么。

根 CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project("project")
-- some library findings and other configs --
enable_testing()
subdirs(test)
subdirs(src)

测试 CMakeLists.txt:

add_test(NAME hash_structors COMMAND projectTest)
add_test(NAME hash_makeHash COMMAND projectTest)
add_test(NAME hash_tree_size_compare COMMAND projectTest)
add_test(NAME hash_tree_size_compare_random COMMAND projectTest)
add_test(NAME hash_tree_compare COMMAND projectTest)
add_test(NAME directory_manual COMMAND projectTest)

include_directories(../include)
add_executable(projectTest testMain.cpp
                       ../src/hash.cpp
                       ../src/hash_tree.cpp
                       ../src/directory.cpp)
target_link_libraries(projectTest ${Boost_LIBRARIES}
                              ${CRYPTO++_LIBRARIES})

testMain.cpp:

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE "project tests"
#include <boost/test/unit_test.hpp>
#include "test_hash.hpp"
#include "test_hash_tree.hpp"
#include "test_directory.hpp"

每个 'test_NAME.hpp' 然后包含与此类似的测试:

#include "hash.hpp"
BOOST_AUTO_TEST_CASE(hash_structors)
{
  Hash hash;
  BOOST_CHECK_EQUAL("", hash.getHash());
}
BOOST_AUTO_TEST_CASE(hash_makeHash)
{
  Hash hash = Hash("test");
  BOOST_TEST_MESSAGE(hash.getHash());
  // precomputed hash value for "test"
  BOOST_CHECK_EQUAL("7ab383fc29d81f8d0d68e87c69bae5f1f18266d730c48b1d", hash.getHash());
}

【问题讨论】:

    标签: boost cmake ctest


    【解决方案1】:

    add_test command 并不像您想象的那么聪明。特别是,它不知道如何将测试可执行文件配置为只执行一组特定的测试。

    您现在告诉 CMake 的内容基本上是在 projectTest 中以不同的名称运行全套测试 6 次。您有两种选择来解决此问题。

    要么限制测试命令只执行正确的测试。对于 Boost 测试,这可以通过 -t command line parameter 轻松完成:

    add_test(NAME hash_structors COMMAND projectTest -t */hash_structors)
    

    另一种选择是在源级别拆分测试:

    add_executable(TestHash testHash.cpp ../src/hash.cpp)
    add_test(NAME hash_tests COMMAND TestHash)
    
    add_executable(TestHashTree testHashTree.cpp ../src/hash_tree.cpp)
    add_test(NAME hashtree_tests COMMAND TestHashTree)
    

    我个人更喜欢第二种方法,因为它更有条理,更不容易编写对不同组件有太多依赖的大型单元测试。但这只是个人喜好。

    【讨论】:

    • 谢谢,我搞定了。但是,我必须写projectTest -t hash_structors(没有*/)。
    猜你喜欢
    • 2010-10-18
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    相关资源
    最近更新 更多