Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Промышленные технологии

Освоение 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.

Промышленные технологии

  1. Усиление безопасности SaaS и облака с помощью автоматизированного тестирования и мониторинга производительно…
  2. Освоение операторов C++: полное руководство с практическими примерами
  3. Цикл do-while в C++: синтаксис, примеры и вложенные циклы
  4. Оператор switch-case в C++: синтаксис, применение и практические примеры
  5. Динамическое выделение массивов в C++: практическое руководство с примерами кода
  6. Указатели в C++: концепции, примеры и практические применения
  7. Тип данных char в C++: объявление, ASCII и методы преобразования
  8. Перегрузка операторов в C++: практическое руководство с примерами кода
  9. Структуры (struct) в C++: объяснение с практическим примером
  10. Освоение std::list в C++: синтаксис, функции и практические примеры