Google Test Czigány András
Témák●        Unit teszt: mire jó, miért, mikor, mivel?●        Google Test Framework    ●        Alapok    ●        Finom...
Unit teszt
Unit teszt: mire jó?●    Unit: a kód legkisebb, önmagában tesztelhető egysége●    C → függvény●    C++ → osztály●    Izolá...
Unit teszt: miért?●    Szeretsz bugokat javítgatni?●    Szeretsz doksit írni?●    Változik az elképzelésed kódolás közben?...
Unit teszt: mikor?●    Röviden: MINDIG :-)●    Ha fontos a szoftver minősége.●    Ha számít mennyit kell karbantartani.●  ...
Unit teszt: mivel?●        Keretrendszerek: CppUnit, CxxTest, Boost.Test,        UnitTest++, Google Test●        Legtöbbjü...
Google Test    Miért érdemes használni?●    Hordozható: exception és RTTI nélkül is megy.●    Nem fatális assert: egy futá...
Alapok: TEST(...)Elég a dumából, írjunk tesztet:#include "sample1.h"#include "gtest/gtest.h"TEST(FactorialTest, Zero) { AS...
Alapok: ASSERT_*●        Érték, objektum:    ●        TRUE, FALSE    ●        EQ, NE, LT, LE, GT, GE    ●        FLOAT_EQ,...
Alapok: fixtúrák I.class QueueTest : public ::testing::Test {  protected:  virtual void SetUp() {   q1_.Enqueue(1);   q2_....
Alapok: fixtúrák II.TEST_F(QueueTest, IsEmptyInitially) { EXPECT_EQ(0, q0_.size());}TEST_F(QueueTest, DequeueWorks) { int*...
Control flowHa control flow alapján dől el:●    SUCCEED()●    FAIL(), ADD_FAILURE(),    ADD_FAILURE_AT(“file_path”, line_n...
ExceptionASSERT_*, EXPECT_*:●    Típusos: THROW●    Bármi: ANY_THROW●    Semmi: NO_THROWASSERT_THROW(Foo(5), bar_exception...
PredikátumASSERT_*, EXPECT_*:●    PRED1(bool (*pred1fv)(arg1), test_arg1)●    Jelenleg öt argumentumig implementált.// Ret...
Extrák: death tesztelésASSERT_*, EXPECT_*:●    DEATH, DEATH_IF_SUPPORTED●    EXITTEST(MyDeathTest, Foo) {  // This death t...
Extrák: SCOPED_TRACEvoid Sub1(int n) {  EXPECT_EQ(1, Bar(n));  EXPECT_EQ(2, Bar(n + 1));}TEST(FooTest, Bar) { {    SCOPED_...
Extrák: TRACE kimenetpath/to/foo_test.cc:11: FailureValue of: Bar(n)Expected: 1  Actual: 2   Trace:path/to/foo_test.cc:17:...
Extrák: globális fixtúraclass Environment { public:  virtual ~Environment() {}  // Override this to define how to set up t...
Extrák: érték paraméterclass FooTest : public ::testing::TestWithParam<constchar*> {  // You can implement all the usual f...
Extrák: érték paraméter II.●    Values(v1, v2, ..., vN)●    ValuesIn(container)●    ValuesIn(begin, end)●    Range(begin, ...
Extrák: típus paramétertemplate <typename T>class FooTest : public ::testing::Test {  ...}TYPED_TEST_CASE_P(FooTest);TYPED...
Extrák: teszt események●        Listener API    ●        UnitTest    ●        TestCase    ●        TestInfo    ●        Te...
Extrák: unit test CLI●    unit --help●    unit --gtest_list_tests●    unit --gtest_filter=<regexp>-<!regexp>●    unit --gt...
Google Mock●        Osztályok izolált teszteléséhez●        Elvárásokkal preparálhatjuk a függőségeket●        Ellenőrizhe...
Linkek●   C++ unit teszt keretrendszerek:    http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C.2B.2B●   Kent ...
Köszönöm a figyelmet!Kérdések?
20111130 oa gtest
Upcoming SlideShare
Loading in...5
×

20111130 oa gtest

208

Published on

This is my presentation at BalaBit OpenAcademy about the GoogleTest Framework

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
208
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

20111130 oa gtest

  1. 1. Google Test Czigány András
  2. 2. Témák● Unit teszt: mire jó, miért, mikor, mivel?● Google Test Framework ● Alapok ● Finomságok ● Extrák● Lépjünk szintet: Google Mock Framework
  3. 3. Unit teszt
  4. 4. Unit teszt: mire jó?● Unit: a kód legkisebb, önmagában tesztelhető egysége● C → függvény● C++ → osztály● Izoláltan teszteljük a szoftver építőkockáit.● Élő dokumentáció.● TDD-nél tervezési funkciója is van.● Ösztönzi az egészséges kód létrehozását.
  5. 5. Unit teszt: miért?● Szeretsz bugokat javítgatni?● Szeretsz doksit írni?● Változik az elképzelésed kódolás közben?● Használtál kényelmetlen legacy interfészeket?● Írtál komplikált integrációs teszteket?
  6. 6. Unit teszt: mikor?● Röviden: MINDIG :-)● Ha fontos a szoftver minősége.● Ha számít mennyit kell karbantartani.● Ha túl sok a komplikált manuális teszt.● Ha hiányos a dokumentáció.● Ha szeretnél gyakran refaktorálni.● Ha nem szeretsz tesztet írni.
  7. 7. Unit teszt: mivel?● Keretrendszerek: CppUnit, CxxTest, Boost.Test, UnitTest++, Google Test● Legtöbbjük xUnit felépítésű● Könnyen használható eszköztár: ● Case, fixture, suit ● Setup, assert, teardown
  8. 8. Google Test Miért érdemes használni?● Hordozható: exception és RTTI nélkül is megy.● Nem fatális assert: egy futás, összes hiba.● Könnyű információt csatolni egy assert-hez: <<● Szelektív tesztfuttatás.● Érték és típus parametrizált tesztek.● Predikátum assert.● Death assert: várt program összeomlás.● Jól használható API, extra igényekhez.
  9. 9. Alapok: TEST(...)Elég a dumából, írjunk tesztet:#include "sample1.h"#include "gtest/gtest.h"TEST(FactorialTest, Zero) { ASSERT_EQ(1, Factorial(0));}int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();}
  10. 10. Alapok: ASSERT_*● Érték, objektum: ● TRUE, FALSE ● EQ, NE, LT, LE, GT, GE ● FLOAT_EQ, DOUBLE_EQ, NEAR● C sztring: ● STREQ, STRNE ● STRCASEEQ, STRCASENE● Nem fatális: EXPECT_*
  11. 11. Alapok: fixtúrák I.class QueueTest : public ::testing::Test { protected: virtual void SetUp() { q1_.Enqueue(1); q2_.Enqueue(2); q2_.Enqueue(3); } // virtual void TearDown() {} Queue<int> q0_; Queue<int> q1_; Queue<int> q2_; };
  12. 12. Alapok: fixtúrák II.TEST_F(QueueTest, IsEmptyInitially) { EXPECT_EQ(0, q0_.size());}TEST_F(QueueTest, DequeueWorks) { int* n = q0_.Dequeue(); EXPECT_EQ(NULL, n); n = q1_.Dequeue(); ASSERT_TRUE(n != NULL); EXPECT_EQ(1, *n); EXPECT_EQ(0, q1_.size()); delete n; n = q2_.Dequeue(); ASSERT_TRUE(n != NULL); EXPECT_EQ(2, *n); EXPECT_EQ(1, q2_.size()); delete n;}
  13. 13. Control flowHa control flow alapján dől el:● SUCCEED()● FAIL(), ADD_FAILURE(), ADD_FAILURE_AT(“file_path”, line_number)switch(expression) { case 1: ... some checks ... case 2: ... some other checks ... default: FAIL() << "We shouldnt get here."; }
  14. 14. ExceptionASSERT_*, EXPECT_*:● Típusos: THROW● Bármi: ANY_THROW● Semmi: NO_THROWASSERT_THROW(Foo(5), bar_exception);EXPECT_NO_THROW({ int n = 5; Bar(&n);});
  15. 15. PredikátumASSERT_*, EXPECT_*:● PRED1(bool (*pred1fv)(arg1), test_arg1)● Jelenleg öt argumentumig implementált.// Returns true iff m and n have no commondivisors except 1.bool MutuallyPrime(int m, int n) { ... }EXPECT_PRED2(MutuallyPrime, 3, 4); // SUCCEED()EXPECT_PRED2(MutuallyPrime, 4, 10); // FAIL()
  16. 16. Extrák: death tesztelésASSERT_*, EXPECT_*:● DEATH, DEATH_IF_SUPPORTED● EXITTEST(MyDeathTest, Foo) {  // This death test uses a compound statement.  ASSERT_DEATH({ int n = 5; Foo(&n); }, "Error on line .* of Foo()");}TEST(MyDeathTest, NormalExit) {  EXPECT_EXIT(NormalExit(), ::testing::ExitedWithCode(0),"Success"); }TEST(MyDeathTest, KillMyself) {  EXPECT_EXIT(KillMyself(), ::testing::KilledBySignal(SIGKILL),"Sending myself unblockable signal"); }
  17. 17. Extrák: SCOPED_TRACEvoid Sub1(int n) {  EXPECT_EQ(1, Bar(n));  EXPECT_EQ(2, Bar(n + 1));}TEST(FooTest, Bar) { {    SCOPED_TRACE("A");    Sub1(1); }  // Now it wont.  Sub1(9);}
  18. 18. Extrák: TRACE kimenetpath/to/foo_test.cc:11: FailureValue of: Bar(n)Expected: 1  Actual: 2   Trace:path/to/foo_test.cc:17: Apath/to/foo_test.cc:12: FailureValue of: Bar(n + 1)Expected: 2  Actual: 3
  19. 19. Extrák: globális fixtúraclass Environment { public:  virtual ~Environment() {}  // Override this to define how to set up theenvironment.  virtual void SetUp() {}  // Override this to define how to tear down theenvironment.  virtual void TearDown() {}};// in main()AddGlobalTestEnvironment(Environment* env);
  20. 20. Extrák: érték paraméterclass FooTest : public ::testing::TestWithParam<constchar*> {  // You can implement all the usual fixture classmembers here.};TEST_P(FooTest, DoesBlah) {  EXPECT_TRUE(foo.Blah(GetParam()));  ...}TEST_P(FooTest, HasBlahBlah) {  ... }INSTANTIATE_TEST_CASE_P(InstantiationName, FooTest,          ::testing::Values("meeny", "miny", "moe"));
  21. 21. Extrák: érték paraméter II.● Values(v1, v2, ..., vN)● ValuesIn(container)● ValuesIn(begin, end)● Range(begin, end[, step])● Bool() = Values(false, true)● Combine(g1, g2, ..., gN) -> requires <tr1/tuple> end nem része az értékhalmaznak
  22. 22. Extrák: típus paramétertemplate <typename T>class FooTest : public ::testing::Test {  ...}TYPED_TEST_CASE_P(FooTest);TYPED_TEST_P(FooTest, DoesBlah) {  // Inside a test, refer to TypeParam to get the typeparameter.  TypeParam n = 0;  ...}TYPED_TEST_P(FooTest, HasPropertyA) { ... }REGISTER_TYPED_TEST_CASE_P(FooTest, DoesBlah, HasPropertyA);typedef ::testing::Types<char, int, unsigned int> MyTypes;INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
  23. 23. Extrák: teszt események● Listener API ● UnitTest ● TestCase ● TestInfo ● TestPartResult● Result printer (Sample 9)● Memory Leak checker (Sample 10)
  24. 24. Extrák: unit test CLI● unit --help● unit --gtest_list_tests● unit --gtest_filter=<regexp>-<!regexp>● unit --gtest_repeat=<times>● unit --gtest_shuffle● unit --gtest_output=”xml:<output_file>”● Integrálás: debugger, test framework● Tesztek szétosztása gépek között
  25. 25. Google Mock● Osztályok izolált teszteléséhez● Elvárásokkal preparálhatjuk a függőségeket● Ellenőrizhetjük objektumainkat: ● Hányszor érték el ● Milyen argumentumokkal ● Mi volt a visszatérési érték az interakció során.
  26. 26. Linkek● C++ unit teszt keretrendszerek: http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C.2B.2B● Kent Beck – xUnit testing framework: http://www.xprogramming.com/testfram.htm● Noel Llopis – C++ framework comparison: http://gamesfromwithin.com/exploring-the-c-unit-testing-framework-jungle● CppUnit: https://launchpad.net/cppunit2● CxxTest: http://cxxtest.sourceforge.net/● UnitTest++: http://unittest-cpp.sourceforge.net/● Boost.Test: http://www.boost.org/doc/libs/release/libs/test/index.html● Google Test Framework: http://code.google.com/p/googletest/● Google Mock Framework: http://code.google.com/p/googlemock/
  27. 27. Köszönöm a figyelmet!Kérdések?
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×