cmake测试:每个测试在每个 ctest 上运行

3

奇怪的是,当我构建我的测试并运行它们时,我定义的每个测试(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());
}
1个回答

4

add_test 命令 不像你想象的那样聪明。特别是,它对于如何配置测试可执行文件以仅执行特定一组测试一无所知。

现在你告诉 CMake 的基本上是在不同名称下运行完整的 projectTest 测试集 6 次。你有两个选项来解决这个问题。

要么限制测试命令仅执行正确的测试。对于 Boost Test,这可以通过 -t 命令行参数 轻松完成:

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(没有 */)。 - alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接