C ++ 코드의 단위 테스트-도구 및 방법론 [닫기]


134

나는 몇 년 동안 개발되어 왔던 대형 C ++ 시스템에서 일하고 있습니다. 기존 코드의 품질을 향상시키기위한 노력의 일환으로 대규모 장기 리팩토링 프로젝트에 참여했습니다.

C ++로 단위 테스트를 작성하는 데 도움이되는 유용한 도구를 알고 있습니까? Junit 또는 Nunit과 비슷한 것입니까?

누구나 단위 테스트를 염두에두고 작성된 모듈에 대한 단위 테스트 작성 방법에 대한 좋은 조언을 줄 수 있습니까?


1
이 질문에 체크 아웃 : stackoverflow.com/questions/3150/...
땅 돼지

답변:


83

레거시 코드를 사용한 효과적인 작업 이 작성된 이유 는 레거시 코드에 단위 테스트를 적용하는 것이 었습니다 . Michael Feathers는 다른 답변에서 언급했듯이 CppUnitCppUnitLite를 만드는 데 관여했습니다 .

대체 텍스트


4
썸네일 추가-투표함. 이 책은 어떤 도구보다 도움이됩니다.
Gishu

2
CPPUnit이 테스트 작성을 더 간단하게 만들 수 있다고 생각합니다. CPPUnit을 사용하고 있지만 만족스럽지 않습니다. 각 테스트마다 두 개의 파일을 업데이트해야한다고 생각합니다. 테스트는 다음과 같이 작성하는 것이 간단해야합니다. 'TEST ( "testname") {ASSERT (1 == 1);}'반면에이 책은 레거시 코드로 작업하는 사람뿐만 아니라 코드를 작성하는 사람에게도 반드시 필요합니다.)
daramarak

9
언제부터 C ++ 레거시입니까?!
Nils

9
IT가 C ++이 레거시가 아니라고 생각합니다. 올바르게 기억한다면, 그 책은 레거시 프로젝트가 없거나 거의없는 단위 테스트 프로젝트로 정의합니다. 테스트 주도 개발은 코드 기반에 영향을 미쳐서 작성하기가 쉽지 않기 때문에 이러한 프로젝트는 / hard / 단위 테스트를 작성하는 경향이 있습니다.
Arafangion

7
@Nils :이 책의 아마존 리뷰어 중 한 사람이 언급 한 것처럼, "레거시 코드는 단위 테스트가없는 코드입니다."라는 질문이 있습니다.
David Johnstone

40

구글은 최근 구글 테스트 (Google Test) 라 불리는 C ++ 앱 단위 테스트를위한 자체 라이브러리를 출시했다.

Google 코드 프로젝트


1
VC ++와 함께 사용할 수
있습니까

특히 각 어설 션에 설명을 추가 해야하는 방식은 꽤 괜찮습니다. 단점으로, 나는 개인적으로 클래스처럼 보이지 않는 매크로 대신 단위 테스트 클래스를 선호합니다.
Wernight

3
또 다른 좋은 점은 조롱 가능성입니다. code.google.com/p/googlemock
Philipp

CPPUNIT
보다이 기능

30

사용 가능한 여러 제품군 간의 훌륭한 비교를 확인하십시오 . 이 기사의 저자는 나중에 UnitTest ++를 개발했습니다 .

내가 특히 좋아하는 것은 (예외를 잘 처리한다는 사실과는 별도로) 테스트 케이스 및 테스트 픽스처 정의 주위에 매우 적은 양의 '관리'가 있다는 것입니다.


2
우리의 근본적인 오류가 아닌가? 그는 사용 가능한 프로젝트에 대한 통찰력을 얻었지만 개선하는 대신 자신의 프로젝트를 시작합니다.
peterchen

@ peterchen : 예; 그러나 UnitTest ++는 너무 작고 가벼워 별도의 프로젝트가 가치가 있습니다. 시작하고 실행하는 것이 매우 쉽습니다.
TimStaley

