이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

코딩/C and C++

C++ gtest

이쿠우우 2022. 1. 2. 16:01
반응형

 

C++ gtest

 

 

gtest란?

Google Test Framework로 유닛 테스트에 사용됨.
Google Test는 Google의 특정 요구사항 및 제약사항을 기반으로 테스트 기술팀에서 개발한 
Testing 프레임워크임.
 

gtest Git 링크 

 

컴파일러

C ++ 11 표준 이상을 준수하는 코드베이스 및 컴파일러가 필요함.
  • gcc 5.0 이상
  • clang 5.0 이상
  • MSVC 2015+
 

사용 가능 OS

Linux, Windows, Mac
 
 

왜 Google Test를 사용해야 하나?

1. 테스트는 독립적이고 반복가능해야 합니다. gtest는 디버깅을 빠르게 할 수 있도록 테스트를 분리시켜 실행할 수 있도록 해 줌.
2. 테스트는 조직화가 잘 되어있으며 테스트되는 코드의 구조를 반영할 수 있어야 함. 
    gtest는 데이터와 서브루틴을 공유할 수 있는 테스트 케이스안에 서로 연관된 테스트들을 그룹화 시킬 수 있음.
3. 테스트는 이식과 재사용이 가능해야 합니다. gtest는 많은 OS, 컴파일러 등을 지원.
4. 테스트가 실패했을 때 가능한 한 문제에 대한 많은 정보를 제공해 주어야 함.
5. 테스트 프레임웍은 테스터를 잡다한 일에서 벗어나게 해 주어, 테스트 내용에 집중할 수 있도록 해야 함. 
    gtest는 자동으로 테스트를 추적하며, 사용자는 테스트를 실행하기 위해 테스트를 일일히 열거하지 않아도 됨.
6. 테스트는 빨라야 함. gtest를 사용하면 테스트간 의존성없이 테스트 간에 공유되는 리소스를 재사용할 수 있고, 
    set-up/tear-down 함수도 한번만 작성하면 됨.
 

 

유닛 테스트란?(Unit Test)

유닛 테스트는 개발한 가장 작은 단위 코드를 테스트하고자  작성한 코드로,
주로 특정 메소드를 실행해서 그 결과가 기대값과 일치하는지 확인하는 형태.
하나의 유닛테스트(Unit Test)는 하나의 함수의 특정 루틴을 검사함.
 

 

 

 

Assertions

Assertions은 함수 호출과 유사한 매크로.
Assertions에 기반해서 함수를 테스트함.
Assertion이 실패할 때 googletest는 assertion 소스파일과 라인 번호를 실패 메시지와 함께 출력함.
gtest 는 두 가지의 Assertion 을 제공함. 
1. ASSERT_* : 테스트 실패 시 치명적인 실패(Fatal failures)를 발생시키고, 현재 함수를 종료함.
2. EXPECT_* : 테스트 실패 시 치명적이지 않은 실패(Nonfatal failures)를 발생시키고, 현재 함수를 종료시키지 않음.
 
일반적으로 EXPRECT_* 를 사용해 테스트가 실패하더라도 이를 보고한 후 다른 테스트들을 진행시키고, 
더 이상 진행되면 안되는 상황일 경우에만 ASSERT_* 를 사용함.
 
기본 true/false 상태를 테스트하는 경우 
양쪽 모두 assertion의 실패는 포함된 테스트의 실패를 의미함.
Fatal assertion
Nonfatal assertion
Verifies
ASSERT_TRUE(condition);
EXPECT_TRUE(condition);
condition is true
ASSERT_FALSE(condition);
EXPECT_FALSE(condition);
condition is false
 

두 개의 값을 비교해야하는 경우

인자들은 assertion의 비교 연산자와 비교할 수 있어야 하며 그렇지 않으면 컴파일러 오류가 발생함.
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
 

두개의 CString을 비교해야하는 경우

