O documento discute o uso de frameworks de teste unitário GTest e Catch no C++, comparando suas funcionalidades, instalação e construção. É apresentada uma motivação para testes unitários e exemplos de código para ambos frameworks, destacando-se que GTest fornece recursos adicionais como geração de relatórios XML enquanto Catch é header-only.
2. ● Motivação
● Por que usar teste unitário?
● Projetos
● Gtest
○ Sobre o projeto
○ Formas de instalar
○ Exemplo
○ Prós e Contras
● Catch
○ Sobre o projeto
○ Formas de instalar
○ Exemplo
○ Prós e Contras
● Comparativo GTest x Catch
● Uso na Khomp ?
● Referências
AGENDA
3. ● Falta de testes unitários nos projetos da Khomp
● Experiências e resultados positivos em projetos anteriores
● Aderência da comunidade aos projetos GTest e Catch
● “Test Your Software, or Your Users Will”, The Pragmatic Programmer
MOTIVAÇÃO
4. ● Clarifica a cobertura de código
○ Unit Test + Code Coverage
● Valida a compreensão sobre o código
○ Testes podem servir como exemplo
○ Quem escreve o teste precisa compreender a API
○ Descrição das features testadas
● Ratifica novas modificações
○ Teste de regressão
○ Previne build quebrado em produção
POR QUE USAR TESTE UNITÁRIO?
5. PROJETOS PARA C++
● CppUnit
● Boost Test
● Google Test
● Aeryn
● Cute
● Fructose
● Catch
Lista com projetos para C++
6. Google Test - Google C++ Test Framework
● https://github.com/google/googletest
● Licença BSD-3
● ~55 Contribuidores
● ~406 issues
● ~178 Pull Requests
● Multiplataforma
● Utilizado pelos projetos LLVM, OpenCV, Protobuf
● Integração nativa com CMake >=3.1
● Geração de relatório XML (integração Jenkins)
15. Google Test
Formas de construir
MANUAL
$ gcc test.cpp -lpthread -lgtest -lgtest_main
● Pthread é dependencia do GTest
● gtest_main fornece a função main()
16. Google Test
Formas de construir
CMAKE >=3.0.2
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})
add_executable(foo foo.cpp)
target_link_libraries(foo ${GTEST_BOTH_LIBRARIES})
17. Google Test
Formas de construir
CMAKE >=3.0.2
enable_testing()
add_executable(Foo foo.cpp)
add_test(test-foo foo)
OU
GTEST_ADD_TESTS(foo foo.cpp)
18. Google Test
Formas de construir
CONAN
# conanfile.txt
[requires]
gtest/1.8.0@lasote/stable
[generators]
cmake
# CMakeLists.txt
add_executable(foo foo.cpp)
target_link_libraries(foo ${CONAN_LIBS})
19. Google Test
Formas de construir
OUTPUT - ASCIINEMA
Running main() from gtest_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from TestingEncryption
[ RUN ] TestingEncryption.cipher
[ OK ] TestingEncryption.cipher (2 ms)
[----------] 1 test from TestingEncryption (2 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (2 ms total)
[ PASSED ] 1 test.
21. Google Test
Formas de construir
● Prós
○ Gama de plugins (jenkins, clion, CDT, cmake)
○ Saída XML (jenkins)
○ Google Mock
○ Gamma de assert (ASSERT_…)
○ Portabilidade
○ Boa opção para TDD
● Contras
○ Valgrind falso-positivos
22. Catch - C++ Automated Test Cases in Headers
● https://github.com/philsquared/Catch
● Licença BSL-1.0
● ~89 Contribuidores
● ~108 Issues
● ~20 Pull Requests
● Header only
● Utilizado pelos projetos Trompeloeil, ChaiScript
● Integração nativa com CLion
● Uso em TDD e BDD
32. Google Test
Formas de construir
MANUAL
$ gcc test.cpp
● CATCH_CONFIG_MAIN deve ser declarado somente uma vez
33. Google Test
Formas de construir
CONAN
# conanfile.txt
[requires]
Catch/1.9.5@uilianries/stable
[generators]
cmake
# CMakeLists.txt
enable_testing()
add_executable(foo foo.cpp)
add_test(test-foo foo)
34. Google Test
Formas de construir
OUTPUT - ASCIINEMA
------------------------------------------------------------------------------
Scenario: vectors can be sized and resized
Given: A vector with some items
When: the size is increased
Then: the size and capacity change
...............................................................................
PASSED:
REQUIRE( v.size() == 10 )
with expansion:
10 == 10
36. Google Test
Formas de construir
● Prós
○ Gama de plugins (Jenkins, CLion, CMake)
○ Saída JUnit (Jenkins)
○ Gamma de assert (ASSERT_…)
○ Decomposição de expressão
○ Boa opção para TDD e BDD
● Contras
○ Não possui Mock
○ Incremento de tempo durante build (~3 seg)
38. GTEST
● Largamente utilizada
● Multíplos tipos de assert
● Compila até no GCC-4.1
● Gera report XML
CATCH
● Header Only
● TDD e BDD
● Gera report JUnit
● Compila até no GCC-4.1
39. REFERÊNCIAS
● Exploring the C++ Unit Testing Framework Jungle
● A quick introduction to the Google C++ Testing Framework
● Test your project with Google Test
● Testing C++ With A New Catch
● CppCon 2015: Phil Nash “Test Driven C++ with Catch”