Збірка і тестування проекту за допомогою cmake і ctest, system development

Думаю що більшість C ++ розробників так чи інакше стикалися з CMake, в той же час що таке CTest і як з його допомогою можна автоматизувати модельне тестування знають далеко не всі.






Для того, що б показати як можна використовувати CMake і CTest разом, я як приклад створив маленьку бібліотечку, що складається з пари рядків коду, яке вміє складати і ділити Крім додатків CMake і CTest, знадобиться якась UnitTest бібліотека (в даному прикладі я взяв Boost.Test, хоча, можна взяти і GoogleTest). Тут варто звернути увагу на те, що CTest не є фреймворком для написання тестів. CTest - це додаток для запуску тестів і, якщо це необхідно, відправлення результатів в будь-яка з підтримуваних сховищ.
Структура директорій з тестовому додатку буде наступна:


./ test
./test/main.cpp
./test/CMakeLists.txt
./ include
./include/calc.h
./ src
./src/CMakeLists.txt
./src/calc.cpp
./CMakeLists.txt

Таки чином, створюємо один кореневий CMakeLists і по одному CMakeLists файлу для опису збірки самої бібліотеки і тестів.

cmake_minimum_required (VERSION 2.6)
project (AutoUnitTests)

SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY
$ / Bin
CACHE PATH
"Single Directory for all"
)

SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY
$ / Bin
CACHE PATH
"Single Directory for all"
)

SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY
$ / Lib
CACHE PATH
"Single Directory for all"






)

find_package (Boost REQUIRED)

add_subdirectory (src build / src)
add_subdirectory (test build / test)

Перші три SET команди не обов'язкові, просто я не люблю коли в процесі складання купа проміжних файлів поміщається в кореневу директорію. А ось наявність команди enable_testing в кореневому CMakeLists файлі на оборот обов'язково, якщо її перенести в CMakeLists з директорії test, то працювати це не буде.
Наступним кроком буде створення CMakeLists файлу в директорії src, чесно сказати, він із себе не найменшого інтересу не представляє:

project (Calc)
set (Calc_source calc.cpp)
add_library (calc STATIC $)

І останній файл, в директорії test:

find_package (Boost COMPONENTS unit_test_framework REQUIRED)

set (test1_source main.cpp)
add_executable (test1 $)
target_link_libraries (test1 $ calc)

add_test (NAME Test1 COMMAND test1)

Єдиним відрізняємо від звичайного CMakeLists файлу буде команда add_test. в яку передається ім'я тесту і те, яку команду необхідно виконати для його запуску. Тобто дана команда цілком може виглядати і так:

add_test (testTkInter "/ usr / bin / python" "-c" "import Tkinter")

Тепер, тести на виконання можна запускати за допомогою команди make test і результат буде виглядати наступним чином:

Running tests.
Test project / home / astavonin / Projects / AutoUnitTest
Start 1: Test1
1/1 Test # 1: Test1. Passed 0.03 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) = 0.56 sec

Якщо ж додати ще один тест, який повинен провалитися, то результати будуть дещо інші:

Running tests.
Test project / home / astavonin / Projects / AutoUnitTest
Start 1: Test1
1/2 Test # 1: Test1. Passed 0.00 sec
Start 2: Test2
2/2 Test # 2: Test2. *** Failed 0.00 sec

50% tests passed, 1 tests failed out of 2

Total Test time (real) = 0.46 sec

The following tests FAILED:
2 - Test2 (Failed)
Errors while running CTest

Консольний висновок тестових додатків буде збережено в директорії ./Testing/Temporary.
Приклад повністю можна скачати тут.

Схожі замітки: