diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,4 +16,8 @@
     set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
 endif(CCACHE_FOUND)
 
+# Add the magic taret check and check-all
+add_custom_target(check-all)
+add_custom_target(check)
+
 add_subdirectory(src)
diff --git a/cmake/modules/TestSuite.cmake b/cmake/modules/TestSuite.cmake
new file mode 100644
--- /dev/null
+++ b/cmake/modules/TestSuite.cmake
@@ -0,0 +1,18 @@
+# Allow to easily build test suites
+
+macro(create_test_suite NAME)
+	enable_testing()
+	set(TARGET "check-${NAME}")
+	add_custom_target(${TARGET} COMMAND ${CMAKE_CTEST_COMMAND})
+
+	# If the magic target check-all exists, attack to it.
+	if(TARGET check-all)
+		add_dependencies(check-all ${TARGET})
+	endif()
+endmacro(create_test_suite)
+
+function(add_test_to_suite SUITE NAME)
+	add_executable(${NAME} EXCLUDE_FROM_ALL ${ARGN})
+	add_test(${NAME} ${NAME} COMMAND ${NAME})
+	add_dependencies("check-${SUITE}" ${NAME})
+endfunction(add_test_to_suite)
diff --git a/src/leveldb/CMakeLists.txt b/src/leveldb/CMakeLists.txt
--- a/src/leveldb/CMakeLists.txt
+++ b/src/leveldb/CMakeLists.txt
@@ -172,9 +172,11 @@
 
 option(LEVELDB_BUILD_TESTS "Build LevelDB's unit tests" ON)
 if(LEVELDB_BUILD_TESTS)
-	enable_testing()
+	include(TestSuite)
+	create_test_suite(leveldb)
 
 	add_library(leveldb_test_base
+		EXCLUDE_FROM_ALL
 		util/testharness.cc
 		util/testutil.cc
 	)
@@ -182,9 +184,8 @@
 	target_link_libraries(leveldb_test_base leveldb)
 
 	function(create_leveldb_test NAME FILES)
-		add_executable(${NAME} ${FILES})
+		add_test_to_suite(leveldb ${NAME} EXCLUDE_FROM_ALL ${FILES})
 		target_link_libraries(${NAME} leveldb_test_base)
-		add_test(NAME ${NAME} COMMAND ${NAME})
 	endfunction()
 
 	create_leveldb_test(autocompact_test db/autocompact_test.cc)
diff --git a/src/secp256k1/CMakeLists.txt b/src/secp256k1/CMakeLists.txt
--- a/src/secp256k1/CMakeLists.txt
+++ b/src/secp256k1/CMakeLists.txt
@@ -87,12 +87,12 @@
 # Tests
 option(SECP256K1_BUILD_TEST "Build secp256k1's unit tests" ON)
 if(SECP256K1_BUILD_TEST)
-	enable_testing()
+	include(TestSuite)
+	create_test_suite(secp256k1)
 
 	function(create_secp256k1_test NAME FILES)
-		add_executable(${NAME} ${FILES})
+		add_test_to_suite(secp256k1 ${NAME} EXCLUDE_FROM_ALL ${FILES})
 		target_link_libraries(${NAME} secp256k1)
-		add_test(NAME ${NAME} COMMAND ${NAME})
 		target_compile_definitions(${NAME} PRIVATE HAVE_CONFIG_H)
 	endfunction()
 
diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt
--- a/src/test/CMakeLists.txt
+++ b/src/test/CMakeLists.txt
@@ -47,7 +47,11 @@
 	data/sighash.json
 )
 
-add_executable(test_bitcoin
+include(TestSuite)
+create_test_suite(bitcoin)
+add_dependencies(check check-bitcoin)
+
+add_test_to_suite(bitcoin test_bitcoin
 	arith_uint256_tests.cpp
 	addrman_tests.cpp
 	amount_tests.cpp
diff --git a/src/univalue/CMakeLists.txt b/src/univalue/CMakeLists.txt
--- a/src/univalue/CMakeLists.txt
+++ b/src/univalue/CMakeLists.txt
@@ -21,27 +21,26 @@
 )
 
 if(UNIVALUE_BUILD_TESTS)
-	enable_testing()
+	include(TestSuite)
+	create_test_suite(univalue)
 
-	add_executable(unitester_test test/unitester.cpp)
-	add_test(NAME unitester_test COMMAND unitester_tests)
-	target_link_libraries(unitester_test univalue)
+	function(create_univalue_test NAME FILES)
+		add_test_to_suite(univalue ${NAME} ${FILES})
+		target_link_libraries(${NAME} univalue)
+	endfunction()
 
+	create_univalue_test(unitester_test test/unitester.cpp)
 	target_compile_definitions(unitester_test
 		PUBLIC JSON_TEST_SRC="${PROJECT_SOURCE_DIR}/test"
 	)
 
+	create_univalue_test(no_nul_test test/no_nul.cpp)
+	create_univalue_test(object_test test/object.cpp)
+
+	# test_json is not meant to run in an automated test suite.
 	add_executable(json_test test/test_json.cpp)
-	add_test(NAME json_test COMMAND json_test)
 	target_link_libraries(json_test univalue)
-
-	add_executable(no_nul_test test/no_nul.cpp)
-	add_test(NAME no_nul_test COMMAND no_nul_test)
-	target_link_libraries(no_nul_test univalue)
-
-	add_executable(object_test test/object.cpp)
-	add_test(NAME object_test COMMAND object_test)
-	target_link_libraries(object_test univalue)
+	add_dependencies(check-univalue json_test)
 endif(UNIVALUE_BUILD_TESTS)
 
 # Generate lib/univalue_escapes.h