GTEST 설치하기
: GTEST는 google에서 개발한 C++ testing framework이다. 이를 이용해 손쉽게 TC를 만들어 개발한 코드 또는 API의 유효성을 검증할 수 있다.
다음은 이를 설치하는 방법이다.
sudo apt-get install libgtest-dev
cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make
cd ./lib
sudo cp *.a /usr/lib
간단한 예제를 통해 살펴보기
아래와 같이 calculator API가 있다고 가정하자.
// calculator.h
class calculator
{
private:
/* data */
public:
int plus(int var1, int var2);
int minus(int var1, int var2);
int divide(int var1, int var2);
int multiply(int var1, int var2);
};
// calculator.cpp
#include <iostream>
#include "calculator.h"
int calculator::plus(int var1, int var2)
{
std::cout << var1 + var2 << std::endl;
return var1 + var2;
}
int calculator::minus(int var1, int var2)
{
std::cout << var1 - var2 << std::endl;
return var1 - var2;
}
int calculator::divide(int var1, int var2)
{
std::cout << var1 / var2 << std::endl;
return var1 / var2;
}
int calculator::multiply(int var1, int var2)
{
std::cout << var1 * var2 << std::endl;
return var1 * var2;
}
위의 calculator.h, calculator.cpp 에서 제공하는 plus, minus, divide, multiply API의 동작(간단한 테스트를 위해 divide by zero 등과 같은 것들은 고려하지 않았습니다)을 검증하기 위해 다음과 같이 TC를 작성할 수 있다.
// main.cpp
#include "calculator.h"
#include "gtest/gtest.h"
namespace {
class CalculatorTest : public ::testing::Test
{
public:
calculator gCalculator;
protected:
CalculatorTest() {}
virtual ~CalculatorTest() {}
virtual void SetUp()
{
std::cout << "Setup" << std::endl;
}
virtual void TearDown()
{
std::cout << "TearDown" << std::endl;
}
};
TEST_F(CalculatorTest, plus_p)
{
EXPECT_EQ(2, gCalculator.plus(1, 1));
}
} // namespace
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
이렇게 작성한 파일들을 다음의 명령으로 컴파일 및 실행하면
g++ -o main main.cpp calculator.cpp -lgtest -lpthread
./main
./main
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from CalculatorTest
[ RUN ] CalculatorTest.plus_p
Setup
2
TearDown
[ OK ] CalculatorTest.plus_p (0 ms)
[----------] 1 test from CalculatorTest (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[ PASSED ] 1 test.
이렇게 TC의 동작 결과를 확인할 수 있다.
More about GTEST
위의 예제에서 EXPECT_EQ()을 통해 TC의 동작을 확인하였다. EXPECT_EQ처럼 사용할 수 있는 구문은 다음과 같다. ASSERT_@@
과 EXPECT_@@
의 차이는 ASSERT_@@
의 경우 TC에서 Fail이 발생하였을 경우 해당 위치 아래의 TC들은 더이상 실행하지 않고 종료하는 반면, EXPECT_@@
의 경우 TC에서 Fail이 발생하여도 아래의 TC들을 계속해서 실행한다.
이러한 내용들을 아래에서는 ASSERT_@@
는 Fatal assertion
, EXPECT_@@
는 Nonfatal assertion
으로 부른다.
Basic Assertion
: 참과 거짓을 테스트하는 구문이다.
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_TRUE(condition); |
EXPECT_TRUE(condition); |
condition is true |
ASSERT_FALSE(condition); |
EXPECT_FALSE(condition); |
condition is false |
Binary Comparison
: 비교문을 통해 테스트하는 방법입니다.
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_EQ(val1, val2); |
EXPECT_EQ(val1, val2); |
val1 == val2 |
ASSERT_NE(val1, val2); |
EXPECT_NE(val1, val2); |
val1 != val2 |
ASSERT_LT(val1, val2); |
EXPECT_LT(val1, val2); |
val1 < val2 |
ASSERT_LE(val1, val2); |
EXPECT_LE(val1, val2); |
val1 <= val2 |
ASSERT_GT(val1, val2); |
EXPECT_GT(val1, val2); |
val1 > val2 |
ASSERT_GE(val1, val2); |
EXPECT_GE(val1, val2); |
val1 >= val2 |
String Comparison
: String의 내용에 대해서 비교하여 테스트하는 방법입니다.
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_STREQ(str1,str2); |
EXPECT_STREQ(str1,str2); |
두 개의 C String이 동일한 값을 가지고 있을 때 |
ASSERT_STRNE(str1,str2); |
EXPECT_STRNE(str1,str2); |
두 개의 C String이 서로 다른 값을 가지고 있을 때 |
ASSERT_STRCASEEQ(str1,str2); |
EXPECT_STRCASEEQ(str1,str2); |
두 개의 C String이 대/소문자를 고려하지 않고 동일한 값을 가지고 있을 때 |
ASSERT_STRCASENE(str1,str2); |
EXPECT_STRCASENE(str1,str2); |
두 개의 C String이 대/소문자를 고려하지 않고 다른 값을 가지고 있을 때 |
TEST_F와 TEST의 차이
: 위에서 사용하지는 않았지만 TEST_F
외에도 TEST
구문이 존재한다. TEST_F
의 경우에는 SetUp()
, TearDown()
을 통해서 TC수행 이전에 필요한 변수, 값들을 설정하고 TC가 끝난 이후에 할당한 변수, 값들을 해제하는 작업을 손쉽게 행할 수 있다. 만약 Instance 생성, Network 연결 등의 작업을 TC 수행 전에 반복적으로 해야하는 경우에는 SetUp()내에 이러한 작업을 해 두면 손쉽게 TC를 진행할 수 있다.
간단하게 말해서
- SetUp() 수행
- TEST_F(Fixture, add) 수행
- TearDown() 수행
- SetUp() 수행
- TEST_F(Fixture, diff) 수행
- TearDown() 수행
위의 순서대로 수행된다고 보면 된다. TEST
의 경우에는 위의 SetUP(), TearDown()이 필요없는 간단한 TC의 경우에 사용하면 좋을 듯 하다.
설치 오류
: 설치 후 gtest를 사용하기위해 #include "gtest/gtest.h"
를 하였을 때, 아래와 같은 오류를 본 적이 있는가? Googletest/gtets: fatal error: gtest.h: No such file or directory
그렇다면 이 페이지(jayy-h.tistory.com/21)에서 알려주고 있는 설치 가이드를 따르기 바란다. 나 또한 위와 같은 오류를 겪었고, 오랜 시간 발품을 팔아 확인한 솔루션이다.
Reference
googletest 공식문서
'빌드&테스트도구 > 테스팅도구(gcov,gtest.' 카테고리의 다른 글
valgrind - 메모리 관련 문제 파악 (0) | 2020.10.03 |
---|---|
lcov, genhtml - coverage 정보를 깔끔한 웹 페이지로 만들기 (0) | 2020.09.28 |
gcov - 커버리지 측정 (0) | 2020.09.26 |