Development.

[DEV] Google Test

Chuuu_DevCamp:) 2023. 8. 28. 18:40
반응형

Google Test의 개념과 활용방안에 대해 알아보고 테스트 문법을 알아보도록 하자.

1) Google Test란?

Google Test는 C/C++ 테스트를 위한 구글에서 제공하는 프레임워크이다. 

SW를 개발하고 검증할 때 필요한 유닛 테스트를 구현하려면 실제 SW가 돌아가는 환경과 다른 환경에서 테스트 해야 할 필요가 있을 때가 있다. 예를 들면 HW가 준비되지 않았거나, 리소스가 충분히 준비되지 않았을 때 테스트 환경을 구성하는데 많은 시간과 비용이 든다. 따라서, 호스트 PC 또는 서버 환경에서 실제와 비슷하게 동작하도록 하는 테스트 환경이 필요하고, 이러한 테스트 수단을 제공하는 것이 Google Test이다.

Google Test 프레임워크를 사용해서 SW 개발에 대한 검증을 쉽고 빠르게 진행함으로써 SW의 전반적인 품질을 향상시킬 수 있다.

 

2) 사용 방법?

Visual Studio 2017부터 Google test가 IDE에 내장되어 있어 아래를 따라 수행하면 Google test 프로젝트를 생성할 수 있다.

Visual Studio 실행 → 파일 → 새로 만들기 → 프로젝트

Visual C++ → 테스트 → Google Test → 확인

정적 라이브러리(.lib)선택 / 동적으로 연결(권장) 선택 후 OK → 프로젝트 생성 완료.

위와 같이 기본으로 생성된 코드들로 빌드 및 실행 시키면 다음과 같이 Test Pass가 확인 된다.

3) Google Test의 구조

기본 구조

TEST(TestCaseName, TestName) {
  EXPECT_EQ(1, 1);
  EXPECT_TRUE(true);
}

Google Test unit을 작성할 때, TEST() 함수로 작성한다. 아래와 같이 TestCaseName에 해당하는 부분에는 하나의 Test Case를 함께 공유 하면서 TestName은 따로 설정하는 것이 좋다.

아래 코드는 GoogleTest User’s Guide | GoogleTest에 나와있는 예시이다. 

테스트 코드를 봤을 때 간단명료하면서 바로 이해할 수 있도록 짜야 좋은 테스트 코드라고 할 수 있다.

// Returns the factorial of n
int64_t Factorial(int n) {
    if (0 == n || 1 == n) {
        return 1;
    }
    return n * Factorial(n - 1);
}

// Tests factorial of 0.
TEST(FactorialTest, HandlesZeroInput) {
    EXPECT_EQ(Factorial(0), 1);
}

// Tests factorial of positive numbers.
TEST(FactorialTest, HandlesPositiveInput) {
    EXPECT_EQ(Factorial(1), 1);
    EXPECT_EQ(Factorial(2), 2);
    EXPECT_EQ(Factorial(3), 6);
    EXPECT_EQ(Factorial(8), 40320);
}

Test Fixture

여러 테스트 케이스에서 공통된 데이터나 동작이 필요한 경우에 활용하는 방법으로, ::testing::Test라는 클래스를 상송받고 SetUp()과 TearDown() 함수를 통해 매 테스트 케이스마다 공통으로 동일한 동작을 수행하도록 한다.

미리 준비된 데이터나 초기화가 필요한 경우 SetUp()을 통해 준비하고, 테스트가 끝나고 원상 복구 하거나 불필요한 데이터를 지우는 동작을 TearDown()에 수행 하도록 코드를 작성하여 활용한다.  사용 방법은 아래와 같다.

// 먼저 fixture 클래스를 정의하고, SetUp()에 테스트 실행 시 수행할 동작을 작성하였음. 이 테스트 코드에서는 TearDown()시 아무런 동작 하지 않음.
class QueueTest : public ::testing::Test {
 protected:
  void SetUp() override {
     // q0_ remains empty
     q1_.Enqueue(1);
     q2_.Enqueue(2);
     q2_.Enqueue(3);
  }

  // void TearDown() override {}

  Queue<int> q0_;
  Queue<int> q1_;
  Queue<int> q2_;
};

TEST_F(QueueTest, IsEmptyInitially) {
  EXPECT_EQ(q0_.size(), 0);
}

TEST_F(QueueTest, DequeueWorks) {
  int* n = q0_.Dequeue();
  EXPECT_EQ(n, nullptr);

  n = q1_.Dequeue();
  ASSERT_NE(n, nullptr);
  EXPECT_EQ(*n, 1);
  EXPECT_EQ(q1_.size(), 0);
  delete n;

  n = q2_.Dequeue();
  ASSERT_NE(n, nullptr);
  EXPECT_EQ(*n, 2);
  EXPECT_EQ(q2_.size(), 1);
  delete n;
}

4) 테스트 문법

Fatal assertion: 테스트 실패 시 남은 테스트 코드를 실행하지 않고 다음 테스트로 넘어감.

Nonfatal assertion: 테스트 실패 하더라도 다음 테스트 코드를 실행함.

Basic Assertions

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(expected, actual); EXPECT_EQ(expected, actual); expected == actual
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 Comparion

Fatal assertion Nonfatal assertion Verifies
ASSERT_STREQ(expected_str, actual_str); EXPECT_STREQ(expected_str, actual_str); the two C strings have the same content
ASSERT_STRNE(str1, str2); EXPECT_STRNE(str1, str2); the two C strings have different content
ASSERT_STRCASEEQ(expected_str, actual_str); EXPECT_STRCASEEQ(expected_str, actual_str); the two C strings have the same content, ignoring case
ASSERT_STRCASENE(str1, str2); EXPECT_STRCASENE(str1, str2); the two C strings have different content, ignoring case

출처: https://kksuny.tistory.com/59

 

5) 결론

Google Test가 어떤 것이고, 어떻게 구현해야 되는지 알아보았다. 이 프레임워크를 사용해서 실제 회사에서 어떻게 적용할 지 알아보고 적용시켜 보고자한다.