문제

저는 현재 몇 년 동안 개발 중인 대규모 C++ 시스템을 작업하고 있습니다.기존 코드의 품질을 개선하기 위한 노력의 일환으로 우리는 대규모 장기 리팩토링 프로젝트에 참여했습니다.

C++로 단위 테스트를 작성하는 데 도움이 되는 좋은 도구를 알고 있나요?어쩌면 Junit이나 Nunit과 비슷한 것이 있을까요?

단위 테스트를 염두에 두지 않고 작성된 모듈에 대한 단위 테스트 작성 방법에 대해 좋은 조언을 줄 수 있는 사람이 있습니까?

도움이 되었습니까?

해결책

레거시 코드에 단위 테스트를 적용하는 것이 매우 이유 레거시 코드를 효과적으로 사용하기 작성되었습니다.Michael Feathers는 저자입니다. 다른 답변에서 언급했듯이 그는 두 가지 답변의 작성에 참여했습니다. Cpp단위 그리고 CppUnitLite.

alt text

다른 팁

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

Google 코드 프로젝트

우수한 것을 확인하십시오 비교 사용 가능한 여러 제품군 사이.그 기사의 저자는 나중에 발전했습니다. 유닛테스트++.

내가 특히 좋아하는 점(예외 등을 처리한다는 사실은 제외)음)은 테스트 케이스와 테스트 픽스처 정의에 대한 '관리'의 양이 매우 제한되어 있다는 것입니다.

부스트에는 테스트 라이브러리 단위 테스트에 대한 지원이 포함되어 있습니다.확인해 볼 가치가 있을 수도 있습니다.

노엘 로피스 내부로부터의 게임 의 저자입니다 C++ 단위 테스트 프레임워크 정글 탐색, 다양한 C++ 단위 테스트 프레임워크에 대한 포괄적인(현재는 날짜가 지난) 평가이자 게임 프로그래밍에 관한 책입니다.

꽤 오랫동안 CppUnitLite를 사용해 여러가지를 고치다가 결국 다른 유닛 테스트 라이브러리 작성자와 힘을 합쳐 프로듀싱을 하게 되었습니다. 유닛테스트++.여기서는 UnitTest++를 사용하는데 지금까지는 매우 마음에 들었습니다.그것은 (나에게) 작은 설치 공간과 정확한 전력 균형을 가지고 있습니다.

저는 자체 개발 솔루션인 CxxTest(Perl 필요)와 Boost::test를 사용했습니다.제가 현재 직장에서 단위 테스트를 구현했을 때 그것은 거의 UnitTest++와 Boost::test로 귀결되었습니다.

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

UnitTest++는 내 (제한된) 경험에서 만난 것 중 설정하고 사용하기 가장 간단한 테스트 프레임워크였습니다.

우수한 제품을 사용하고 있습니다 부스트.테스트 훨씬 덜 알려졌지만 정말 멋진 도서관과 함께 거북이 도서관 :부스트를 기반으로 한 모의 객체 라이브러리.

코드 예제는 말보다 더 잘 말하므로 다음을 테스트하고 싶다고 상상해 보십시오. 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 );
}

모의 객체에 대한 기대값을 선언하는 것이 얼마나 쉽고 장황한지 확인해보세요.당연히 기대치가 충족되지 않으면 테스트가 실패합니다.

방금 내 자신의 프레임워크를 푸시했습니다. 잡다, 저 밖에.아직 개발 중이지만 이미 대부분의 다른 프레임워크를 능가한다고 생각합니다.사람마다 기준이 다르지만 저는 너무 많은 절충안 없이 대부분의 내용을 다루려고 노력했습니다.맛보기를 위해 링크된 블로그 항목을 살펴보세요.내 상위 5가지 기능은 다음과 같습니다.

  • 헤더만
  • 기능 및 방법 기반 테스트 자동 등록
  • 표준 C++ 표현식을 LHS 및 RHS로 분해합니다(따라서 전체 어설션 매크로 계열이 필요하지 않음).
  • 기능 기반 픽스처 내 중첩 섹션 지원
  • 자연어를 이용한 이름 테스트 - 함수/메서드 이름 생성

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

Cxx테스트 가볍고 사용하기 쉬운 크로스 플랫폼 JUnit/CppUnit/xUnit과 유사한 C++용 프레임워크입니다.

CppUnit이 그 방법입니다.아래 링크를 참조하세요:

http://cppunit.sourceforge.net/cppunit-wiki

