C ++ 단위 테스트 프레임 워크 비교 [닫기]


300

C ++ 단위 테스트 프레임 워크에 대한 권장 사항과 관련하여 이미 몇 가지 질문이 있지만 프레임 워크 중 하나를 권장하기 때문에 모든 답변이 도움이되지는 않지만 (기능) 비교에 대한 정보는 제공하지 않습니다.

가장 흥미로운 프레임 워크는 CppUnit, Boost 및 새로운 Google 테스트 프레임 워크라고 생각합니다. 아무도 아직 비교를하지 않았습니까?



나는 다른 모든 사람들이하는 일의 복제 일뿐 만 아니라 다른 사람들의 모든 문제를 발견 한 것을 해결하기 때문에 더 좋아하는 IOC 기반 테스트 프레임 워크를 가지고 있습니다. 매크로를 사용하지 않고 클래스에서 파생하여 테스트 사례를 작성합니다. 매크로는 어설 션에 대해서만 반영되므로 사용됩니다. 테스트 통계의 맞춤형 출력. IOC 스크립팅에서 실행하여 테스트 대상, 빈도 및 매개 변수를 선택하십시오.
CashCow

개발 관점에서 볼 때 나 자신의 테스트를 추가 할 때 다른 사람을 동시에 실행할 필요없이 테스트를 실행할 수 있기 때문에 훌륭합니다. 그래서 내 코드가 작동한다는 것을 알고 있습니다.
CashCow

답변:


99

이에 대한 토론 은이 질문참조하십시오 .

그들은 Noel Llopis 의 C ++ 단위 테스팅 프레임 워크 정글 탐험 기사를 추천한다 . 그리고 더 최근 : C ++ Test Unit Frameworks

googletest를 다른 프레임 워크와 비교하는 기사를 찾지 못했습니다.


내가 쓴 것처럼 : 모든 대답은 프레임 워크 중 하나를 권장하지만 프레임 워크를 다른 프레임 워크와 비교하지는 않습니다.
housemaister

당신은 기사에 만족하지 않습니까?
Gishu

7
한 가지 비판 :이 기사는 2004 년부터 작성되었으며 Google 테스트를 포함하지 않습니다.
richq

2
첫 번째 링크에는 두 가지 비교가 있습니다. Google의 새로운 프레임 워크를 제외하고 대부분의 정보는 여전히 관련이 있습니까? (그리고 CppUnit은 가장 흥미롭지 않고 사용하기에는 너무 어색합니다)
Luc Hermitte

1
링크까지 고정하고 최근의 비교에 대답 확대
샘 사프란

120

새로운 플레이어는 Google Test ( Google C ++ Testing Framework 라고도 함 )인데 꽤 좋습니다.

#include <gtest/gtest.h>

TEST(MyTestSuitName, MyTestCaseName) {
    int actual = 1;
    EXPECT_GT(actual, 0);
    EXPECT_EQ(1, actual) << "Should be equal to one";
}

주요 특징:

  • 가지고 다닐 수 있는
  • 치명적 및 비 치명적 주장
  • 쉬운 어설 션 정보 메시지 :ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Google 테스트 는 테스트를 자동으로 감지하므로 테스트를 실행하기 위해 열거하지 않아도됩니다.
  • 어설 션 어휘를 쉽게 확장 있습니다
  • 사망 테스트 (고급 가이드 참조)
  • SCOPED_TRACE 서브 루틴 루프 용
  • 실행할 테스트를 결정할 수 있습니다
  • XML 테스트 보고서 생성
  • 비품 / 모의 / 템플릿 ...

3
저는 다른 프레임 워크에 비해 Google 테스트를 사용하는 것을 특히 즐깁니다. 특히 Googlemock 프레임 워크에서 찾을 수있는 조롱 기능이 있습니다.
Mike

8
이 모든 기능 (아직 공개되지는 않았지만)과 새로운 테스트 프레임 워크 인 CATCH에서 더 많은 기능을 제공합니다. 링크에 대한 내 답변을 참조하십시오.
philsquared December

