cmake тест: Всеки тест се изпълнява на всеки ctest

Странно, когато създам моите тестове и ги стартирам, всеки дефиниран от мен тест (BOOST_AUTO_TEST_CASE() на boost) ще се изпълнява на всеки дефиниран от cmake тест (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());
}

person alex    schedule 14.10.2014    source източник


Отговори (1)


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)

Аз лично предпочитам втория подход, тъй като е по-структуриран и по-малко изкушаващ да пиша големи модулни тестове, които имат твърде много зависимости от различни компоненти. Но това е само лично предпочитание.

person ComicSansMS    schedule 14.10.2014
comment
Благодаря, успях. Трябваше обаче да напиша projectTest -t hash_structors (без */). - person alex; 14.10.2014