2014-10-14 1 views
3

Странно, когда я строю свои тесты и запускаю их, каждый тест, который я определил (boost BOOST_AUTO_TEST_CASE()), будет выполняться на каждом заданном измерении cmake (cmake's add_test()). Я вполне уверен, что я сделал что-то не так в конфигурации, но не могу, чтобы жизнь меня определяла, что это такое.тест cmake: каждый тест проводится на каждом этапе

корень 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()); 
} 

ответ

4

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) 

Я лично предпочитаю второй подход, как это более структурированные и менее заманчивые, чтобы писать большие модульные тесты, которые имеют слишком много зависимостей от разных компонентов. Но это только личное предпочтение.

+0

Спасибо, я заработал. Однако мне пришлось написать 'projectTest -t hash_structors' (без' */'). – alex