2
이를 Google C ++ Mocking 프레임 워크와 결합하면 단위 테스트 C ++ 코드를위한 강력한 xUnit 테스트 프레임 워크가됩니다.
ratkok

5
@CashCow 빌드로 실행하는 것은 테스트 감지와 다릅니다. 빌드 실행은 빌드 시스템에 따라 다릅니다. 테스트 감지 수단은 당신이하지 않는 단지 시험 방법을 작성, 다른 클래스에있는 모든 테스트를 나열하고 바로 그거야.
Wernight

나는 매크로를 과도하게 사용하는 것을 좋아하지 않으며 테스트와 같은 일반적인 단어를 사용하여 무언가와 충돌 할 수 있다는 사실을 좋아하지 않습니다. GTEST가 더 좋을 것입니다.
CashCow

112

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

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

Objective-C 바인딩도 있습니다. 이 프로젝트는 Github에서 호스팅됩니다


추가 CHECK_FLASEREQUIRE_FLASE매크로를 고려하십시오 .
Emile Cormier

6
내 의견으로는 최고의 프레임 워크.
CoffeDeveloper 11

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

@einpoklum Catch는 포기되지 않습니다. 제작자는 라이브러리 버전 2에서 작업하고 있습니다. doctest가 몇 가지 보너스 디자인 결정에 캐치 1의 재 구현 정렬입니다
onqtam

2
모든 테스트 프레임 워크 (현재 선택해야하는 프레임 워크)를 비교할 때 실제로 손실을 겪고 있습니다. 캐치 및 기타 오퍼링과 doctest를 비교하고 대조하는 자신의 답변을 작성 하시겠습니까?
einpoklum

53

Boost Test Library 는 특히 이미 Boost를 사용하고 있다면 매우 좋은 선택입니다.

// TODO: Include your class to test here.
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(MyTestCase)
{
    // To simplify this example test, let's suppose we'll test 'float'.
    // Some test are stupid, but all should pass.
    float x = 9.5f;

    BOOST_CHECK(x != 0.0f);
    BOOST_CHECK_EQUAL((int)x, 9);
    BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001%
}

다음을 지원합니다.

  • 자동 또는 수동 테스트 등록
  • 많은 주장
  • 컬렉션 자동 비교
  • 다양한 출력 형식 ( XML 포함 )
  • 비품 / 템플릿 ...

추신 : 시작에 도움이 될만한 기사를 썼습니다 : C ++ Unit Testing Framework : A Boost Test Tutorial


나는 Boost 테스트를 사용했으며 릴리스간에 크게 변경되는 것을 제외하고는 좋아했습니다. 테스트 할 코드를 수정하는 것보다 API가 변경 될 때 테스트를 수정하는 데 더 많은 시간과 돈을 소비하지 않고도 클라이언트에게 단위 테스트를 판매하는 것이 어려웠습니다. 결국 나는 그것을 버리고 내 자신을 썼다-이것은 약 5 년 전이었다.
구성 요소 10

5
튜토리얼 링크가 깨졌습니다
mloskot

2
@mloskot 다시 작동합니다.
Chris Jester-Young 1

@mloskot 죄송합니다. 이메일이 깨져 보이면 저에게 직접 이메일을 보내 주시기 바랍니다. 코멘트보다 찾기 쉽다. :)
Wernight

@Wernight Yup은 다시 작동합니다. Thx
mloskot


16

최근 에 Google Test 및 Boost Test Library에 대한 대안으로 xUnit ++를 출시했습니다 ( 비교 보기 ). xUnit.Net에 익숙하다면 xUnit ++을 사용할 준비가 된 것입니다.

#include "xUnit++/xUnit++.h"

FACT("Foo and Blah should always return the same value")
{
    Check.Equal("0", Foo()) << "Calling Foo() with no parameters should always return \"0\".";
    Assert.Equal(Foo(), Blah());
}

THEORY("Foo should return the same value it was given, converted to string", (int input, std::string expected),
    std::make_tuple(0, "0"),
    std::make_tuple(1, "1"),
    std::make_tuple(2, "2"))
{
    Assert.Equal(expected, Foo(input));
}

