Освоение C++ юнит-тестирования с Catch2: Практическое руководство
Аннотация
В этой статье я объясню, как использовать catch2 для юнит-тестирования.
Как собрать
Для сборки исходников нужно скачать релиз с https://github.com/catchorg/Catch2/tags. Теперь вы можете скомпилировать исходники с gcc. Следующий фрагмент кода покажет cmake скрипт для компиляции.
# Please set the environment variables to your needs
cmake \
-G "Unix Makefiles" \
-D CMAKE_BUILD_TYPE=Release \
-D BUILD_TESTING=OFF \
-D BUILD_SHARED_LIBS=ON \
-D "CMAKE_STAGING_PREFIX=${CMAKE_STAGING_PREFIX}" \
-D "CMAKE_INSTALL_PREFIX=${CMAKE_STAGING_PREFIX}" \
-D BUILD_TESTS=OFF \
-S "${SOURCE_DIRECTORY}" \
-B "${BUILD_DIRECTORY}"
cmake --build "${BUILD_DIRECTORY}" --target install
Интеграция в структуру проекта
Рекомендуемая структура проекта:
|-- project
|----CMakeLists-txt
|----test
|------cmake
|--------Catch.cmake
|--------CatchAddTests.cmake
|--------FindCatch2.cmake
|--------ParseAndAddCatchTests.cmake
|------Main.cpp
|------ExampleTest1.cpp
|------ExampleTest2.cpp
|------CMakeLists.txt
Настройки в CMakeLists.txt проекта:
include(CTest)
target_compile_definitions(${TARGET} PRIVATE TEST_DATA_PATH="${PROJECT_SOURCE_DIR}/data")
// установите переменную окружения в ON если хотите включить тестирование
if (BUILD_TESTING)
enable_testing()
add_subdirectory(test)
endif()
Настройки в CMakeLists.txt директории test.
cmake_minimum_required(VERSION 3.13)
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/test/cmake")
set (WILDCARD_SOURCE *.cpp)
file(GLOB_RECURSE TEST_SOURCES ${WILDCARD_SOURCE})
add_executable(${TARGET_TEST} ${TEST_SOURCES})
find_package(Catch2 REQUIRED)
# Link to the desired libraries
target_link_libraries(${TARGET_TEST} PRIVATE Catch2::Catch2 ... )
target_compile_definitions(DcmlParserTest PRIVATE TEST_DATA_PATH="${PROJECT_SOURCE_DIR}/data")
include(ParseAndAddCatchTests)
ParseAndAddCatchTests(${TARGET_TEST})
Как использовать
Main.cpp
#define CATCH_CONFIG_MAIN
#include <catch2/catch.hpp>
ExampleTest.cpp
Этот пример показывает, как тестировать с SCENARIOS.
#include <catch2/catch.hpp>
#ifndef DATA_PATH
#define DATA_PATH "/tmp/data"
#endif
SCENARIO("testcase", "") {
GIVEN("usercase 1") {
WHEN("instance is created") {
THEN("test properties") {
// check if true
REQUIRE(...);
// check if no exception
REQUIRE_NOTHROW(...);
}
}
}
}
ExampleTest2.cpp
Этот пример показывает, как тестировать с TEST_CASE.
#include <catch2/catch.hpp>
#ifndef DATA_PATH
#define DATA_PATH "/tmp/data"
#endif
TEST_CASE( "TestCase1", "" ) {
REQUIRE( 1 == 1 );
}
TEST_CASE( "Testcase2", "" ) {
REQUIRE( 3 != 1 );
}
Специальное замечание для приложений PLCnext
Чтобы использовать catch2 как фреймворк тестирования, вам нужно исключить ARP-контент. Вы должны скомпилировать свой код с локальным gcc компилятором. С этой настройкой вы можете тестировать свой не-ARP код локально.
Дополнительная информация
Если вы заинтересованы в получении большей информации о catch2, вы можете проверить следующую ссылку:
Лицензия
Библиотека публикуется под Boost Software License 1.0.
Промышленные технологии
- Усиление безопасности SaaS и облака с помощью автоматизированного тестирования и мониторинга производительно…
- Освоение операторов C++: полное руководство с практическими примерами
- Цикл do-while в C++: синтаксис, примеры и вложенные циклы
- Оператор switch-case в C++: синтаксис, применение и практические примеры
- Динамическое выделение массивов в C++: практическое руководство с примерами кода
- Указатели в C++: концепции, примеры и практические применения
- Тип данных char в C++: объявление, ASCII и методы преобразования
- Перегрузка операторов в C++: практическое руководство с примерами кода
- Структуры (struct) в C++: объяснение с практическим примером
- Освоение std::list в C++: синтаксис, функции и практические примеры