Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Uilian Ries
Teste Unitário com GTest e Catch
● Motivação
● Por que usar teste unitário?
● Projetos
● Gtest
○ Sobre o projeto
○ Formas de instalar
○ Exemplo
○ Prós e Co...
● Falta de testes unitários nos projetos da Khomp
● Experiências e resultados positivos em projetos anteriores
● Aderência...
● Clarifica a cobertura de código
○ Unit Test + Code Coverage
● Valida a compreensão sobre o código
○ Testes podem servir ...
PROJETOS PARA C++
● CppUnit
● Boost Test
● Google Test
● Aeryn
● Cute
● Fructose
● Catch
Lista com projetos para C++
Google Test - Google C++ Test Framework
● https://github.com/google/googletest
● Licença BSD-3
● ~55 Contribuidores
● ~406...
Google Test
Formas de instalar
# apt-get install libgtest-dev cmake
# cd /usr/src/gtest
# cmake CMakeLists.txt
# cmake --build .
# cmake --build . --targ...
# git clone https://github.com/google/googletest.git
# cd googletest
# cmake CMakeLists.txt
# cmake --build .
# cmake --bu...
$ conan install gtest/1.8.0@lasote/stable
+ Versão estável e atualizada
+ Possui binário por plataforma
+ Possui os fontes...
Google Test
Exemplo
#include <gtest/gtest.h>
int Factorial( int number ) {
return number > 1 ? Factorial(number-1)*number : 1;
}
TEST(Factoria...
class TestString: public ::testing::test {
public:
void SetUp( ) { string_.Assign("Hello"); }
void TearDown( ) {
string_.C...
Google Test
Formas de construir
Google Test
Formas de construir
MANUAL
$ gcc test.cpp -lpthread -lgtest -lgtest_main
● Pthread é dependencia do GTest
● gt...
Google Test
Formas de construir
CMAKE >=3.0.2
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})
add_...
Google Test
Formas de construir
CMAKE >=3.0.2
enable_testing()
add_executable(Foo foo.cpp)
add_test(test-foo foo)
OU
GTEST...
Google Test
Formas de construir
CONAN
# conanfile.txt
[requires]
gtest/1.8.0@lasote/stable
[generators]
cmake
# CMakeLists...
Google Test
Formas de construir
OUTPUT - ASCIINEMA
Running main() from gtest_main.cc
[==========] Running 1 test from 1 te...
Google Test
Formas de construir
Google Test
Prós e contras
Google Test
Formas de construir
● Prós
○ Gama de plugins (jenkins, clion, CDT, cmake)
○ Saída XML (jenkins)
○ Google Mock
...
Catch - C++ Automated Test Cases in Headers
● https://github.com/philsquared/Catch
● Licença BSL-1.0
● ~89 Contribuidores
...
Catch
Formas de instalar
# apt-get install catch
- Versão estável, porém antiga
# wget
https://github.com/philsquared/Catch/releases/download/
v1.9.6/catch.hpp -O /usr/local/include/catch.hpp
+ Versão e...
$ conan install Catch/1.9.5@uilianries/stable
+ Versão estável e atualizada
Catch
Exemplo
#define CATCH_CONFIG_MAIN
#include <catch.hpp>
unsigned int Factorial( unsigned int number ) {
return number > 1 ? Factori...
#define CATCH_CONFIG_MAIN
#include <catch.hpp>
TEST_CASE( "vectors can be sized and resized", "[vector]" ) {
std::vector<i...
SCENARIO( "vectors can be sized and resized", "[vector]" ) {
GIVEN( "A vector with some items" ) {
std::vector<int> v( 5 )...
Catch
Formas de construir
Google Test
Formas de construir
MANUAL
$ gcc test.cpp
● CATCH_CONFIG_MAIN deve ser declarado somente uma vez
Google Test
Formas de construir
CONAN
# conanfile.txt
[requires]
Catch/1.9.5@uilianries/stable
[generators]
cmake
# CMakeL...
Google Test
Formas de construir
OUTPUT - ASCIINEMA
-----------------------------------------------------------------------...
Google Test
Formas de construir
Catch
Prós e contras
Google Test
Formas de construir
● Prós
○ Gama de plugins (Jenkins, CLion, CMake)
○ Saída JUnit (Jenkins)
○ Gamma de assert...
Comparativo GTest x Catch
GTEST
● Largamente utilizada
● Multíplos tipos de assert
● Compila até no GCC-4.1
● Gera report XML
CATCH
● Header Only
● ...
REFERÊNCIAS
● Exploring the C++ Unit Testing Framework Jungle
● A quick introduction to the Google C++ Testing Framework
●...
Dúvidas?
Perguntas?
Curiosidades?
You’ve finished this document.
Download and read it offline.
Upcoming SlideShare
What to Upload to SlideShare
Next
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

Share

Testes Unitários com GTest e Catch

Download to read offline

Nesta apresentação irei demostrar como GTest e Catch podem ajudar nos teste unitários em projetos C/C++

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Testes Unitários com GTest e Catch

  1. 1. Uilian Ries Teste Unitário com GTest e Catch
  2. 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. 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. 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. 5. PROJETOS PARA C++ ● CppUnit ● Boost Test ● Google Test ● Aeryn ● Cute ● Fructose ● Catch Lista com projetos para C++
  6. 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)
  7. 7. Google Test Formas de instalar
  8. 8. # apt-get install libgtest-dev cmake # cd /usr/src/gtest # cmake CMakeLists.txt # cmake --build . # cmake --build . --target install # Ops! # cp *.a /usr/local/lib - Versão estável, porém antiga - Possui apenas os fontes
  9. 9. # git clone https://github.com/google/googletest.git # cd googletest # cmake CMakeLists.txt # cmake --build . # cmake --build . --target install + Versão estável e atualizada - Possui apenas os fontes
  10. 10. $ conan install gtest/1.8.0@lasote/stable + Versão estável e atualizada + Possui binário por plataforma + Possui os fontes, se necessário
  11. 11. Google Test Exemplo
  12. 12. #include <gtest/gtest.h> int Factorial( int number ) { return number > 1 ? Factorial(number-1)*number : 1; } TEST(FactorialTest, Positive) { EXPECT_EQ(1, Factorial(1)); EXPECT_TRUE(2 = Factorial(2)); EXPECT_NOT_EQ(42, Factorial(3)); EXPECT_FALSE(40320 != Factorial(8)); }
  13. 13. class TestString: public ::testing::test { public: void SetUp( ) { string_.Assign("Hello"); } void TearDown( ) { string_.Clear(); ASSERT_TRUE(string_.Empty()) } MyString string_; }; TEST_F(TestString, EraseString) { ASSERT_EQ("Hello", string_.Get()); }
  14. 14. Google Test Formas de construir
  15. 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. 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. 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. 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. 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.
  20. 20. Google Test Formas de construir Google Test Prós e contras
  21. 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. 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
  23. 23. Catch Formas de instalar
  24. 24. # apt-get install catch - Versão estável, porém antiga
  25. 25. # wget https://github.com/philsquared/Catch/releases/download/ v1.9.6/catch.hpp -O /usr/local/include/catch.hpp + Versão estável e atualizada
  26. 26. $ conan install Catch/1.9.5@uilianries/stable + Versão estável e atualizada
  27. 27. Catch Exemplo
  28. 28. #define CATCH_CONFIG_MAIN #include <catch.hpp> unsigned int Factorial( unsigned int number ) { return number > 1 ? Factorial(number-1)*number : 1; } TEST_CASE( "Factorials are computed", "[factorial]" ) { REQUIRE( Factorial(0) == 1 ); REQUIRE( Factorial(1) == 1 ); REQUIRE( Factorial(2) == 2 ); REQUIRE( Factorial(3) == 6 ); REQUIRE( Factorial(10) == 3628800 ); }
  29. 29. #define CATCH_CONFIG_MAIN #include <catch.hpp> TEST_CASE( "vectors can be sized and resized", "[vector]" ) { std::vector<int> v( 5 ); REQUIRE( v.size() == 5 ); REQUIRE( v.capacity() >= 5 ); SECTION( "resizing bigger changes size and capacity" ) { v.resize( 10 ); REQUIRE( v.size() == 10 ); REQUIRE( v.capacity() >= 10 ); } v.clear(); } Set Up Tear Down
  30. 30. SCENARIO( "vectors can be sized and resized", "[vector]" ) { GIVEN( "A vector with some items" ) { std::vector<int> v( 5 ); REQUIRE( v.size() == 5 ); REQUIRE( v.capacity() >= 5 ); WHEN( "the size is increased" ) { v.resize( 10 ); THEN( "the size and capacity change" ) { REQUIRE( v.size() == 10 ); REQUIRE( v.capacity() >= 10 ); } }
  31. 31. Catch Formas de construir
  32. 32. Google Test Formas de construir MANUAL $ gcc test.cpp ● CATCH_CONFIG_MAIN deve ser declarado somente uma vez
  33. 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. 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
  35. 35. Google Test Formas de construir Catch Prós e contras
  36. 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)
  37. 37. Comparativo GTest x Catch
  38. 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. 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”
  40. 40. Dúvidas? Perguntas? Curiosidades?
  • LusoManga

    Aug. 13, 2019

Nesta apresentação irei demostrar como GTest e Catch podem ajudar nos teste unitários em projetos C/C++

Views

Total views

1,321

On Slideshare

0

From embeds

0

Number of embeds

928

Actions

Downloads

6

Shares

0

Comments

0

Likes

1

×