Your SlideShare is downloading. ×
20111130 oa gtest
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

20111130 oa gtest

177

Published on

This is my presentation at BalaBit OpenAcademy about the GoogleTest Framework

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
177
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Google Test Czigány András
  • 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. Unit teszt
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Extrák: teszt események● Listener API ● UnitTest ● TestCase ● TestInfo ● TestPartResult● Result printer (Sample 9)● Memory Leak checker (Sample 10)
  • 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. 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. 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. Köszönöm a figyelmet!Kérdések?

×