구글 테스트
데브루키 스터디
발표자 느루
구글에서 어떻게 테스트
하는가?
…는 아니고 구글에서 만든 테스트
프레임워크를 소개하고 사용 후
느낀 점을 공유하고자 합니다
오늘 발표 내용은…
- 구글에서 만든 C++
테스트 프레임워크
- 단위 테스트, 통합 테스트,
시나리오 테스트 가능
- 구글에서도 쓴다(중요)
(크롬, Protocol Buffer 등)
Google Test?
- 소스 코드의 특정 모듈이 의도된
대로 정확히 작동하는지 검증하는
절차
- 모든 함수와 메소드에 대한 테스트
케이스(Test case)를 작성한다
단위 테스트
- 단위 테스트에서 확장된 것
- 둘 이상의 모듈을 하나의
그룹으로 테스트 하는 것
통합 테스트
- 문제점 발견이 쉽다
- 변경이 쉽다
- 통합이 간단하다
단위 테스트를 해야하는 이유
출처 : 위키
- Cpp Unit
- Google Test
테스트 도구(C++)
- A rich set of assertions
- User-defined assertions
- Death tests
- Fatal and non-fatal failures
특징
- Value-parameterized tests
- Type-parameterized tests
- Various options for running
the tests
- XML test report generation
특징
- 하나의 테스트는 다른 테스트와
독립되어 있고 반복 가능하다
- 실제 사용하는 것처럼 테스트 케이스
그룹을 만들 수 있어서 코드 파악에
도움이 된다
Google Test를
사용하게 된 이유?
- 플랫폼 중립적이라서 재사용이
용이하다
- 하나의 테스트 케이스를 실패해도 전체
테스트를 계속 진행할 수 있기 때문에
한번의 실행으로 여러 실패를 파악할
수 있다
Google Test를
사용하게 된 이유?
- 사용자가 사용할 테스트를 일일이
지정해주지 않아도 알아서 찾아준다
- 반복적으로 쓰이는 자원을 테스트끼리
공유할 수 있도록 있기 때문에 비용을
줄일 수 있다
Google Test를
사용하게 된 이유?
출처 : 공식 홈페이지
- 손목이 안 좋아져서
테스트 할 때 마우스를
적게 사용하고 싶었음
- 회사에서
사용하게 되었다
Google Test를
사용하게 된 이유? 사실…
TEST(테스트 그룹 이름,
그룹 내 하위 테스트 이름) {
/// 테스트 수행 내용
}
이렇게 선언을 해두면 자동으로
프로그램 수행 시 실행될 테스트로
등록된다
사용법 – 테스트 케이스
- 테스트가 수행되는 순서는 랜덤이다
- 테스트를 사용하지 않을 경우에는
앞에 DISABLED_ 키워드를
붙인다
- 필터로 원하는 테스트만 수행 가능
–gtest_filter
사용법 – 테스트 케이스
- 결과가 참인지 아닌지 확인한다
- 결과는 성공, 심각하지 않은 실패,
심각한 실패 3가지가 있다
- 매크로처럼 사용
사용법 - Assertions
- ASSERT_* : 조건문이 참이 아닐
경우 실패를 출력하고 현재 테스
트를 종료
- EXPECT_* : 조건문이 참이 아닐
경우 실패를 출력하고 다음 테스
트를 계속 진행
사용법 - Assertions
- ASSERT_TRUE(condition);
ASSERT_EQ(val1,val2);
ASSERT_STREQ(str1,str2);
TEST(FactorialTest,
HandlesZeroInput) {
EXPECT_EQ(1, Factorial(0));
}
사용법 - Assertions
- 여러 테스트에서 공통으로
사용하는 객체설정을 정의
- ::testing::Test 를 상속받아서
사용한다
사용법 – Test Fixtures
SetUp()
- 테스트에 필요한 설정을 세팅한다
- 각각의 테스트 케이스가 시작되기
전에 호출된다
사용법 – Test Fixtures
TearDown()
- 테스트에 사용한 자원들을
해제할 때 사용한다
- 각각의 테스트 케이스가 끝날 때
호출된다
사용법 – Test Fixtures
Class MyFixture : public testing::Test
{
Public:
User m_pUser*;
MyFixture();
~MyFixture();
virtual void SetUp();
virtual void TearDown();
}
사용법 – Test Fixtures
void MyFixture ::SetUp()
{
InitailizeUser();
}
void MyFixture ::TearDown()
{
m_pUser->CleanUp();
}
사용법 – Test Fixtures
TEST_F(MyFixture, 사용 테스트) {
m_pUser->SetMoney(100);
EXPECT_EQ(100,
m_pUser->GetMoney());
m_pUser->ConsumeMoney(5);
EXPECT_EQ(95,
m_pUser->GetMoney());
}
TEST_F(MyFixture, 획득 테스트) {
m_pUser->GetMoney(50);
EXPECT_EQ(50,
m_pUser->GetMoney());
}
사용법 – Test Fixtures
- Visual Studio .NET 2003 이상
이어야 한다
- https://github.com/google/go
ogletest 에서 프로젝트를
다운받는다
프로젝트에 적용하는 법
- 프로젝트 폴더에 압축을 푼다
프로젝트에 적용하는 법
- googletestmsvcgtest.sln
파일을 열고 빌드한다
프로젝트에 적용하는 법
프로젝트에 적용하는 법
프로젝트에 적용하는 법
프로젝트에 적용하는 법
코드 작성
코드 작성
코드 작성
실행 결과
- 프로젝트 시작과 함께 사용한 게
아니라 중간에 사용하게 되었다
-> 현재 작업 중인 기능들만 조금씩
테스트 코드를 작성
구글 테스트를 쓰게
되었을 때의 상황
- 테스트 메소드 내에 PC와
통신하는 기능이 존재
-> dummy socket 클래스를
정의하여 사용
구글 테스트를 쓰게
되었을 때의 상황
FixtureClass::CreateUser()
{
m_pUser->Initialize(
new DummySocket());
}
DummSocket::Send(){ return; }
구글 테스트를 쓰게
되었을 때의 상황
m_pUser->ProcFinishGame(…);
EXPECT_EQ(m_pUser->GetLastError(),
ret::invalid_game_id);
m_pUser->ProcFinishGame(…);
EXPECT_EQ(m_pUser->GetLastError(),
ret::success);
구글 테스트를 쓰게
되었을 때의 상황
- DB와 통신하는 부분 존재
-> DB는 항상 결과가 맞다고
생각하고 DB로 부터 받은 결과를
갱신하는 부분이 제대로 되는지
검사
구글 테스트를 쓰게
되었을 때의 상황
DBResultPacket.m_nTotalMoney = 100;
DBResultPacket.m_nLevel = 2;
m_pUser
->DBProcFinishGame(DBResultPacket);
EXPECT_EQ(m_pUser->GetMoney(),
DBResultPacket.m_nTotalMoney);
EXPECT_EQ(m_pUser->GetLevel(),
DBResultPacket.m_nLevel);
구글 테스트를 쓰게
되었을 때의 상황
- 구현 전에 단위 테스트 시나리오
를 먼저 생각하고 구현한다면
발코딩?을 줄일 수 있을 것 같다
라고 생각하지만 현실은…
- 기능을 좀 더 분리해서 만들게
된다
해보고 느낀 점
- 코드를 변경하면 테스트 코드도
변경 해줘야 한다
- 테스트 코드를 다 통과해도
버그가 없는 건 아니더라…
- Private 코드는 어떻게 테스트
해야 좋을까?
해보고 느낀 점
- 손목에 부담이 덜 해졌다
- 시간이 충분하지 않으면 못 하겠다
- 습관을 들이기 위한 노력이
필요할 것 같다
아직 안됨…
해보고 느낀 점
https://ko.wikipedia.org/wiki/%EC
%9C%A0%EB%8B%9B_%ED%
85%8C%EC%8A%A4%ED%8A
%B8
https://github.com/google/googlet
est
http://www.slideshare.net/parkpd/
kgc2010
http://www.slideshare.net/zone00
00/c-7522148
참고 링크

구글테스트