Cmake test: each test is executed in each test phase
The weird thing is, when I create my tests and run them, every test I define (boost BOOST_AUTO_TEST_CASE()
) will run on every test that cmake defined add_test()
). I'm pretty sure I did something wrong in the configuration, but I can't let my life define what it is.
root CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project("project")
-- some library findings and other configs --
enable_testing()
subdirs(test)
subdirs(src)
test 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"
each "test_NAME.hpp" then contains tests like this:
#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());
}
source to share
The team is not as smart as you might expect. In particular, it knows nothing about how to set up a test executable to only run a specific set of tests. add_test
You are now reporting that CMake basically runs the full test suite projectTest
6 times under different names. You have two options for solving this problem.
Or, restrict the test command to only run the correct tests. For Boost Test, this can be easily done using the -t
command line parameter :
add_test(NAME hash_structors COMMAND projectTest -t */hash_structors)
Another option is to break down the tests at baseline:
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)
I personally prefer the second approach as it is more structured and less tempting to write large unit tests that have too many dependencies on different components. But that's just personal preference.
source to share