http://en.wikipedia.org/wiki/CppUnit

유닛테스트++, 작고 단순합니다.

저는 현재 우리 회사에서 오랫동안 사용할 수 있는 코드 기반을 위해 사용할 수 있는 단위 테스트 및 모의 프레임워크를 찾고 있습니다.당신도 알고 있듯이 단위 테스트 프레임워크 목록 C++의 경우 길이가 길기 때문에 좀 더 자세히 볼 수 있도록 몇 가지 필터를 적용하여 한 움큼으로 줄였습니다.첫 번째 필터 기준은 무료여야 한다는 것이었습니다.두 번째 기준은 프로젝트 활동이었습니다.또한 단위 테스트를 작성하려면 모의 프레임워크가 필요하기 때문에 모의 프레임워크도 찾았습니다.

나는 대략적으로 활동별로 정렬된 다음 목록을 생각해 냈습니다. 가장 높은 활동이 맨 위에 표시됩니다.

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

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

  • CppU테스트: 테스트 및 조롱을 제공합니다.이 프로젝트는 2008년부터 2015년까지 진행되었으며 최근 활동이 꽤 많습니다.웹에서 검색할 때 활동이 훨씬 적은 많은 프로젝트가 더 자주 나타나기 때문에 이 발견은 약간 놀랐습니다(예: 2013년에 마지막 업데이트된 CppUnit).이 부분은 제가 자세히 살펴보지 않아서 자세한 내용은 말씀드릴 수 없습니다.편집(2015년 12월 16일): 나는 최근에 이것을 시도했고 이 프레임워크가 특히 모의 클래스를 사용할 때 약간 서투르고 "C 스타일"이라는 것을 알았습니다.또한 다른 프레임워크보다 주장의 다양성이 더 적은 것 같습니다.내 생각에 이 프로그램의 가장 큰 장점은 순수 C 프로젝트와 함께 사용할 수 있다는 점이다.

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

  • 잡다: 최근 활동이 있지만 주로 한 사람이 개발했습니다.이 프레임워크의 좋은 점은 테스트 자체에서 재사용 가능한 픽스처 코드를 작성할 수 있는 대체 픽스처 접근 방식입니다.또한 테스트 이름을 문자열로 설정할 수 있는데 이는 전체 문장을 테스트 이름으로 작성하는 경향이 있을 때 유용합니다.나는 이 스타일이 찢어져서 googleTest에 추가되기를 바랍니다 ;-)

모의 프레임워크

모의 프레임워크의 수는 테스트 프레임워크의 수보다 훨씬 적지만 최근 활동이 있는 것으로 확인된 프레임워크는 다음과 같습니다.

  • 히포목:2008년부터 지금까지 활동 중이지만 강도는 낮습니다.

  • 가짜:2013년부터 활성화되었지만 현재는 한 사람이 어느 정도 개발했습니다.

결론

코드 기반이 장기적으로 사용되는 경우 다음 중에서 선택하세요. BoostTest + 거북이 그리고 GoogleTest + GoogleMock.내 생각에 그 둘은 장기적으로 유지 관리가 필요할 것 같아요.수명이 짧은 코드 베이스만 있다면 시도해 볼 수 있습니다. 잡다 좋은 구문이 있습니다.그런 다음 추가로 모의 프레임워크를 선택해야 합니다.Visual Studio를 사용하는 경우 BoostTest 및 GoogleTest용 테스트 실행기 어댑터를 다운로드하면 VS에 통합된 테스트 실행기 GUI로 테스트를 실행할 수 있습니다.

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

또한 있다 쯧쯧, 템플릿 기반 프레임워크인 템플릿-단위-테스트.구문이 어색하지만(일부는 템플릿 남용이라고도 함) 주요 장점은 모든 것이 단일 헤더 파일.

당신은 찾을 수 있습니다 TUT로 작성된 단위 테스트의 예 여기.

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

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

CppUTest C 및 C++ 단위 테스트를 위한 훌륭하고 가벼운 프레임워크입니다.

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

그는 이제 추천한다 CppUnitLite

보세요 CUnitWin32.MS Visual C용으로 작성되었습니다.여기에는 예제가 포함되어 있습니다.

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

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

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

과당을 확인하세요: http://sourceforge.net/projects/fructose/

헤더 파일만 포함하고 있어 이식하기 쉬운 매우 간단한 프레임워크입니다.

나는 MS 테스트를 사용하고 있습니다 Typemock Isolator++.시도 해봐!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top