2008-09-18 8 views
35

대형 멀티 플랫폼 응용 프로그램을 빌드 할 때 단위 테스트를 강력하게 사용합니다. 현재 우리는 별도의 프로젝트 내에서 단위 테스트를 수행 할 계획입니다. 이렇게하면 코드 기반을 깨끗하게 유지할 수 있습니다. 그러나 이것이 테스트 코드를 유닛 구현과 분리 할 것이라고 생각합니다. 이 접근 방식에 대해 어떻게 생각하고 있으며 C++ 응용 프로그램 용 JUnit과 같은 도구가 있습니까?대규모 C++ 프로젝트에서 단위 테스트를 어떻게 구현합니까?

+0

매우 비슷한 질문이 있습니다. [CppUnit] (http://cppunit.sourceforge.net), [CppUnitLite] (http://www.objectmentor.com/resources/downloads.html) 및 "[기존 코드로 효과적으로 작업하기] (http : /www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin/dp/0131177052) "(모두 by Michael Feathers –

답변

15

보고 테스트

Aeryn

입니다 개발을 찾을 수 있습니다. CppUnit은 분명히 내가 선택한 것이 아닙니다 (적어도 안정 버전 1.x에서는 많은 테스트가 부족하고 많은 코드 줄이 필요하기 때문입니다). 지금까지 내가 선호하는 프레임 워크는 CxxTest이며 언젠가는 Fructose입니다.

어떤 방법, C++ TU 프레임 워크를 평가하는 몇 가지 "신문은"이 있습니다 :

+0

JUnit과 달리 C++에 더 잘 어울립니다. [CATCH] (https://github.com/philsquared/Catch). –

11

합리적인 방법입니다.

나는 모두 UnitTest++ 내가 CppUnit을 검토 한

Boost.Test 매우 좋은 결과를 했어,하지만 나에게, 그것은 더 ++ C 목표 일보다 JUnit을 물건의 번역처럼 느꼈다.

업데이트 : 요즘은 Catch을 사용하는 것이 좋습니다. 효과적이고 사용하기 쉽다는 것을 알게되었습니다.

+3

[doctest] (https://github.com/onqtam/doctest)는 나의 재 구현입니다. 컴파일 속도에 중점을두고 캐치 - [FAQ] (https://github.com/onqtam/doctest/blob/master/doc/markdown/faq.md#how-is-doctest-different-from-catch)를 확인하십시오.) 어떤 점에서 다른지 확인하려면 – onqtam

1

CppUnit을은 C++ 응용 프로그램을 개인적으로 http://cppunit.sourceforge.net/cppunit-wiki

에 대한의 JUnit 직접 해당합니다, 나는 다른 프로젝트에 단위 테스트를 생성하고, 모든 단위 테스트와 종속 소스 코드를 내장 별도의 빌드 구성을 만들었습니다. 어떤 경우에는 클래스의 private 멤버 함수를 테스트하여 Test 클래스를 테스트 할 객체의 friend 클래스로 만들었지 만 선처리 선언을 통해 "비 테스트"구성으로 빌드 할 때 friend 선언을 숨 겼습니다.

그러나 레거시 코드에 테스트를 통합 할 때 이러한 코딩 체조가 발생했습니다. 단위 테스트의 목적으로 시작한다면 더 나은 설계가 간단 할 것입니다.

1

소스 트리의 각 라이브러리에 대한 단위 테스트 프로젝트를 해당 라이브러리의 하위 디렉토리에 만들 수 있습니다. 결국 각 라이브러리에 대한 테스트 드라이버 응용 프로그램이 만들어지기 때문에 단일 테스트 집합을 더 쉽게 실행할 수 있습니다. 코드를 하위 디렉토리에두면 코드를 깨끗하게 유지할 수있을뿐 아니라 테스트를 코드와 가깝게 유지할 수 있습니다.

소스 트리에서 모든 테스트 스위트를 실행하고 결과를 수집하도록 스크립트를 쉽게 작성할 수 있습니다.

저는 커다란 성공을 거둔 오리지날 CppUnit의 맞춤형 버전을 사용하고 있지만 다른 대안이 있습니다. GoogleTest가 흥미로운 것 같습니다.

1

제품 테스트를 통해 올바른 방향으로 제품을 테스트하고 제품의 신뢰성을 향상시킬 수있는 훌륭한 계획이라고 생각합니다.

응용 프로그램을 다른 플랫폼 또는 다른 운영 체제로 변환 할 때 단위 테스트로 모든 문제를 해결할 수는 없지만. 그 이유는 프로세스 단위 테스트가 애플리케이션의 버그를 발견하기 때문입니다. 단지 시스템에 상상할 수있는 많은 입력을 던지고 다른 끝에서 결과를 기다립니다. 마치 키보드로 끊임없이 파운드를 보내고 결과를 관찰하는 것과 같습니다 (베타 테스터).

좋은 단위 테스트를 통해 다음 단계로 진행하려면 응용 프로그램의 내부 설계에 집중해야합니다. 내가 아는 가장 좋은 방법은 "계약 프로그래밍"또는 "계약에 의한 설계"라고 불리는 디자인 패턴 또는 디자인 프로세스를 사용하는 것이 었습니다. 핵심 설계에 신뢰성을 높이는데 도움이되는 다른 책이있었습니다.

개발 프로세스 디버깅 : 집중력을 유지하고, 선박 날짜를 맞추며, 솔리드 팀을 구축하는 실용적인 전략.

개발 팀에서는 프로그래머 오류, 개발자 오류, 설계 오류, 그리고 단위 테스트와 DBC를 통한 소프트웨어 패키지의 신뢰성 구축 방법을 매우 자세히 검토했습니다. 개발 프로세스 디버깅

1

CxxTest 또한 C++ 용 JUnit/CppUnit/xUnit과 같은 가벼운 플랫폼을 사용하는 것이 좋습니다. 우리는 ++은 매우 간단 추가하고 많은 테스트 단위 frameforks는 C에 대한 있습니다 가치가 다른 C++ 테스트 프레임 워크

2

으로 내가 유닛 테스트를 사용 ++. 테스트는 별도의 프로젝트에 있지만 실제 테스트는 실제 코드와 얽혀 있습니다. 테스트중인 섹션 아래의 폴더에 있습니다. 예 :
에 MyProject \ SRC < \ - 실제 응용 프로그램
에 MyProject의 소스 \ SRC \이 < 테스트 - 테스트의 소스
당신은 폴더를 중첩 한 (누가되지 않습니다) 그들은 너무있을 경우 자신의 own \ tests 하위 디렉토리.

+0

동일한 작업을 수행하며 빌드 시스템이 자동으로 테스트를 작성합니다 어떤 unittest 소스 폴더에서 발견되는 코드의 EXE 파일. –

3

기본 코드를 공유 (동적) 라이브러리로 분리 한 다음이 라이브러리에 대한 단위 테스트의 주요 부분을 작성해야합니다.

2 년 전 (2008) Linux Foundation에서 배포 한 대규모 LSB 인프라 프로젝트에 참여했습니다. 이 프로젝트의 목적 중 하나는 Linux 핵심 라이브러리에서 40,000 개의 함수에 대한 단위 테스트를 작성하는 것이 었습니다. 이 프로젝트의 맥락에서 우리는 모든 테스트를 자동으로 생성하기 위해 AZOV technologyAPI Sanity Autotest이라는 기본 도구를 만들었습니다. 이 도구를 사용하여 기본 라이브러리에 대한 단위 테스트를 생성 할 수 있습니다.

관련 문제