상세 컨텐츠

본문 제목

Google Test 란? 사용 방법

기술자료

by 잡기장 2023. 6. 26. 18:15

본문

Google Test는 Google이 개발한 C++ 테스팅 및 Mocking 프레임워크입니다. 이 프레임워크는 xUnit 아키텍처를 기반으로 하고 있습니다. 한 단위 테스팅 라이브러리로, 다양한 플랫폼에서 C 및 C++ 코드를 테스트하는데 사용됩니다. Google Test는 Andriod Open Source Project, Chromium projects, LLVM compiler, Protocol Buffers, OpenCV, Robot Operating System 등의 다양한 프로젝트에서도 구현되고 있습니다.

 

Google Test의 기능에는 다음이 포함됩니다.

1. 유닛 테스트 작성을 위한 매크로 : Google Test는 테스트 프로그램 작성을 위한 다양한 기능을 제공합니다. 매크로는 테스트 스위트 내 개별 테스트, 테스트 fixture 클래스를 사용하는 테스트, 값 매개변수화 테스트를 정의하는 데 사용됩니다.

2. 다양한 Assertion 매크로 : Google Test는 코드 동작을 검증하기 위해 사용되는 광범위한 Assertion 매크로를 제공합니다. 이러한 매크로를 사용하여 다양한 종류의 Assertion을 수행할 수 있습니다. 예를 들어 Boolean 조건 검사, 값 비교, 문자열 비교, 부동 소수점 숫자 비교, 예외 처리 등을 할 수 있습니다.

3. 테스트 예제 제공 : Google Test는 github에서 공유하는 googletest Repository를 통해 다양한 기능을 보여주는 예제를 제공하고 있습니다.

 

Google Test를 사용하면 코드 변경에 따른 회귀를 감지하고, 개발자에게 빠른 피드백을 제공하는 것이 가능합니다. 또한, Google Test는 CMake와 통합하여 사용할 수 있습니다. 

 

Google Test의 사용은 다음의 목적을 포함합니다.

1. 유닛 테스트 : Google Test를 이용하면 각 함수 또는 메서드가 제대로 작동하는지 확인할 수 있습니다. 이를 통해 개발 초기 단계에서 버그를 찾아낼 수 있으며, 이를 수정함으로써 전체 시스템의 안정성을 높일 수 있습니다.

2. 회귀 테스트 : Google Test를 이용하면 이미 수정된 버그가 재발하지 않는지 확인할 수 있습니다. 새로운 기능 추가나 수정사항이 기존 코드에 영향을 미치지 않는지 검증하는데 유용합니다.

3. 테스트 주도 개발 : Google Test를 이용하면 테스트 주도 개발(TDD)을 수행할 수 있습니다. 테스트 주도 개발은 먼저 테스트를 작성하고 이 테스트를 통과하는 코드를 작성하는 방식입니다. 이를 통해 코드의 품질을 높일 수 있습니다.

4. 문서화 : 테스트 코드는 어떤 기능이 어떻게 작동해야 하는지에 대한 명확한 문서 역할을 합니다. 즉, Google Test를 사용하면 소프트웨어의 기능에 대해 자세히 설명하는 동시에 이를 검증하는 방법을 제공합니다.

 

향후 Google Test를 CI/CD(Continuous Integration/Continuous Deployment)와 같은 자동화 도구의 통합으로 테스트 자동화를 구축할 수 있을 것으로 기대해볼 수 있을 것 같습니다.

 

 

AI를 통한 Google Test 사용예시

아래는  ChatGPT를 통해 Arduino Ethernet Server에 대한 Google Test 기반의 테스트 코드 작성을 요청했습니다. 결과적으로 Google Test는 아직 임베디드 시스템에 대한 Test 환경 구축에는 어려움이 많은 것으로 보입니다. 임베디드 하드웨어 특성에 따른 다양한 SDK를 포함할 수 있는 Mocking 작업이 선행되야 하는게 그 이유입니다.

 