24

Boost에는 단위 테스트를 지원 하는 테스트 라이브러리 가 있습니다. 체크 아웃 할 가치가 있습니다.


4
이 훌륭한 툴킷을 추천 할 수 있습니다.
Rob

1
예, 부스트는 갈 길입니다. 오버 헤드가 없으며 테스트하고 이동하십시오! 나는 부스트가 구조에 나왔을 때 필사적으로 내 자신의 프레임 워크에서 일하고있었습니다. 감사합니다 (모든 것을 위해!)
daramarak

내가 쓴 기사 부스트 유닛 테스팅 beroux.com/english/articles/boost_unit_testing
Wernight

21

Noel Llopis of Games From Inside는 다양한 C ++ 단위 테스팅 프레임 워크와 게임 프로그래밍에 대한 책을 종합적으로 평가 한 C ++ 단위 테스팅 프레임 워크 정글 탐험 의 저자입니다 .

그는 CppUnitLite를 꽤 오랫동안 사용하여 다양한 것을 수정했지만 결국 다른 단위 테스트 라이브러리 작성자와 힘을 합쳐 UnitTest ++을 만들었습니다 . 우리는 여기서 UnitTest ++를 사용하며, 지금까지는 그것을 많이 좋아합니다. 발자국이 작은 힘의 정확한 균형이 있습니다.

나는 자체 개발 솔루션 인 CxxTest (Perl이 필요함)와 boost :: test를 사용했다. 현재 작업에서 단위 테스트를 구현했을 때 UnitTest ++ vs boost :: test가 나왔습니다.

나는 내가 사용했던 대부분의 부스트 라이브러리를 정말 좋아하지만 IMHO, boost :: test는 너무 무겁다. 특히 boost :: test 매크로를 사용하여 테스트 하니스의 주요 프로그램을 구현해야한다는 점이 마음에 들지 않았습니다. 나는 그것이 "순수한"TDD가 아니라는 것을 알고 있지만, 때로는 명령 줄에 특수 테스트 플래그가 전달되고 boost :: test가이 유형을 지원할 수없는 경우와 같이 GUI 응용 프로그램으로 테스트를 실행하는 방법이 필요합니다. 시나리오.

UnitTest ++는 (제한된) 경험에서 경험 한 가장 간단한 테스트 프레임 워크입니다.


17

나는 잘 알려지지 않았지만 아주 멋진 Turtle 라이브러리 와 함께 Boost.Test 라이브러리를 사용하고 있습니다.

코드 예제가 단어보다 잘 말하면 인터페이스에서 calculator작동 하는 객체 view(Turtle의 소개 예제) 를 테스트 한다고 가정 해보십시오.

// declares a 'mock_view' class implementing 'view'
MOCK_BASE_CLASS( mock_view, view )
{
    // implements the 'display' method from 'view' (taking 1 argument)
    MOCK_METHOD( display, 1 )                   
};

BOOST_AUTO_TEST_CASE( zero_plus_zero_is_zero )
{
    mock_view v;
    calculator c( v );

    // expects the 'display' method to be called once with a parameter value equal to 0
    MOCK_EXPECT( v, display ).once().with( 0 ); 

    c.add( 0, 0 );
}

모의 객체에 대한 기대를 얼마나 쉽고 상세하게 선언합니까? 기대치가 충족되지 않으면 테스트는 실패합니다.


14

방금 내 프레임 워크 인 CATCH를 푸시 했습니다. 아직 개발 중이지만 이미 대부분의 다른 프레임 워크를 능가한다고 생각합니다. 사람들마다 기준이 다르지만 너무 많은 절충없이 대부분의 근거를 다루려고 노력했습니다. 맛보기에 대한 링크 된 블로그 항목을 살펴보십시오. 내 상위 5 가지 기능은 다음과 같습니다.

  • 헤더 만
  • 기능 및 방법 기반 시험의 자동 등록
  • 표준 C ++ 표현식을 LHS 및 RHS로 분해하므로 전체 어설 션 매크로가 필요하지 않습니다.
  • 함수 기반 조명기 내에서 중첩 섹션 지원
  • 자연 언어를 사용한 이름 테스트-함수 / 메소드 이름이 생성됩니다.

