Google C++ Testing Framework ์์ํ๊ธฐ
Introduction
Google C++ Testing Framework(์ดํ google test)์ ๋ ๋์ C++ test๋ฅผ ์ํ tool์ด๋ค. ๋ Linux, Mac, Windows ๋ชจ๋์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ข์ test๋ฅผ ์ํด Google test๊ฐ ์ด์ ์ ๋ง์ถ๊ณ ์๋ ๋ด์ฉ์ ์๋์ ๊ฐ๋ค.
1. Test๋ ๋
๋ฆฝ์ ์ด์ด์ผ ํ๊ณ ๋ฐ๋ณต๊ฐ๋ฅํด์ผ ํ๋ค.
Success ํน์ Fail์ธ test๋ฅผ debug ํ๋ ์ผ์ ํ๋ ์ผ์ด๋ผ google test๋ test๋ฅผ ๋ณ๋์ object๋ก ๋ถ๋ฆฌํด ๋
๋ฆฝ์ ์ผ๋ก ์ํ๋๋๋ก ๋ง๋ ๋ค. Test fail์ธ ๊ฒฝ์ฐ google test์์๋ ์คํจํ case๋ง ๋ณ๋๋ก ์ํํด ๋น ๋ฅธ debugging์ด ๊ฐ๋ฅํ๋๋ก ์ง์ํ๋ค.
2. Test๋ ์ ์กฐ์ง๋์ด ์์ด์ผ ํ๊ณ , test๋๋ code์ ๊ตฌ์กฐ๋ฅผ ์ ๋ฐ์ํ๊ณ ์์ด์ผ๋ง ํ๋ค.
Google test๋ ๊ฐ์ด ๊ณต์ ํ ์ ์๋ data์ subroutine์ ๊ฐ์ง testcase๋ค๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ฌํ ๊ณตํต์ ์ธ ํจํด๋ค์ด test๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ฒ ํ๊ณ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๊ฒ ๋ง๋ค์ด์ค๋ค.3. Test๋ portable ํด์ผํ๋ฉฐ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํด์ผ ํ๋ค.
Open source community๋ ํ๋ซํผ์ ์ข
์์ ์ธ ๋ง์ source code๋ค์ ๋ณด์ ํ๊ณ ์์ผ๋ฉฐ ์ด๋ค์ testํ๊ธฐ ์ํด์๋ test ๋ํ ํน์ ํ๋ซํผ์ ์ข
์์ ์ด์ด์ผ ํ๋ค. ๊ทธ๋์ google test๋ ๋ค์ํ OS์ compiler๋ฅผ ์ง์ํ๋ฉฐ ๋ค์ํ ์ค์ ์ผ๋ก ๋์์ด ๊ฐ๋ฅํ๋ค.4. Test๊ฐ ์คํจํ์ ๋, ๋ฌธ์ ์ ๋ํ ์ ๋ณด๋ค์ ๊ฐ๋ฅํ ๋ง์ด ์ ๊ณตํด์ผ ํ๋ค.
Google test๋ ์ฒซ๋ฒ์งธ ์คํจ ์์ ์์ ๋ฉ์ถ์ง ์๋๋ค. ๋์ ์ ํ์ฌ์ test๋ ์ค๋จ์ํค๊ณ , ๋ค์์ test๋ก ๊ณ์ ์งํ๋๋๋ก ํ๋ค. ํ์ฌ์ test๊ฐ ์ง๋๊ฐ ํ์ ์น๋ช
์ ์ด์ง ์์ ์คํจ์ ๋ํด report ํ๋๋ก ์ค์ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ ์ฌ๋ฌ๊ฐ์ bug๋ค์ ๋ฐ๊ฒฌํ๊ณ ์์ ํ ์ ์๋ค.
5. Testing framework์ test ์์ฑ์๋ค์ ๋ค๋ฅธ ์ผ๋ค์์ ํด๋ฐฉ์ํค๊ณ test ๋ด์ฉ์๋ง ์ง์คํ ์ ์๊ฒ ๋ง๋ค์ด์ค์ผ ํ๋ค.
Google test๋ ์ด๋ฏธ ์ ์๋ test๋ค์ ์ ์งํด ๋๊ธฐ ๋๋ฌธ์ test ์คํ์ ์ํด ์ฌ์ฉ์๋ค์ด ๋ ๋ค์ ๋์ดํ ํ์๊ฐ ์๋๋ก ํ๋ค.6. Test๋ ๋นจ๋ผ์ผ๋ง ํ๋ค.
Google test๋ฅผ ์ฌ์ฉํ๋ฉด test ์ฌ์ด์์์ ๊ณต์ ๋ ์์๋ค์ ์ฌ์ฌ์ฉํ ์ ์๋ค.
Google test๋ xUnit architecture ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ JUnit์ด๋ PyUnit์ ์ฌ์ฉํ ๋์ ๋น์ทํ์ฌ ๋น ๋ฅด๊ฒ ์ ์ฉํ๊ธฐ ์ข๋ค.
Setting up a New Test Project
Google test๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ Google test๋ฅผ compile ํด์ ์ฌ์ฉ์์ test์ library๋ก link ํด์ผ๋ง ํ๋ฉฐ, ์์ฃผ ์ฌ์ฉ๋๋ build system์ ๋ํ build file์ ์ ๊ณตํ๊ณ ์๋ค.(msvc, xcode, make, codegear, scons directory) ๋ง์ฝ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋๋ ๊ฒ๊ณผ ๋ค๋ฅธ system์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด make/Makefile์ ์ฐธ์กฐํ๋ฉด ๋๋๋ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก src/gtest-all.cc์ GTEST_ROOT, GTEST_ROOT/include๋ฅผ compile ํด์ผ๋ง ํ๋ค.(GTEST_ROOT : Google test root directory)
Google test library๋ฅผ compile ํ ์ ์๊ฒ ๋์๋ค๋ฉด project๋ฅผ ์์ฑํด์ ์ฌ์ฉ์์ test program์ ์ํ build target์ ์ํํด์ผ๋ง ํ๋ค. ๋ ์ฌ์ฉ์์ test๋ฅผ compile ํ ๋, compiler๊ฐ gtest/gtest.h๋ฅผ ์ฐพ์ ์ ์๊ฒ GTEST_ROOT/include ๋ฅผ ํฌํจํด์ผ๋ง ํ๋ค.
Basic Concepts
Google test๋ฅผ ์ฌ์ฉํ ๋ condition์ด true์ธ์ง๋ฅผ ํ์ธํ๋ assertion์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์์ํ๋ ๊ฒ์ด ์ข๋ค. Assertion์ ๊ฒฐ๊ณผ๋ success, nonfatal failure, fatal failure ์ค์ ํ๋๊ฐ ๋ ์ ์์ผ๋ฉฐ, fatal failure๊ฐ ๋ฐ์ํ๋ค๋ฉด ํ์ฌ์ function์ ์ค๋จ๋ ๊ฒ์ด๋ค. (ํ์ง๋ง ์ ์ฒด program์ ์ ์์ ์ผ๋ก ์งํ๋จ)
Testcase๋ ํ๋ ์ด์์ test๋ก ๊ตฌ์ฑ๋ ์ ์๋๋ฐ ์ฌ์ฉ์๋ code์ ๊ตฌ์กฐ๋ฅผ ๋ฐ์ํ ์ ์๋๋ก ์ฌ๋ฌ๊ฐ์ testcase๋ค๋ก grouping์ด ๊ฐ๋ฅํ๋ฉฐ, ๋ณต์์ test๊ฐ common object๋ subroutine์ ๊ณต์ ํด์ผ ํ๋ค๋ฉด ๊ทธ๋ฐ ๊ฒ๋ค์ test fixture class์ ๋ฃ์ด๋๊ณ ์ฌ์ฉํ ์ ์๋ค.
Assertions
Google test์ assertion์ function call๋ก ๊ตฌ์ฑ๋ macro์ด๋ค. Assertion์ด fail๋ก ๋๋๊ฒ ๋๋ฉด, google test๋ assertion์ source file, line number, failure message ๋ค์ ํ๋ฉด์ ์ถ๋ ฅํ๋ค.
Assertion์ ๊ฐ์ง๋ง ํ์ฌ์ function์ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ function ๋ค์ ์ง์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋๋ฐ, ASSERT_XXX ์ ํํ๋ก ๊ตฌ์ฑ๋ assertion์ fatal failure๋ฅผ ๋ฐ์์์ผ ํ์ฌ์ function์ ์ค๋จ์ํค๋ฉฐ, EXPECT_XXX ํํ์ assertion์ nonfatal failure๋ฅผ ๋ฐ์์ํค๊ณ ํ์ฌ ์ํ์ค์ธ function์ ์ค๋จ์ํค์ง ์๋๋ค.
Custom failure message ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, '<<' ์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ ํด๊ฒฐํ ์ ์๋ค. ์์ ๋ ์๋์ ๊ฐ๋ค.
ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length";
for (int i = 0; i < x.size(); ++i) {
EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
}
๋ง์ฝ wchar_t*, TCHAR* ๋ฑ์ wide string์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ์ถ๋ ฅ๋๋ฉด์ ์๋์ผ๋ก UTF-8๋ก ๋ณํ๋๋ค.
Basic Assertions
์์์๋ ์ธ๊ธ๋์์ง๋ง ASSERT_XXX๋ fatal failure๋ฅผ ๋ฐ์์ํค๋ฉฐ, EXPECT_XXX๋ nonfatal failure๋ฅผ ๋ฐ์์ํจ๋ค.
Binary Comparison
์ฌ๊ธฐ์์๋ ๋ ๊ฐ์ ๋น๊ตํ๋ assertion ๊ตฌ๋ฌธ๋ค์ ์ค๋ช ํ๋ค.
์คํจํ์ ๊ฒฝ์ฐ google test๋ ๋ ๊ฐ์ง ๊ฐ val1, val2๋ฅผ ์ถ๋ ฅํ๊ฒ ๋๋๋ฐ ์ฌ์ฉ์๊ฐ test ํ๊ณ ์ ํ๋ ๊ตฌ๋ฌธ์ actual์, expected value๋ expected ํญ๋ชฉ์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.
์ด๋ฌํ assertion ๊ตฌ๋ฌธ๋ค์ ์ฌ์ฉ์ ์ ์ operator๋ค์ ๋ํด์๋ ๋์์ด ๊ฐ๋ฅํ๋ฐ, ๋ง์ฝ ์ฌ์ฉ์ ์ ์ ์ฐ์ฐ์๋ค์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ASSERT_XXX ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ์๋ํ๋ฉด ASSERT_XXX ๊ตฌ๋ฌธ์ ๋น๊ต ๊ฒฐ๊ณผ ๋ฟ๋ง ์๋๊ณ , ๋ ๊ฐ์ operand ๋ค๋ ํ๋ฉด์ ์ถ๋ ฅํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
ASSERT_EQ์์ pointer๋ฅผ ์ฌ์ฉํ๋ค๋ฉด pointer์ ์ผ์น์ฌ๋ถ๋ฅผ ํ ์คํธํ๊ฒ ๋๋ค. ๋ง์ฝ ๋ ๊ฐ์ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ค๋ฉด, ๋ ๋ฌธ์์ด์ ๊ฐ์ด ์ผ์นํ๋๋๋ฅผ ํ ์คํธํ์ง ์๊ณ ๋์ผํ memory location์ธ์ง๋ฅผ ํ๋จํด์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ณด๋ธ๋ค. ๋ง์ฝ์ ๋ฌธ์์ด ๊ฐ์ ์ผ์น์ฌ๋ถ๋ฅผ ํ ์คํธํ๊ณ ์ถ๋ค๋ฉด ASSERT_EQ๋ฅผ ์ฌ์ฉํด์๋ ์๋๊ณ ๋์ ์ ASSERT_STREQ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ํน๋ณํ ๊ฒฝ์ฐ, NULL์ ๋น๊ตํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค๋ฉด ASSERT_STREQ(NULL, c_string)์ ์ฌ์ฉํ๋ฉด ๋์ง๋ง, ๋ ๊ฐ์ ๋ฌธ์์ด object๋ฅผ ๋น๊ตํ๋ ค๊ณ ํ๋ค๋ฉด ASSERT_EQ๋ฅผ ์ฌ์ฉํ๋ค.
ASSERT ๊ตฌ๋ฌธ์ narrow, wide string ๋ชจ๋์ ๋ํด ๋์ํ๋ค.
String Comparison
๋ฌธ์์ด ๋น๊ต๋ฅผ ์ํด์๋ ๋ค์์ assertion ๊ตฌ๋ฌธ๋ค์ ์ฌ์ฉํ๋ค.
์์ assertion ๊ตฌ๋ฌธ์ค CASE๊ฐ ํฌํจ๋ ํญ๋ชฉ๋ค์ด ์๋๋ฐ, CASE๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ณํ์ง ์๋๋ค๋๊ฑธ ์๋ฏธํ๋ค. ๋ NULL pointer์ ๋น์ด์๋ ๋ฌธ์์ด์ ๋ค๋ฆ์ ์ ์ํด์ผ ํ๋ค.
Simple Tests
Test๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ผ๋จ ์๋์ ์ ์ฐจ๋๋ก ์ํํ๋ค.
1. Test function์ ์ ์ํ๊ณ ์ด๋ฆ ๋ถ์ด๊ธฐ ์ํด์ TEST() macro๋ฅผ ์ฌ์ฉํ๋ค. ์ด macro๋ ์ผ๋ฐ์ ์ C++ function์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ๊ฒฐ๊ณผ๊ฐ์ return ํ์ง ์๋๋ค.
2. ์ด function์์ ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ฐ๋ฅํ C++ ๊ตฌ๋ฌธ๋ค์ ์ฌ์ฉํ๋ฉด ๋๊ณ , ๊ฐ์ ๋น๊ต๋ฅผ ์ํด์๋ google test์ assertion ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
3. Test ๊ฒฐ๊ณผ๋ ์ด assertion ๊ตฌ๋ฌธ์ ์ํด ๊ฒฐ์ ๋๋ค.
TEST(test_case_name, test_name) {
... test body ...
}
TEST() macro์์ ์ฒซ๋ฒ์งธ argument๋ testcase์ ์ด๋ฆ์ ์๋ฏธํ๋ฉฐ ๋๋ฒ์งธ argument๋ testcase ์์์์ test ์ด๋ฆ์ ์๋ฏธํ๋ค. Testcase๋ ์ฌ๋ฌ๊ฐ์ test๋ฅผ ํฌํจํ ์ ์๋ค. ๋ ๋ค๋ฅธ testcase์์ ๊ฐ์ test ์ด๋ฆ์ ๊ฐ์ง ์ ์๋ค.
์๋ฅผ ๋ค์ด๋ณด์. ๊ฐ๋จํ function์ธ
int Factorial(int n); // Returns the factorial of n
์ด ์๋ค.
์ด function์ test ํ๊ธฐ ์ํด์ ์๋์ ๊ฐ์ testcase๋ฅผ ์์ฑํ ์ ์๋ค.
// Tests factorial of 0.
TEST(FactorialTest, HandlesZeroInput) {
EXPECT_EQ(1, Factorial(0));
}
// Tests factorial of positive numbers.
TEST(FactorialTest, HandlesPositiveInput) {
EXPECT_EQ(1, Factorial(1));
EXPECT_EQ(2, Factorial(2));
EXPECT_EQ(6, Factorial(3));
EXPECT_EQ(40320, Factorial(8));
}
Google test๋ testcase์ ์ํด grouping ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฐ, TEST()์ ์ฒซ๋ฒ์งธ argument๋ฅผ ๋์ผํ๊ฒ ์ฌ์ฉํจ์ผ๋ก์จ ์ด๋ฅผ ๊ฐ๋ฅ์ผ ๋ง๋ค ์ ์๋ค. ์์ ์์ ์์ ๋ณด๋ฉด HandlesZeroInput ์ด๋ผ๋ test์ HandlesPositiveInput test๋ ๊ฐ๊ฐ ๋ค๋ฅธ test๋ฅผ ์๋ฏธํ์ง๋ง FactorialTest ๋ผ๋ testcase์ ์ด๋ฆ์ ๋์ผํ๊ฒ ์ฌ์ฉํจ์ผ๋ก์จ grouping์ด ๊ฐ๋ฅํจ์ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.
Text Fixtures : Using the Same Data Configuration for Multiple Tests
์ฌ์ฉ์๊ฐ ์ ์ฌํ data๋ฅผ ์ฌ์ฉํด์ ํ๋ ์ด์์ test๋ฅผ ์์ฑํ๋ค๋ฉด, test fixture๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด test fixture๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ฌ๋ฌ๊ฐ์ ๋ค์ํ test๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ ๊ฐ์ object์ configuration์ ์ฌ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
Fixture๋ฅผ ์์ฑํ ๋์๋ ์๋์ ๋ด์ฉ๋๋ก ์ํํ๋ฉด ๋๋ค.
1. ::testing::Test ๋ก๋ถํฐ class๋ฅผ deriveํ๋ค. Sub-class ์์ fixture member์ ์ ๊ทผํด์ผ ํ๊ธฐ ๋๋ฌธ์ protected ํน์ public ์ผ๋ก ์์ฑํด์ผ ํ๋ค.
2. Class ๋ด๋ถ์์ ์ฌ์ฉ์๊ฐ ์ํ๋๋๋ก object๋ค์ ์ ์ธํด ์ฌ์ฉํ๋ค.
3. ํ์ํ๋ค๋ฉด, ์์ฑ์๋ SetUp() function์ ์์ฑํด๋๋ค.
4. ์์ฑ์๋ SetUp() function์ ์ ์ํด์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ํด๋น function์์ ์ฌ์ฉํ๋ resource๋ฅผ ๋ฐํํ๊ธฐ ์ํด ์๋ฉธ์๋ TearDown() function์ ์์ฑํ๋ค.
5. Subroutine ๋ค์ ์์ฑํ๋ค.
Fixture๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ TEST() ๋์ ์ TEST_F()๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๋ค.
TEST()์์๋ ์ฒซ๋ฒ์งธ argument๊ฐ testcase์ ์ด๋ฆ์ด์์ง๋ง TEST_F()๋ฅผ ์ฌ์ฉํ ๋๋ ์ฒซ๋ฒ์งธ argument๋ก test fixture class์ ์ด๋ฆ์ ์ฌ์ฉํด์ผ๋ง ํ๋ค.
๋ถํํ๊ฒ๋ C++ macro ๋ผ๋๊ฒ ๋๊ฐ์ง type์ ์ฒ๋ฆฌํ๋ ํ๋์ macro๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด์ฉ ์ ์์ด ๋ ๊ฐ์ง์ macro TEST(), TEST_F()๋ฅผ ์ ์ ํ ์ฌ์ฉํด์ผ๋ง ํ๋ค. ๋ ๋น์ฐํ๊ฒ ์ง๋ง TEST_F() macro๋ฅผ ์ฌ์ฉํ๊ธฐ ์ด์ ์ TEST_F()์ ์ฌ์ฉ๋ fixture class๊ฐ ์ ์๋์ด ์์ด์ผ๋ง ํ๋ค.
TEST_F()๋ฅผ ์ฌ์ฉํ ๋, google test๋ ์๋์ ๊ฐ์ ์ ์ฐจ๋ฅผ ์ํํ๊ฒ ๋๋ค.
1. Runtime ์์ test fixture๋ฅผ ์์ฑํ๋ค.
2. SetUp()์ ํธ์ถํด ์ด๊ธฐํ๋ฅผ ์ํํ๋ค.
3. Test๋ฅผ ์ํํ๋ค.
4. TearDown()์ ํธ์ถํจ์ผ๋ก์จ resource๋ฅผ ๋ฐํํ๊ฑฐ๋ ํ๋ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
5. Test fixture๋ฅผ ์๋ฉธ์ํจ๋ค. ์ฃผ์ํ ๋ด์ฉ์ ๊ฐ์ testcase ๋ด๋ถ์์์ ๊ฐ๊ฐ์ test๋ ๋ค๋ฅธ test fixture๋ฅผ ํ๋ณดํด ์ฌ์ฉํ๋ฉฐ google test๋ ๋ค์ test fixture๋ฅผ ์์ฑํ๊ธฐ ์ ์ ์ด์ fixture๋ฅผ ์ญ์ ํ๋ค. Google test๋ ์ฌ๋ฌ๊ฐ์ test๋ฅผ ์ํด ๋์ผํ test fixture๋ฅผ ์ฌ์ฌ์ฉํ์ง ์์ผ๋ฉฐ ํ๋์ test๊ฐ test fixture์ ๊ฐํ ๋ณํ๊ฐ ๋ค๋ฅธ test ๋ค์๋ ์ํฅ์ ์ฃผ์ง ์์์ ์๋ฏธํ๋ค.
์๋์ ์์ ๋ฅผ ์ดํด๋ณด์. Queue๋ผ๋ ์ด๋ฆ์ queue class์ ๋ํ test๋ฅผ ์์ฑํ๋ค๊ณ ์๊ฐํด๋ณด์.
template <typename E> // E is the element type.
class Queue {
public:
Queue();
void Enqueue(const E& element);
E* Dequeue(); // Returns NULL if the queue is empty.
size_t size() const;
...
};
๊ฐ์ฅ ๋จผ์ fixture class๋ฅผ ์ ์ํ๋ค.
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_;
};
์ด ๊ฒฝ์ฐ์ ๊ฐ test ๋ง๋ค ์๋ฉธ์๊ฐ ๋์ ์ํํ๊ธฐ ๋๋ฌธ์ ๊นจ๋ํ๊ฒ ์ ๋ฆฌํ ํ์๊ฐ ์์ด์ TestDown()์ ์์ฑํ์ง ์์๋ค. ์ด ์์ ๊น์ง ๋ง์น ํ์ ์๋์ฒ๋ผ test fixture๋ฅผ ์ด์ฉํด TEST_F()๋ฅผ ์์ฑํ ์ ์๋ค.
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;
}
์ด test๋ค์ด ์ํ๋ ๋ ์๋์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค.
1. Google test๊ฐ QueueTest object๋ฅผ ์์ฑํ๋ค. (t1์ด๋ผ ๋ถ๋ฅด์.)
2. t1.SetUp() ์ด ํธ์ถ๋์ด์ t1์ ์ด๊ธฐํํ๋ค.
3. t1์ ์ฒซ๋ฒ์งธ test์ธ IsEmptyInitially๊ฐ ์ํ๋๋ค.
4. Test ์ข
๋ฃ ํ์ t1.TearDown()์ด ํธ์ถ๋์ด ์ ๋ฆฌํ๋ค.
5. t1์ด ์๋ฉธ๋๋ค.
6. ๋ค๋ฅธ QueueTest object์ ๋ํด ์์ ๊ณผ์ ์ด ๋ฐ๋ณต๋๋๋ฐ, ์ด๋ฒ์ DequeueWork test์ ๋ํด ๋ฐ๋ณต ์ํ๋๋ค.
Invoking the Tests
TEST()์ TEST_F() ๋ google test์์ ๋ด๋ถ์ ์ผ๋ก ๋ฑ๋ก๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ C++ testing framework ๋ค๊ณผ ๋ฌ๋ฆฌ test๋ฅผ ์ํํ๊ธฐ ์ํด ๋ค์ ์ ์ํ ํ์๊ฐ ์๋ค.
Test ๋ค์ ์ ์ํ ํ์ RUN_ALL_TESTS()๋ฅผ ์ฌ์ฉํด์ test๋ฅผ ์ํ์ํฌ ์ ์๋ค. RUN_ALL_TESTS()๋ ๋ชจ๋ test๊ฐ ์ฑ๊ณต์ผ ๋์๋ 0์ ๋ฐํํ๊ณ ์๋ ๊ฒฝ์ฐ์๋ 1์ returnํ๋ macro์ด๋ค. RUN_ALL_TESTS()๋ ์๋์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด์ ์ํ๋๋ค.
1. Google test์ ๋ชจ๋ flag๋ค์ ์ํ๋ฅผ ์ ์ฅํ๋ค.
2. ์ฒซ๋ฒ์งธ test๋ฅผ ์ํ test fixture๋ฅผ ์์ฑํ๋ค.
3. SetUp()์ผ๋ก ์ด๊ธฐํํ๋ค.
4. Fixture object์ ํจ๊ป test๋ฅผ ์ํํ๋ค.
5. TearDown()์ ํธ์ถํด์ resource๋ค์ ๋ฐํํ๊ฑฐ๋ ์ ๋ฆฌํ๋ค.
6. Fixture object๋ฅผ ์ ๊ฑฐํ๋ค.
7. Google test์ flag๋ค์ ๋ณต๊ตฌํ๋ค.
8. ๋ชจ๋ test๊ฐ ์๋ฃ๋ ๋ ๊น์ง ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
RUN_ALL_TEST()๋ ํ ๋ฒ ์ด์ ์ํํ๋๊ฑธ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋จ ํ๋ฒ๋ง ํธ์ถ๋ ์ ์๋๋ก ์์ฑํด์ผ ํ๋ค.
Writing the main() function
์๋์ ์์ฒ๋ผ test์ ํ์ํ test fixture๋ main() function์ ์์ฑํ ์ ์๋ค.
#include "this/package/foo.h"
#include <gtest/gtest.h>
namespace {
// The fixture for testing class Foo.
class FooTest : public ::testing::Test {
protected:
// You can remove any or all of the following functions if its body
// is empty.
FooTest() {
// You can do set-up work for each test here.
}
virtual ~FooTest() {
// You can do clean-up work that doesn't throw exceptions here.
}
// If the constructor and destructor are not enough for setting up
// and cleaning up each test, you can define the following methods:
virtual void SetUp() {
// Code here will be called immediately after the constructor (right
// before each test).
}
virtual void TearDown() {
// Code here will be called immediately after each test (right
// before the destructor).
}
// Objects declared here can be used by all tests in the test case for Foo.
};
// Tests that the Foo::Bar() method does Abc.
TEST_F(FooTest, MethodBarDoesAbc) {
const string input_filepath = "this/package/testdata/myinputfile.dat";
const string output_filepath = "this/package/testdata/myoutputfile.dat";
Foo f;
EXPECT_EQ(0, f.Bar(input_filepath, output_filepath));
}
// Tests that Foo does Xyz.
TEST_F(FooTest, DoesXyz) {
// Exercises the Xyz feature of Foo.
}
} // namespace
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
์ด ์์ ์์ main() function์ ์ฌ์ฉ๋ ::testing::InitGoogleTest() function์ google test์ flag๋ฅผ ์ค์ ํ๊ธฐ ์ํด command line์ผ๋ก ์ ๋ ฅ๋ ๊ฐ๋ค์ ์ฌ์ฉํ๋ค. ์ด๋ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉ์๊ฐ ๋ค์ํ flag๋ฅผ ํตํด test program์ ์ ์ด ๊ฐ๋ฅํ๋๋ก ํด์ค๋ค.
Important note for Visual C++ users
๋ง์ฝ ์ฌ์ฉ์๊ฐ test๋ฅผ library์ ๋ฃ์ด๋์๊ณ , main() function์ด .exe ํ์ผ ์์์ ๋ณ๋์ library๋ก ์์ฑ๋์ด ์๋ค๋ฉด test๋ ์ํ๋์ง ์์๊ฒ์ด๋ค. ์ด์ ๋ Visual C++์ bug ๋๋ฌธ์ธ๋ฐ, ์ฌ์ฉ์๊ฐ test๋ฅผ ์ ์ํ์ ๋, google test๋ test๋ฅผ ๋ฑ๋กํ๊ธฐ ์ํด static object๋ก ์์ฑํ๋ค. ์ด๋ฌํ object๋ค์ ์ด๋์๋ ์ฐธ์กฐ๋์ง ๋ชปํ์ง๋ง ์์ฑ์๋ค์ ์ฌ์ ํ ์ํํ๋ ค๊ณ ํ๋ค. ๊ทธ๋์ ์ฌ์ฉ์๋ main program์์ test์ ํจ๊ป library๋ฅผ ์ฐธ์กฐํด์ผ๋ง ํ๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ library์์ ์๋์ฒ๋ผ function์ ์ ์ธํ๋ค.
__declspec(dllimport) int PullInMyLibrary() { return 0; }
DLL์ด ์๋ static library๋ก ์์ฑํ๋ค๋ฉด ์์ ๊ฐ์ ์ ์ธ์ ํ์ํ์ง ์์ง๋ง, main program์์๋ ์๋์ ๊ฐ์ด ์์ฑํด ์ฃผ์ด์ผ ํ๋ค.
int PullInMyLibrary();
static int dummy = PullInMyLibrary();
์ถ๊ฐ๋ก static library๋ก test๋ฅผ ์์ฑํ๋ค๋ฉด main program์ linker option์ /OPT:NOREF๋ฅผ ๋ฃ์ด์ฃผ์ด์ผ ํ๊ณ , test๋ฅผ DLL๋ก ์์ฑํ๊ฒ ๋๋ค๋ฉด google test ์ญ์ DLL๋ก build ํด์ฃผ์ด์ผ test๊ฐ ์ ๋๋ก ์ํ๋ ์ ์๋ค. ๊ทธ๋๋ ๊ฐ์ฅ ์์ฌ์ด ๋ฐฉ๋ฒ์ test๋ฅผ library๋ก ๋ง๋ค์ง ์๋ ๊ฒ์ด๋ค.
* ์ถ์ฒ : http://blurblah.net/194
728x90