두 개의 CString을 비교함. 
두 개의 string 객체의 비교를 원한다면 EXPECT_EQ, EXPECT_NE 등을 사용해야함.
"CASE"라는 이름은 대소문자를 무시한다는 의미를 가짐.
NULL 포인터와 비어 있는 string은 다르게 생각됩니다.
*STREQ*와 *STRNE* 또한 와이드 C string(wchar_t)도 허용함. 
만약 와이드 문자열의 비교가 실패한다면 해당 값들은 UTF-8 narrow 문자열로 출력해야함.
Fatal assertion
Nonfatal assertion
Verifies
ASSERT_STREQ(str1,str2);
EXPECT_STREQ(str1,str2);
the two C strings have the same content
ASSERT_STRNE(str1,str2);
EXPECT_STRNE(str1,str2);
the two C strings have different contents
ASSERT_STRCASEEQ(str1,str2);
EXPECT_STRCASEEQ(str1,str2);
the two C strings have the same content,
ignoring case
ASSERT_STRCASENE(str1,str2);
EXPECT_STRCASENE(str1,str2);
the two C strings have different contents,
ignoring case

 

 
 

 
 
 

C++ gtest 실습

 

Test환경

 
OS : Windows10
IDE : Visual Studio 2017 Professional
 

검사 대상 test프로젝트 생성.

c++ 프로젝트 생성.
 

testTarget.cpp

#include "testTarget.h"
int testCode(int a, int b)
{
       return a + b;
}
 

testTarget.h

#pragma once
#ifndef __TESTTARGET_H_
#define __TESTTARGET_H_
int testCode(int a, int b);
#endif // !__TESTTARGET_H_
 

빌드

테스트 할 프로젝트가 exe로 빌드되면 함수의 정의를 찾지 못하므로 
라이브러리 파일로 빌드 후 test해야함.

 
 

gTest Project 생성

 
VS2017 부터 google test가 Visual Studio ide에 통합됨. 
 

Google Test 생성

 
Add > New Project 선택 후
Visual C++ > Test > Google Test 선택

 

test하고자 하는 project 선택

 

lib 또는 dll 선택

상위에서 test project를 lib로 빌드했음으로 lib선택

 

생성 결과.

 

gTest Assertions 작성

 

생성된 test.cpp에 test 대상 project의 header를 명시함.

 

2개의 Test 작성

PassTestCase1, PassTestCase2 
2개의 test 작성
Assertions은 EXPECT_EQ로 작성.
 
Pass하는 상황 예시 test 코드
#include "pch.h"
#include "../testTarget/testTarget.h"
TEST(PassTestCase1, testTargetProjectTest1) {
  EXPECT_EQ(2, testCode(1, 1));
  EXPECT_EQ(21, testCode(10, 11));
}

TEST(PassTestCase2, testTargetProjectTest2) {
       EXPECT_EQ(20, testCode(10, 10));
       EXPECT_EQ(41, testCode(30, 11));
       EXPECT_EQ(110, testCode(10, 100));
}
 

결과

gtest 프로젝트를 빌드하면
.exe 실행 파일이 생성됨.

해당 파일 실행해보면 아래과 같이 PASSED 결과를 확인할 수 있음.

 

fail하는 상황 예시 test 코드

예상되는 결과를 다르게 해서 failed 상황을 만들어보고 결과를 확인해봄.
#include "pch.h"
#include "../testTarget/testTarget.h"
TEST(PassTestCase1, testTargetProjectTest1) {
  EXPECT_EQ(2, testCode(1, 1));
  EXPECT_EQ(21, testCode(10, 11));
}
TEST(PassTestCase2, testTargetProjectTest2) {
       EXPECT_EQ(20, testCode(10, 10));
       EXPECT_EQ(41, testCode(30, 11));
       EXPECT_EQ(111, testCode(10, 100));
}

결과

test case 중에 어떤 항목이 실패했는지 보여주고
gtest 코드 몇번째 줄에서 실패 했는지 확인시켜줌.

 

 

 

반응형

'코딩 > C and C++' 카테고리의 다른 글

"\n" 과 "endl" 의 차이점  (0) 2022.10.03
malloc calloc realloc의 차이점  (0) 2022.10.03
C/C++ base64 encoding/decoding  (0) 2021.12.22
C++ WMI library사용  (0) 2021.12.22
C++ windows 로컬 그룹 정책 확인  (1) 2021.12.22