Objective-C 바인딩도 있습니다.


4
doctest가가 를 체크 아웃 - 컴파일 속도에 큰 초점을 잡아 내 다시 구현입니다 자주 묻는 질문 들은 다른 방식을 볼 수
onqtam




6

현재 우리 회사에서 오랫동안 사용되는 코드 기반으로 사용할 수있는 단위 테스트 및 모의 프레임 워크를 찾고 있습니다. 아시다시피 c ++ 의 단위 테스트 프레임 워크 목록 이 길기 때문에 일부 필터를 적용하여 좀 더 자세히 볼 수있는 필터를 적용했습니다. 첫 번째 필터 기준은 무료 여야한다는 것입니다. 두 번째 기준은 프로젝트 활동이었습니다. 단위 테스트를 작성하려면 프레임 워크가 필요하기 때문에 모의 프레임 워크를 찾았습니다.

나는 활동에 따라 정렬 된 다음과 같은 대략적인 목록을 제시했습니다.

  • GoogleTest / GoogleMock : 많은 기여자가 있으며 Google 자체에서 사용합니다. 아마도 여기에있을 것이며 업데이트를받을 것입니다. 내 개인 코드베이스의 경우 가장 빠른 열차를 타기 위해이 조합으로 전환합니다.

  • BoostTest + Turtle : 자주 업데이트되지는 않지만 테스트 프레임 워크는 부스트의 일부이므로 유지 관리해야합니다. 반면에 거북은 주로 한 사람에 의해 유지되지만 활동이 분개하여 죽지 않았습니다. 이전 작업에서 부스트 라이브러리를 이미 사용했으며 현재 개인 코드로 사용하기 때문에이 조합에 대한 거의 모든 테스트 경험을 만들었습니다.

  • CppUTest : 테스트 및 조롱을 제공합니다. 이 프로젝트는 2008 년부터 2015 년까지 진행되었으며 최근 활동이 많이 있습니다. 웹에서 검색 할 때 (2013 년 마지막 업데이트를 한 CppUnit과 같이) 활동이 현저히 적은 많은 프로젝트가 더 자주 나오기 때문에 이러한 결과는 다소 놀랍습니다. 나는 이것에 대해 깊이 들여다 보지 않았으므로 세부 사항에 대해 아무 것도 말할 수 없습니다. 편집 (16.12.2015) : 최근에 이것을 시도하고 특히 모의 클래스를 사용할 때이 프레임 워크가 약간 어색하고 "C 스타일"인 것으로 나타났습니다. 또한 다른 프레임 워크보다 다양한 어설 션이있는 것 같습니다. 순수한 C 프로젝트에서 사용할 수 있다는 것이 주된 강점이라고 생각합니다.

  • QTest : Qt 프레임 워크와 함께 제공되는 테스트 라이브러리. 유지 관리는 한동안 보장되어야하지만 테스트 등록은 다른 프레임 워크에서보다 서투른 IMO이기 때문에 지원 라이브러리로 사용합니다. 내가 이해하는 한, 테스트 픽스처마다 하나의 테스트 실행이 필요합니다. 그러나 Qt-Gui 코드를 테스트 할 때 테스트 도우미 기능을 유용하게 사용할 수 있습니다. 모의가 없습니다.

  • Catch : 최근 활동이 있지만 주로 한 사람이 개발했습니다. 이 프레임 워크의 좋은 점은 테스트 자체에서 재사용 가능한 조명기 코드를 작성할 수있는 대체 조명기 접근법입니다. 또한 테스트 이름을 문자열로 설정하여 전체 문장을 테스트 이름으로 쓰는 경향이 있습니다. 나는이 스타일을 찢어 googleTest에 넣을 것이라고 ;-)

