Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Tecnologia industrial

Dominando Testes Unitários C++ com Catch2: Guia Prático

Resumo

Neste artigo explico como usar catch2 para testes unitários.

Como compilar

Para compilar as fontes, baixe release de https://github.com/catchorg/Catch2/tags. Compile a fonte com gcc. Snippet abaixo mostra script cmake para compilar.

# Defina variáveis de ambiente conforme necessário
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

Integrar na estrutura do projeto

Estrutura de projeto recomendada:

|-- project
|----CMakeLists.txt
|----test
|------cmake
|--------Catch.cmake
|--------CatchAddTests.cmake
|--------FindCatch2.cmake
|--------ParseAndAddCatchTests.cmake
|------Main.cpp
|------ExampleTest1.cpp
|------ExampleTest2.cpp
|------CMakeLists.txt

Configurações no CMakeLists.txt do projeto:

include(CTest)
target_compile_definitions(${TARGET} PRIVATE TEST_DATA_PATH="${PROJECT_SOURCE_DIR}/data")
// defina variável de ambiente ON para habilitar testes
if (BUILD_TESTING)
  enable_testing()
  add_subdirectory(test)
endif()

Configurações no CMakeLists.txt do diretório 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 para bibliotecas desejadas
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})

Como usar

Main.cpp

#define CATCH_CONFIG_MAIN
#include <catch2/catch.hpp>

ExampleTest.cpp

Exemplo mostra testes com 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") {
        // verificar se verdadeiro
        REQUIRE(...);
        // verificar se sem exceção
        REQUIRE_NOTHROW(...);
      }
    }
  }
}

ExampleTest2.cpp

Exemplo mostra testes com 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 );
}

Nota especial para aplicações PLCnext

Para usar catch2 como framework de testes, você deve excluir conteúdo ARP. Compile seu código com compilador gcc local. Com este setup, você pode testar seu código não-ARP localmente.

Mais Informações

Se tem interesse em mais informações sobre catch2, confira:

Licença

A biblioteca é publicada sob Boost Software License 1.0.

Tecnologia industrial

  1. Aprimore a Segurança de SaaS e Nuvem com Testes Automatizados e Monitoramento de Desempenho
  2. Dominando Operadores em C++: Guia Completo com Exemplos Práticos
  3. Laço do-while em C++: Sintaxe, Exemplos Práticos e Loops Aninhados
  4. Dominando Switch-Case em C++: Sintaxe, Uso e Exemplos Práticos
  5. Dominando Alocação Dinâmica de Arrays em C++: Guia Prático com Exemplos de Código
  6. Dominando Ponteiros em C++: Conceitos, Exemplos e Aplicações Práticas
  7. Dominando o Tipo Char em C++: Declaração, ASCII e Técnicas de Conversão
  8. Sobrecarga de Operadores em C++: Guia Prático com Exemplos de Código
  9. Structs em C++ Explicadas com Exemplo Prático
  10. Dominando std::list em C++: Sintaxe, Funções e Exemplos Práticos