SlideShare a Scribd company logo
An Introduction to Google Test
Framework
Abner Huang
July. 2015
Test!? We do it every day
void Test__calc_isect() {
int x1, y1, x2, y2;
int x3, y3, x4, y4;
int x, y;
x1 = 0; y1 = INT_MIN; x2 = 2; y2 = INT_MAX;
x3 = 20; y3 = INT_MAX; x4 = 22; y4 = INT_MIN;
calc_isect(&x, &y, x1, y1, x2, y2, x3, y3, x4, y4, 0);
assert(x == 11);
assert(y == INT_MAX);
}
void main(void)
{
Test__calc_isect1();
Test__calc_isect2();
Test__calc_isect3();
Test__calc_isect();
Test__calc_isect4();
Test__calc_isect5();
Test__calc_isect6();
}
> ./test.out
test.cpp:100:Test__calc_isect(): Assertion `x == 11' failed.
void Test__calc_isect() {
int x1, y1, x2, y2;
int x3, y3, x4, y4;
int x, y;
x1 = 0; y1 = INT_MIN; x2 = 2; y2 = INT_MAX;
x3 = 20; y3 = INT_MAX; x4 = 22; y4 = INT_MIN;
calc_isect(&x, &y, x1, y1, x2, y2, x3, y3, x4, y4, 0);
if ((x != 11) || (y != INT_MAX))
{
printf(“Oops! (%d,%d) != (%d,%d)n”,x,y,11,INT_MAX);
assert(0);
}
printf(“PASSn”);
}
> ./test.out
PASS
PASS
PASS
Oops! (10,2147483647) != (11,2147483647)
test.cpp:100:Test__calc_isect(): Assertion `0' failed.
Any complains?
No convenient controls
Run in batch mode
Does gtest help?
No control of test suite
and test cases
./your_test.out --help
● Selecting Tests
● Repeating/Shuffling the Tests
● Generating an XML Report
● Turning Assertion Failures into Break-Points
○ --gtest_break_on_failure
● Disabling Catching Test-Thrown Exceptions
○ --gtest_catch_exceptions=0
> libpl_test --gtest_list_tests
CHK_ENCLOSE.
PlEnclose_SimpleInput
MAKE_BD.
MakeBd_LineTouchDirty
OSIZE_HDR.
OversizeHdr_BadOversizAmount
OversizeHdr_NULLInput
OversizeHdr_SimpleInput
OversizeHdr_OversizeOrthoHdr
OversizeHdr_OversizeNonOrthoHdr
OversizeOrthoHdr_OversizeOrthoHdr
BreakUpAngleHdr_DisconnectedInput
BreakUpAngleHdr_AngleBigInput
https://www.flickr.com/photos/marckjerland/4285433177 On Flickr, marc kjerland's Mathematician's toolkit
● Fatal and non-fatal assertions
○ EXPECT_EQ(x, 10);EXPECT_FLOAT_EQ(x,10.0)
○ ASSERT_EQ(x, 10);ASSERT_DOUBLE_EQ(x,10.0)
● Easy assertions informative messages:
assert(x == 10);
EXPECT_EQ(x, 10) << “vector (” << old_x <<
”,” << old_y << ”) moved to (” << x << ”,” <<
y << ”)n”;
> ./test.out
[ RUN ] MYTEST.TestFoo
test.cpp:37: Failure
Value of: x
Actual: 11
Expected: 10
vector (10, 77) move to (11, 77)
[ FAILED ] MYTEST.TestFoo (0 ms)
DEATH TEST
calc_isect(int *x, int *y, int x1, int y1, int x2, int y2,
int x3, int y3, int x4, int y4, int tolerance)
{
if (x==NULL || y==NULL)
{
cerr << “Input is invalid.n”;
exit(1);
}
… …
}
TEST(GEODeathTest, CalcIsect) {
ASSERT_DEATH(CalcIsect(NULL, NULL, 0,0,0,0,0,0,0,0,0),
".*invalid");
}
Adding Traces to Assertions
void Sub1(int n) {
EXPECT_EQ(1, Bar(n));
EXPECT_EQ(2, Bar(n + 1));
}
TEST(FooTest, Bar) {
{
SCOPED_TRACE("A");
Sub1(1);
}
Sub1(9);
}
path/to/foo_test.cc:11: Failure
Value of: Bar(n)
Expected: 1
Actual: 2
Trace:
path/to/foo_test.cc:17: A
path/to/foo_test.cc:12: Failure
Value of: Bar(n + 1)
Expected: 2
XML outputs
<testsuites name="AllTests" tests="3" failures="
1" errors="0" time="35" ...>
<testsuite name="test_case_name" tests="2"
failures="1" errors="0" time="15"...>
<testcase name="test_name" status="run"
time="7"...>
<failure message="..."/>
<failure message="..."/>
</testcase>
</testsuite>
</testsuites>
Prepare your test case
• test.cpp contains main() in test directory
#include "_test_util.h"
static void
infrastructure_init(void)
{
vmemUseMalloc(1);
vmemInit_m();
vmemSetIncrementValue(VMEM_MEGABYTE_MINUS);
hoVMsetDefaultPoolLockingState(0);
vth_init();
}
int main(int argc, char **argv) {
infrastructure_init(); // Write a function like this to initialize vmem, threading etc.
::testing::InitGoogleTest(&argc, argv);
int result = RUN_ALL_TESTS(); Initialize gtest and runs all tests.
return result;
}
SetUp()
TEST/TEST_F/TEST_PTearDown()
Test types of Gtest
• TEST()
• TEST_F() -- Fixture
• TEST_P() -- Value-parameterized fixture
– Range()
– Values()
– ValuesIn()
– Bool()
– Combine()
TEST(GEO, CalcIsect) {
int x1, y1, x2, y2;
int x3, y3, x4, y4;
int x, y;
x1 = 0; y1 = INT_MIN; x2 = 2; y2 = INT_MAX;
x3 = 20; y3 = INT_MAX; x4 = 22; y4 = INT_MIN;
calc_isect(&x, &y, x1, y1, x2, y2, x3, y3, x4, y4, 0);
assert(x == 11);
assert(y == INT_MAX);
}
Test Fixtures
• Sometimes you want to run several tests on similar data
structures (same setup before running test).
• In a fixture you define common setup/tear-down for
multiple tests
• Reduces amount of test code by avoiding repetition
class GEO : public ::testing::Test {
protected:
virtual void SetUp() {}
void ZapMemoryPool() {}
virtual void TearDown() {}
int x1, y1, x2, y2, x3, y3, x4, y4, x, y;
};
TEST_F(GEO, CalcIsect) {
x1 = 0; y1 = INT_MIN; x2 = 2; y2 = INT_MAX;
x3 = 20; y3 = INT_MAX; x4 = 22; y4 = INT_MIN;
calc_isect(&x, &y, x1, y1, x2, y2, x3, y3, x4, y4, 0);
assert(x == 11);
assert(y == INT_MAX);
}
TEST_P() -- Value-parameterized fixture
● generator based tests.
Range(begin, end[,
step])
Yields values {begin, begin+step, begin+step+step, ...}. The values do
not include end. step defaults to 1.
Values(v1, v2, ..., vN) Yields values {v1, v2, ..., vN}.
ValuesIn(container) and
ValuesIn(begin, end)
Yields values from a C-style array, an STL-style container, or an
iterator range [begin, end). container, begin, and end can be
expressions whose values are determined at run time.
Bool() Yields sequence {false, true}.
Combine(g1, g2, ...,
gN)
Yields all combinations (the Cartesian product for the math savvy) of
the values generated by the N generators. This is only available if your
system provides the <tr1/tuple> header.
class GEO : public ::testing::TestWithParam<int> {
protected:
virtual void SetUp() {}
void ZapMemoryPool() {}
virtual void TearDown() {}
int x1, y1, x2, y2, x3, y3, x4, y4, x, y;
};
INSTANTIATE_TEST_CASE_P(AUTO_GEN_OH, GEO, ::testing::Range(1,12,1));
TEST_P(GEO, CalcIsect) {
double angle = PI/180 * 15 * GetParam();
x1 = -100; y1 = 0; x2 = 100; y2 = 0;
x3 = -50; y3 = 0; x4 = 50; y4 = 0;
rotate(&x3, &y4, angle);
rotate(&x4, &y4, angle);
calc_isect(&x, &y, x1, y1, x2, y2, x3, y3, x4, y4, 0);
assert(x == 0 && y == 0);
}
[----------] 16 tests from AUTO_GEN_OH/GEO
[ RUN ] AUTO_GEN_OH/GEO.CalcIsect/1
[ OK ] AUTO_GEN_OH/GEO.CalcIsect/1 (0 ms)
[ RUN ] AUTO_GEN_OH/GEO.CalcIsect/2
[ OK ] AUTO_GEN_OH/GEO.CalcIsect/2 (0 ms)
[ RUN ] AUTO_GEN_OH/GEO.CalcIsect/3
[ OK ] AUTO_GEN_OH/GEO.CalcIsect/3 (0 ms)
[ RUN ] AUTO_GEN_OH/GEO.CalcIsect/4
[ OK ] AUTO_GEN_OH/GEO.CalcIsect/4 (0 ms)
[ RUN ] AUTO_GEN_OH/GEO.CalcIsect/5
[ OK ] AUTO_GEN_OH/GEO.CalcIsect/5 (0 ms)
[ RUN ] AUTO_GEN_OH/GEO.CalcIsect/6
[ OK ] AUTO_GEN_OH/GEO.CalcIsect/6 (0 ms)
[ RUN ] AUTO_GEN_OH/GEO.CalcIsect/7
[ OK ] AUTO_GEN_OH/GEO.CalcIsect/7 (0 ms)
[ RUN ] AUTO_GEN_OH/GEO.CalcIsect/8
[ OK ] AUTO_GEN_OH/GEO.CalcIsect/8 (0 ms)
[ RUN ] AUTO_GEN_OH/GEO.CalcIsect/9
[ OK ] AUTO_GEN_OH/GEO.CalcIsect/9 (0 ms)
[ RUN ] AUTO_GEN_OH/GEO.CalcIsect/10
[ OK ] AUTO_GEN_OH/GEO.CalcIsect/10 (0 ms)
[ RUN ] AUTO_GEN_OH/GEO.CalcIsect/11
[ OK ] AUTO_GEN_OH/GEO.CalcIsect/11 (0 ms)
[----------] 11 tests from AUTO_GEN_OH/GEO (0 ms total)
Organization of Tests
TEST(GEO, CalcIsect)
test case test
Test Suite
Flow of Running Tests
SetUp()
TEST/TEST_F/TEST_PTearDown()
Environment::
SetUp()
SetUpTestCase()
Environment::
TearDown()
TearDownTestCase()
How to install gtest
Easy Install
> wget http://googletest.googlecode.com/files/gtest-1.7.0.zip
> unzip gtest-1.7.0.zip
> cd gtest-1.7.0
> ./configure
> make
> cp -a include/gtest /usr/include
> sudo cp -a lib/.libs/* /usr/lib/
How to use google test
• You must check out gtest to use unit test feature. We do
not have the executable of gtest.
• E.g.
– /path/to/foo/
– build
– arch
– src
– exec
– gtest
– include
– lib
How to use google test (II)
• E.g.
/path/to/foo/
– exec
– gtest
– include
– lib
– bar <<< Library under test, contains production code
– published
– test <<< Directory contains test code
test> make
Some points to keep in mind
• gtest is useful for testing primitive functions in libraries
• Unit testing does not replace regression testing
• With gtest:
– You do not modify production code.
– You add test code that calls library functions.
– You check-in test code to repository
• Production code is not compiled/linked with gtest
• Using gtest creates a test binary, not icv binary
Coding Style and Rules
• Don’t mix TEST(), TEST_F(), TEST_P()
• Don’t use global variables, use test fixture to instead
• Gtest does not reuse the same test fixture object across
multiple tests
• Spell SetUp() correctly.
• Gtest use fork() to do death test, do not try not to free
memory in a death test.
• You can derive new class from your own class.
Coding Style and Rules
• Use Camel Case style to name test cases and suite
– E.g., TEST(Time, Flies_Like_An_Arrow) { ... }
and
TEST(Time_Flies, Like_An_Arrow) { … }
will have the same name
Time_Files_Like_An_Arrow_Test
• Current Naming Rule
– Test suite name is all uppercase
– Test case name is Camel Case style with underscore.
– E.g., TEST_F(SPACING_UTIL__PNT_EDGE, WhichHalfRes_SamePoints)
Key Features & Characters Boost Test Google Test UnitTest++
Free (Open Source) software Yes Yes Yes
Simple to use Yes
(5 out of 5)
Yes
(5 out of 5)
Yes
(4 out of 5)
Test cases grouping & organization Good Good Normal
Test case template support Yes Yes Yes
Test fixture (i.e. fixed state used as
a baseline for running test) support
Yes Yes Yes
Global test fixture Yes Yes No
Handle C++ exceptions Yes Yes Yes
Different types of assertions support Yes Yes No
Fatal and non-fatal assertions Yes Yes No
Support Regular Expression when
matching function output
Yes Yes No
Output in XML format Yes Yes No
Key Features & Characters Boost Test Google Test UnitTest++
Support Mock object (objects can
simulate the behavior of complex
objects)
No Yes
(work seamlessly with
Google Mock)
No
Extend features with event
mechanism
No Yes No
Run tests on distributed machines No Yes No
Thread safety when running tests No Yes No
Run subset of all defined test cases Yes
(only support
filtering by test
name)
Yes
(support multiple
filtering conditions)
No
• Karl Chen, C++ Unit Testing Frameworks Evaluation
Thank you

More Related Content

What's hot (20)

PPT
Google test training
Thierry Gayet
 
PPTX
Unit tests & TDD
Dror Helper
 
PPTX
An Introduction to Unit Testing
Joe Tremblay
 
PPTX
Unit Testing in Java
Ahmed M. Gomaa
 
PPTX
Unit testing
princezzlove
 
PDF
Fundamentals of Software Testing
Sagar Joshi
 
PPT
Automation testing
Biswajit Pratihari
 
DOCX
Automation Testing Syllabus - Checklist
Sunil Kumar Gunasekaran
 
PPSX
Junit
FAROOK Samath
 
ODP
Beginners - Get Started With Unit Testing in .NET
Baskar K
 
PPS
Unit Testing
Anuj Arora
 
PDF
ISTQB Foundation Level Basic
Erol Selitektay
 
PPTX
Angular Unit Testing
Alessandro Giorgetti
 
PPTX
Angular Unit Testing
Shailendra Chauhan
 
PPT
Code coverage
Return on Intelligence
 
PPTX
Software Testing - Part 1 (Techniques, Types, Levels, Methods, STLC, Bug Life...
Ankit Prajapati
 
PDF
SonarQube
Gnanaseelan Jeb
 
PPT
Basic Guide to Manual Testing
Hiral Gosani
 
PPTX
Unit Testing And Mocking
Joe Wilson
 
PPTX
Test Coverage
Hiroyuki Takahashi
 
Google test training
Thierry Gayet
 
Unit tests & TDD
Dror Helper
 
An Introduction to Unit Testing
Joe Tremblay
 
Unit Testing in Java
Ahmed M. Gomaa
 
Unit testing
princezzlove
 
Fundamentals of Software Testing
Sagar Joshi
 
Automation testing
Biswajit Pratihari
 
Automation Testing Syllabus - Checklist
Sunil Kumar Gunasekaran
 
Beginners - Get Started With Unit Testing in .NET
Baskar K
 
Unit Testing
Anuj Arora
 
ISTQB Foundation Level Basic
Erol Selitektay
 
Angular Unit Testing
Alessandro Giorgetti
 
Angular Unit Testing
Shailendra Chauhan
 
Code coverage
Return on Intelligence
 
Software Testing - Part 1 (Techniques, Types, Levels, Methods, STLC, Bug Life...
Ankit Prajapati
 
SonarQube
Gnanaseelan Jeb
 
Basic Guide to Manual Testing
Hiral Gosani
 
Unit Testing And Mocking
Joe Wilson
 
Test Coverage
Hiroyuki Takahashi
 

Similar to An introduction to Google test framework (20)

PPT
Google C++ Testing Framework in Visual Studio 2008
Andrea Francia
 
PPTX
presentation des google test dans un contexte de tdd
Thierry Gayet
 
PDF
Test Automation Using Googletest
Mohammed_Publications
 
PPTX
C++ Testing Techniques Tips and Tricks - C++ London
Clare Macrae
 
PPT
Testing foundations
Neha Singh
 
PDF
Systematic Unit Testing
scotchfield
 
PDF
VST2022.pdf
Annibale Panichella
 
PDF
Practical unit testing 2014
Andrew Fray
 
PPTX
Cpp Testing Techniques Tips and Tricks - Cpp Europe
Clare Macrae
 
PDF
DSR Testing (Part 1)
Steve Upton
 
PPT
Presentation_C++UnitTest
Raihan Masud
 
PPTX
747Notes24-Google123123Test.ppt document on somex
AnuragAshokan
 
PPTX
GCC Summit 2010
regehr
 
PPTX
Quickly Testing Legacy Code - ACCU York April 2019
Clare Macrae
 
PDF
Stamp breizhcamp 2019
Caroline Landry
 
PPT
AutoTest.ppt
PrashanthJanakiraman
 
PPT
AutoTest.ppt
Rohit846825
 
PPT
AutoTest.ppt
CHANDUKAYALA
 
PDF
Creating Unit Tests Using Genetic Programming
ESUG
 
PDF
IPA Fall Days 2019
Annibale Panichella
 
Google C++ Testing Framework in Visual Studio 2008
Andrea Francia
 
presentation des google test dans un contexte de tdd
Thierry Gayet
 
Test Automation Using Googletest
Mohammed_Publications
 
C++ Testing Techniques Tips and Tricks - C++ London
Clare Macrae
 
Testing foundations
Neha Singh
 
Systematic Unit Testing
scotchfield
 
VST2022.pdf
Annibale Panichella
 
Practical unit testing 2014
Andrew Fray
 
Cpp Testing Techniques Tips and Tricks - Cpp Europe
Clare Macrae
 
DSR Testing (Part 1)
Steve Upton
 
Presentation_C++UnitTest
Raihan Masud
 
747Notes24-Google123123Test.ppt document on somex
AnuragAshokan
 
GCC Summit 2010
regehr
 
Quickly Testing Legacy Code - ACCU York April 2019
Clare Macrae
 
Stamp breizhcamp 2019
Caroline Landry
 
AutoTest.ppt
PrashanthJanakiraman
 
AutoTest.ppt
Rohit846825
 
AutoTest.ppt
CHANDUKAYALA
 
Creating Unit Tests Using Genetic Programming
ESUG
 
IPA Fall Days 2019
Annibale Panichella
 
Ad

More from Abner Chih Yi Huang (11)

PDF
諾貝爾經濟學獎得主的獲利公式
Abner Chih Yi Huang
 
PDF
Clip Tree Applications
Abner Chih Yi Huang
 
PDF
Introduction to Szemerédi regularity lemma
Abner Chih Yi Huang
 
PDF
Introduction to Algorithmic aspect of Market Equlibra
Abner Chih Yi Huang
 
PPTX
SaaS: Science as a Service
Abner Chih Yi Huang
 
PDF
More on randomization semi-definite programming and derandomization
Abner Chih Yi Huang
 
PPTX
Alignment spaced seed
Abner Chih Yi Huang
 
PPT
A small debate of power of randomness
Abner Chih Yi Huang
 
PPTX
Dominating set of fixed size in degenerated graph
Abner Chih Yi Huang
 
PPTX
Introduction to algorithmic aspect of auction theory
Abner Chih Yi Huang
 
PDF
Refactoring Chapter11
Abner Chih Yi Huang
 
諾貝爾經濟學獎得主的獲利公式
Abner Chih Yi Huang
 
Clip Tree Applications
Abner Chih Yi Huang
 
Introduction to Szemerédi regularity lemma
Abner Chih Yi Huang
 
Introduction to Algorithmic aspect of Market Equlibra
Abner Chih Yi Huang
 
SaaS: Science as a Service
Abner Chih Yi Huang
 
More on randomization semi-definite programming and derandomization
Abner Chih Yi Huang
 
Alignment spaced seed
Abner Chih Yi Huang
 
A small debate of power of randomness
Abner Chih Yi Huang
 
Dominating set of fixed size in degenerated graph
Abner Chih Yi Huang
 
Introduction to algorithmic aspect of auction theory
Abner Chih Yi Huang
 
Refactoring Chapter11
Abner Chih Yi Huang
 
Ad

Recently uploaded (20)

PDF
4K Video Downloader Plus Pro Crack for MacOS New Download 2025
bashirkhan333g
 
PPTX
Foundations of Marketo Engage - Powering Campaigns with Marketo Personalization
bbedford2
 
PDF
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
PDF
Odoo CRM vs Zoho CRM: Honest Comparison 2025
Odiware Technologies Private Limited
 
PPTX
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 
PPTX
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
PPTX
Empowering Asian Contributions: The Rise of Regional User Groups in Open Sour...
Shane Coughlan
 
PDF
Automate Cybersecurity Tasks with Python
VICTOR MAESTRE RAMIREZ
 
PDF
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
PDF
Driver Easy Pro 6.1.1 Crack Licensce key 2025 FREE
utfefguu
 
PPTX
Change Common Properties in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PPTX
Customise Your Correlation Table in IBM SPSS Statistics.pptx
Version 1 Analytics
 
PDF
Empower Your Tech Vision- Why Businesses Prefer to Hire Remote Developers fro...
logixshapers59
 
PPTX
Hardware(Central Processing Unit ) CU and ALU
RizwanaKalsoom2
 
PDF
Top Agile Project Management Tools for Teams in 2025
Orangescrum
 
PDF
iTop VPN With Crack Lifetime Activation Key-CODE
utfefguu
 
PDF
Download Canva Pro 2025 PC Crack Full Latest Version
bashirkhan333g
 
PPTX
Homogeneity of Variance Test Options IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
MiniTool Power Data Recovery 8.8 With Crack New Latest 2025
bashirkhan333g
 
PDF
MiniTool Partition Wizard Free Crack + Full Free Download 2025
bashirkhan333g
 
4K Video Downloader Plus Pro Crack for MacOS New Download 2025
bashirkhan333g
 
Foundations of Marketo Engage - Powering Campaigns with Marketo Personalization
bbedford2
 
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
Odoo CRM vs Zoho CRM: Honest Comparison 2025
Odiware Technologies Private Limited
 
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
Empowering Asian Contributions: The Rise of Regional User Groups in Open Sour...
Shane Coughlan
 
Automate Cybersecurity Tasks with Python
VICTOR MAESTRE RAMIREZ
 
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
Driver Easy Pro 6.1.1 Crack Licensce key 2025 FREE
utfefguu
 
Change Common Properties in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Customise Your Correlation Table in IBM SPSS Statistics.pptx
Version 1 Analytics
 
Empower Your Tech Vision- Why Businesses Prefer to Hire Remote Developers fro...
logixshapers59
 
Hardware(Central Processing Unit ) CU and ALU
RizwanaKalsoom2
 
Top Agile Project Management Tools for Teams in 2025
Orangescrum
 
iTop VPN With Crack Lifetime Activation Key-CODE
utfefguu
 
Download Canva Pro 2025 PC Crack Full Latest Version
bashirkhan333g
 
Homogeneity of Variance Test Options IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
MiniTool Power Data Recovery 8.8 With Crack New Latest 2025
bashirkhan333g
 
MiniTool Partition Wizard Free Crack + Full Free Download 2025
bashirkhan333g
 

An introduction to Google test framework

  • 1. An Introduction to Google Test Framework Abner Huang July. 2015
  • 2. Test!? We do it every day
  • 3. void Test__calc_isect() { int x1, y1, x2, y2; int x3, y3, x4, y4; int x, y; x1 = 0; y1 = INT_MIN; x2 = 2; y2 = INT_MAX; x3 = 20; y3 = INT_MAX; x4 = 22; y4 = INT_MIN; calc_isect(&x, &y, x1, y1, x2, y2, x3, y3, x4, y4, 0); assert(x == 11); assert(y == INT_MAX); }
  • 6. void Test__calc_isect() { int x1, y1, x2, y2; int x3, y3, x4, y4; int x, y; x1 = 0; y1 = INT_MIN; x2 = 2; y2 = INT_MAX; x3 = 20; y3 = INT_MAX; x4 = 22; y4 = INT_MIN; calc_isect(&x, &y, x1, y1, x2, y2, x3, y3, x4, y4, 0); if ((x != 11) || (y != INT_MAX)) { printf(“Oops! (%d,%d) != (%d,%d)n”,x,y,11,INT_MAX); assert(0); } printf(“PASSn”); }
  • 7. > ./test.out PASS PASS PASS Oops! (10,2147483647) != (11,2147483647) test.cpp:100:Test__calc_isect(): Assertion `0' failed.
  • 10. Run in batch mode
  • 12. No control of test suite and test cases
  • 13. ./your_test.out --help ● Selecting Tests ● Repeating/Shuffling the Tests ● Generating an XML Report ● Turning Assertion Failures into Break-Points ○ --gtest_break_on_failure ● Disabling Catching Test-Thrown Exceptions ○ --gtest_catch_exceptions=0
  • 16. ● Fatal and non-fatal assertions ○ EXPECT_EQ(x, 10);EXPECT_FLOAT_EQ(x,10.0) ○ ASSERT_EQ(x, 10);ASSERT_DOUBLE_EQ(x,10.0) ● Easy assertions informative messages: assert(x == 10); EXPECT_EQ(x, 10) << “vector (” << old_x << ”,” << old_y << ”) moved to (” << x << ”,” << y << ”)n”;
  • 17. > ./test.out [ RUN ] MYTEST.TestFoo test.cpp:37: Failure Value of: x Actual: 11 Expected: 10 vector (10, 77) move to (11, 77) [ FAILED ] MYTEST.TestFoo (0 ms)
  • 18. DEATH TEST calc_isect(int *x, int *y, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int tolerance) { if (x==NULL || y==NULL) { cerr << “Input is invalid.n”; exit(1); } … … } TEST(GEODeathTest, CalcIsect) { ASSERT_DEATH(CalcIsect(NULL, NULL, 0,0,0,0,0,0,0,0,0), ".*invalid"); }
  • 19. Adding Traces to Assertions void Sub1(int n) { EXPECT_EQ(1, Bar(n)); EXPECT_EQ(2, Bar(n + 1)); } TEST(FooTest, Bar) { { SCOPED_TRACE("A"); Sub1(1); } Sub1(9); } path/to/foo_test.cc:11: Failure Value of: Bar(n) Expected: 1 Actual: 2 Trace: path/to/foo_test.cc:17: A path/to/foo_test.cc:12: Failure Value of: Bar(n + 1) Expected: 2
  • 20. XML outputs <testsuites name="AllTests" tests="3" failures=" 1" errors="0" time="35" ...> <testsuite name="test_case_name" tests="2" failures="1" errors="0" time="15"...> <testcase name="test_name" status="run" time="7"...> <failure message="..."/> <failure message="..."/> </testcase> </testsuite> </testsuites>
  • 21. Prepare your test case • test.cpp contains main() in test directory #include "_test_util.h" static void infrastructure_init(void) { vmemUseMalloc(1); vmemInit_m(); vmemSetIncrementValue(VMEM_MEGABYTE_MINUS); hoVMsetDefaultPoolLockingState(0); vth_init(); } int main(int argc, char **argv) { infrastructure_init(); // Write a function like this to initialize vmem, threading etc. ::testing::InitGoogleTest(&argc, argv); int result = RUN_ALL_TESTS(); Initialize gtest and runs all tests. return result; }
  • 22. SetUp() TEST/TEST_F/TEST_PTearDown() Test types of Gtest • TEST() • TEST_F() -- Fixture • TEST_P() -- Value-parameterized fixture – Range() – Values() – ValuesIn() – Bool() – Combine()
  • 23. TEST(GEO, CalcIsect) { int x1, y1, x2, y2; int x3, y3, x4, y4; int x, y; x1 = 0; y1 = INT_MIN; x2 = 2; y2 = INT_MAX; x3 = 20; y3 = INT_MAX; x4 = 22; y4 = INT_MIN; calc_isect(&x, &y, x1, y1, x2, y2, x3, y3, x4, y4, 0); assert(x == 11); assert(y == INT_MAX); }
  • 24. Test Fixtures • Sometimes you want to run several tests on similar data structures (same setup before running test). • In a fixture you define common setup/tear-down for multiple tests • Reduces amount of test code by avoiding repetition
  • 25. class GEO : public ::testing::Test { protected: virtual void SetUp() {} void ZapMemoryPool() {} virtual void TearDown() {} int x1, y1, x2, y2, x3, y3, x4, y4, x, y; }; TEST_F(GEO, CalcIsect) { x1 = 0; y1 = INT_MIN; x2 = 2; y2 = INT_MAX; x3 = 20; y3 = INT_MAX; x4 = 22; y4 = INT_MIN; calc_isect(&x, &y, x1, y1, x2, y2, x3, y3, x4, y4, 0); assert(x == 11); assert(y == INT_MAX); }
  • 26. TEST_P() -- Value-parameterized fixture ● generator based tests. Range(begin, end[, step]) Yields values {begin, begin+step, begin+step+step, ...}. The values do not include end. step defaults to 1. Values(v1, v2, ..., vN) Yields values {v1, v2, ..., vN}. ValuesIn(container) and ValuesIn(begin, end) Yields values from a C-style array, an STL-style container, or an iterator range [begin, end). container, begin, and end can be expressions whose values are determined at run time. Bool() Yields sequence {false, true}. Combine(g1, g2, ..., gN) Yields all combinations (the Cartesian product for the math savvy) of the values generated by the N generators. This is only available if your system provides the <tr1/tuple> header.
  • 27. class GEO : public ::testing::TestWithParam<int> { protected: virtual void SetUp() {} void ZapMemoryPool() {} virtual void TearDown() {} int x1, y1, x2, y2, x3, y3, x4, y4, x, y; }; INSTANTIATE_TEST_CASE_P(AUTO_GEN_OH, GEO, ::testing::Range(1,12,1)); TEST_P(GEO, CalcIsect) { double angle = PI/180 * 15 * GetParam(); x1 = -100; y1 = 0; x2 = 100; y2 = 0; x3 = -50; y3 = 0; x4 = 50; y4 = 0; rotate(&x3, &y4, angle); rotate(&x4, &y4, angle); calc_isect(&x, &y, x1, y1, x2, y2, x3, y3, x4, y4, 0); assert(x == 0 && y == 0); }
  • 28. [----------] 16 tests from AUTO_GEN_OH/GEO [ RUN ] AUTO_GEN_OH/GEO.CalcIsect/1 [ OK ] AUTO_GEN_OH/GEO.CalcIsect/1 (0 ms) [ RUN ] AUTO_GEN_OH/GEO.CalcIsect/2 [ OK ] AUTO_GEN_OH/GEO.CalcIsect/2 (0 ms) [ RUN ] AUTO_GEN_OH/GEO.CalcIsect/3 [ OK ] AUTO_GEN_OH/GEO.CalcIsect/3 (0 ms) [ RUN ] AUTO_GEN_OH/GEO.CalcIsect/4 [ OK ] AUTO_GEN_OH/GEO.CalcIsect/4 (0 ms) [ RUN ] AUTO_GEN_OH/GEO.CalcIsect/5 [ OK ] AUTO_GEN_OH/GEO.CalcIsect/5 (0 ms) [ RUN ] AUTO_GEN_OH/GEO.CalcIsect/6 [ OK ] AUTO_GEN_OH/GEO.CalcIsect/6 (0 ms) [ RUN ] AUTO_GEN_OH/GEO.CalcIsect/7 [ OK ] AUTO_GEN_OH/GEO.CalcIsect/7 (0 ms) [ RUN ] AUTO_GEN_OH/GEO.CalcIsect/8 [ OK ] AUTO_GEN_OH/GEO.CalcIsect/8 (0 ms) [ RUN ] AUTO_GEN_OH/GEO.CalcIsect/9 [ OK ] AUTO_GEN_OH/GEO.CalcIsect/9 (0 ms) [ RUN ] AUTO_GEN_OH/GEO.CalcIsect/10 [ OK ] AUTO_GEN_OH/GEO.CalcIsect/10 (0 ms) [ RUN ] AUTO_GEN_OH/GEO.CalcIsect/11 [ OK ] AUTO_GEN_OH/GEO.CalcIsect/11 (0 ms) [----------] 11 tests from AUTO_GEN_OH/GEO (0 ms total)
  • 29. Organization of Tests TEST(GEO, CalcIsect) test case test Test Suite
  • 30. Flow of Running Tests SetUp() TEST/TEST_F/TEST_PTearDown() Environment:: SetUp() SetUpTestCase() Environment:: TearDown() TearDownTestCase()
  • 31. How to install gtest
  • 32. Easy Install > wget http://googletest.googlecode.com/files/gtest-1.7.0.zip > unzip gtest-1.7.0.zip > cd gtest-1.7.0 > ./configure > make > cp -a include/gtest /usr/include > sudo cp -a lib/.libs/* /usr/lib/
  • 33. How to use google test • You must check out gtest to use unit test feature. We do not have the executable of gtest. • E.g. – /path/to/foo/ – build – arch – src – exec – gtest – include – lib
  • 34. How to use google test (II) • E.g. /path/to/foo/ – exec – gtest – include – lib – bar <<< Library under test, contains production code – published – test <<< Directory contains test code test> make
  • 35. Some points to keep in mind • gtest is useful for testing primitive functions in libraries • Unit testing does not replace regression testing • With gtest: – You do not modify production code. – You add test code that calls library functions. – You check-in test code to repository • Production code is not compiled/linked with gtest • Using gtest creates a test binary, not icv binary
  • 36. Coding Style and Rules • Don’t mix TEST(), TEST_F(), TEST_P() • Don’t use global variables, use test fixture to instead • Gtest does not reuse the same test fixture object across multiple tests • Spell SetUp() correctly. • Gtest use fork() to do death test, do not try not to free memory in a death test. • You can derive new class from your own class.
  • 37. Coding Style and Rules • Use Camel Case style to name test cases and suite – E.g., TEST(Time, Flies_Like_An_Arrow) { ... } and TEST(Time_Flies, Like_An_Arrow) { … } will have the same name Time_Files_Like_An_Arrow_Test • Current Naming Rule – Test suite name is all uppercase – Test case name is Camel Case style with underscore. – E.g., TEST_F(SPACING_UTIL__PNT_EDGE, WhichHalfRes_SamePoints)
  • 38. Key Features & Characters Boost Test Google Test UnitTest++ Free (Open Source) software Yes Yes Yes Simple to use Yes (5 out of 5) Yes (5 out of 5) Yes (4 out of 5) Test cases grouping & organization Good Good Normal Test case template support Yes Yes Yes Test fixture (i.e. fixed state used as a baseline for running test) support Yes Yes Yes Global test fixture Yes Yes No Handle C++ exceptions Yes Yes Yes Different types of assertions support Yes Yes No Fatal and non-fatal assertions Yes Yes No Support Regular Expression when matching function output Yes Yes No Output in XML format Yes Yes No
  • 39. Key Features & Characters Boost Test Google Test UnitTest++ Support Mock object (objects can simulate the behavior of complex objects) No Yes (work seamlessly with Google Mock) No Extend features with event mechanism No Yes No Run tests on distributed machines No Yes No Thread safety when running tests No Yes No Run subset of all defined test cases Yes (only support filtering by test name) Yes (support multiple filtering conditions) No • Karl Chen, C++ Unit Testing Frameworks Evaluation