먼저 Arduino EthernetServer 클래스에 대한 mock 객체를 생성하는 코드를 아래와 같이 작성합니다.

class MockEthernetServer : public EthernetServer {
public:
    MOCK_METHOD0(begin, void());
    MOCK_METHOD1(available, EthernetClient(uint8_t));
    // 다른 메서드들도 이와 같은 방식으로 추가 가능
};

그리고 Google Test를 이용해 실제 테스트 케이스를 작성합니다.

TEST(EthernetServerTest, HandlesClientRequest) {
    MockEthernetServer server(80);  // 포트 80에서 서버 생성
    MockEthernetClient client;

    // begin() 메서드가 한 번 호출될 것이라고 예상
    EXPECT_CALL(server, begin()).Times(1);
    
    // 클라이언트 요청 시 서버가 적절하게 응답할 것이라고 예상
    EXPECT_CALL(server, available(_)).WillOnce(Return(client));

    server.begin();  // 서버 시작
    EthernetClient newClient = server.available();  // 클라이언트 요청 시도

    EXPECT_EQ(newClient, client);  // 실제로 반환된 클라이언트가 예상한 클라이언트인지 검증
}

 

결과는 구현상에서 실제 사용자가 간편히 사용하고자 하는 Ethernet Server, Ethernet Client와 같은 필수 Arduino SDK에 대한 Mocking 작업이 선행되지 않았기 때문에 동작하지 않는 코드가 되었습니다. 다만, 어떠한 구조로 Google Test를 작성해야 하는지의 방법론에 대해서는 보다 자세히 확인할 수 있습니다.

 

 

Google Test 환경설정

Visual Studio 기반의 환경설정은 다음과 같습니다.

1. Visual Studio Installer 실행

2. Visual Studio 설치파일 > 수정

3. C++ 를 사용한 테스트톱 개발 선택

4. 설치 세부 정보에서 'Test Adapter for Google Test' 선택 및 설치

 

설치 완료 후 동작확인 방법은 아래와 같습니다.

1. 신규 프로젝트 생성

2. 프로젝트 생성 후 예제 Build

3. 결과 확인

 

 

Google Test 기본 작성 예시

Google Test의 기본은 클래스를 생성하는 것에 있습니다. 먼저 임베디드 시스템에서 가장 단순한 LED On/Off를 작성한다고 가정할때 아래와 같이 LED 클래스의 On/Off 상태를 정의할 수 있습니다.

class Led {
public:
	Led() : state(false) {}
    void turnOn() { state = true; }
    void turnOff() { state = false; }
    bool isOn() const { return state; }
private:
	bool state;
}

그 다음, Blink 함수를 작성함으로써 LED의 동작을 정의합니다.

void blink(Led& led, int times) {
	for (int i = 0; i < times; ++i) {
    	led.turnOn();
        delay(1000);  // delay 함수는 주석처리 
        led.turnOff();
        delay(1000);  // delay 함수는 주석처리
    }
}

마지막으로 메인 테스트를 작성합니다. 해당 테스트는 클래스 정의 및 동작 함수를 포함하고 마지막에 EXPECT_FALSE()를 통해 기대결과를 사용자 정의합니다.

TEST(BlinkTest, TurnsOnAndOff) {
	Led led;
    blink(led, 1);
    EXPECT_FALSE(led.isOn());	// blink 후에 LED 상태는 OFF
}

 

아래와 같이 해당 코드를 작성 후 Build 하면, 테스트 결과를 확인할 수 있습니다.

 

Google Test를 사용하려는 목적은 다양한 임베디드 시스템의 통합 환경 및 테스트 자동화를 위한 접근이었지만 현재 Mocking에 대한 환경설정의 어려움으로 추가적인 시스템 구현 및 적용은 조금 어려워 보입니다. 다만, TDD를 숙달할 수 있고 기능에 대한 정확한 기대 및 결과 도출을 정의하는 것에는 많은 도움이 될 것으로 보입니다.

관련글 더보기

댓글 영역