모의 프레임 워크

모의 프레임 워크의 수는 테스트 프레임 워크의 수보다 훨씬 적지 만 최근 활동이있는 것으로 밝혀졌습니다.

  • Hippomock : 2008 년부터 활성화되었지만 강도는 낮습니다.

  • FakeIt : 2013 년부터 활동했지만 한 사람에 의해 다소 개발되었습니다.

결론

코드베이스가 장기적으로 사용되는 경우 BoostTest + TurtleGoogleTest + GoogleMock 중에서 선택하십시오 . 나는 그 두 가지가 장기적인 유지 보수를해야한다고 생각합니다. 수명이 짧은 코드베이스 만 있으면 멋진 구문을 가진 Catch 를 사용해보십시오 . 그런 다음 조롱 프레임 워크를 추가로 선택해야합니다. Visual Studio를 사용하는 경우 BoostTest 및 GoogleTest 용 테스트 실행기 어댑터를 다운로드하여 VS에 통합 된 테스트 실행기 GUI로 테스트를 실행할 수 있습니다.


3

밀접하게 관련된 질문 "C ++ 단위 테스트 도구 / 프레임 워크 선택"에 대한 답변도 참조 하십시오.


3

또한이 , 템플릿 단위 테스트, 템플릿 기반의 프레임 워크. 문법은 어색하지만 (일부는 템플릿 남용이라고 함) 주요 장점은 모두 단일 헤더 파일에 포함되어 있다는 것입니다 .

여기 에 TUT으로 작성된 단위 테스트예가 나와 있습니다.


2
매크로를 제공하는 TUT의 보장 기능과 테스트 Decleration 코드를 단순화하고 실패시 파일 및 줄 번호 정보를 제공하는 헤더 전용 라이브러리를 작성했습니다. 여기에 GitHub의 프로젝트에 출력 차분과 코드의 예와 포스트 링크뿐만 아니라 링크이다 codecrafter.wordpress.com/2012/12/19/tutadapter1
조쉬 Heitzman

2

CPPunit을 사용해 보았지만 사용자 친화적이지 않습니다.

내가 아는 유일한 대안은 C ++. NET을 사용하여 C ++ 클래스를 래핑하고 .NET 단위 테스트 프레임 워크 (NUnit, MBUnit 등) 중 하나로 단위 테스트를 작성하는 것입니다.


2

CppUTest 는 C 및 C ++ 단위 테스트를위한 우수한 경량 프레임 워크입니다.


1

ObjectMentor의 Michael Feathers는 CppUnit과 CppUnitLite의 개발에 중요한 역할을했습니다.

그는 이제 CppUnitLite를 추천합니다



1

cfix ( http://www.cfix-testing.org )를 살펴보십시오. Windows C / C ++ 개발에 특화되어 있으며 사용자 모드와 커널 모드 단위 테스트를 모두 지원합니다.


공유해 주셔서 감사합니다. 최근에 테스트 목적으로 cfix를 사용하기 시작했습니다. 테스트 케이스를 통과하거나 실패한 경우 호출 스택을 보는 방법을 찾고있었습니다. 이것을 달성하기 위해 cfix에 방법이 있습니까?
tryingToLearn

1

Visual Studio 2008 SP1을 사용하는 경우 단위 테스트 작성에 MSTest를 사용하는 것이 좋습니다. 그런 다음 Google 모형을 사용하여 모형을 작성합니다. IDE와의 통합은 이상적이며 한 번의 테스트 추가를 위해 세 곳을 편집하는 측면에서 CPPunit의 오버 헤드를 허용하고 전달하지 않습니다.


1

VisualAssert 가 VS 통합에서 훌륭한 일을하고 있다고 생각 합니다. VS에서 테스트를 실행하고 디버깅 할 수 있으며 테스트를 실행하기 위해 실행 파일을 만들 필요가 없습니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.