주요 특징:

  • 놀라 울 정도로 빠름 : 테스트가 동시에 실행 됩니다 .
  • 가지고 다닐 수 있는
  • 자동 시험 등록
  • 많은 어설 션 유형 (부스트는 xUnit ++에 아무것도 없음)
  • 컬렉션을 기본적으로 비교합니다 .
  • 주장은 세 가지 수준으로 나뉩니다 .
    • 치명적인 오류
    • 치명적이지 않은 오류
    • 경고
  • 쉬운 어설 션 로깅 :Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • 테스트 로깅 :Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • 비품
  • 데이터 중심 테스트 (이론)
  • 다음을 기반으로 실행할 테스트를 선택하십시오 .
    • 속성 일치
    • 부분 문자열 매칭
    • 테스트 스위트

2
문제는 비교를 요구하고 있습니다. IMO에서는 프레임 워크와 적어도 두 가지 인기있는 프레임 워크 인 googletest와 Boost 의 차이점 을 제시하는 것이 중요합니다 . 특히 xUnit ++을이 두 가지 대안으로 광고하는 경우. 업데이트되면 +1이됩니다 :)
mloskot

그럴 수 있지. :) 나는 이미 위키비교 테이블 을 가지고 있지만 내 대답에 직접 몇 가지 차이점을 요약하려고합니다.
moswald

1
나는 위키 테이블을 직접 연결하기로 결정했습니다. 요약을 정리하기 위해 요약을 어지럽히고있었습니다.
moswald

링크가 저에게 효과적입니다. 감사합니다! +1
mloskot

1
프로젝트가 중단 되었습니까? 마지막 커밋은 2015 년 9 월 9 일로 거슬러 올라갑니다. 감사.
zertyz

5

CppUTest- 모의 라이브러리가있는 매우 훌륭하고 가벼운 프레임 워크. 더 자세히 살펴볼 가치가 있습니다.


4

CPUnit ( http://cpunit.sourceforge.net )은 Google Test와 유사하지만 더 적은 macos (어설 션은 함수 임)와 일반적인 매크로 함정을 피하기 위해 매크로가 접두사로 사용되는 프레임 워크입니다. 테스트는 다음과 같습니다.

#include <cpunit>

namespace MyAssetTest {
    using namespace cpunit;

    CPUNIT_FUNC(MyAssetTest, test_stuff) {
        int some_value = 42;
        assert_equals("Wrong value!", 666, some_value);
    }

    // Fixtures go as follows:
    CPUNIT_SET_UP(MyAssetTest) {
        // Setting up suite here...
        // And the same goes for tear-down.
    }

}

자동 등록되므로 이보다 더 많은 것이 필요하지 않습니다. 그런 다음 컴파일하고 실행하십시오. Java를 프로그래밍하는 데 시간을 소비 해야하는 사람들을 위해이 프레임 워크를 JUnit을 사용하는 것과 매우 흡사합니다. 아주 좋아요!



2

API Sanity Checker — C / C ++ 라이브러리를위한 테스트 프레임 워크 :

공유 C / C ++ 라이브러리에 대한 기본 단위 테스트 자동 생성기. 매개 변수에 대한 합리적인 (대부분은 아니지만 대부분의 경우는 아님) 입력 데이터를 생성하고 헤더의 선언 분석을 통해 API의 모든 함수에 대해 간단한 ( "sanity"또는 "shallow"-quality) 테스트 사례를 작성할 수 있습니다. 파일.

생성 된 테스트의 품질을 통해 간단한 사용 사례에서 중대한 오류가 없는지 확인할 수 있습니다. 이 도구는 생성 된 테스트를 빌드 및 실행하고 충돌 (segfault), 중단, 모든 종류의 방출 된 신호, 0이 아닌 프로그램 리턴 코드 및 프로그램 정지를 감지 할 수 있습니다.

CppUnit, Boost 및 Google Test와 비교하여 고유 한 기능 :

  • 테스트 데이터 및 입력 인수 자동 생성 (복잡한 데이터 유형의 경우에도)
  • 비품 및 템플릿 대신 현대적이고 재사용 성이 높은 특수 유형
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.