Visual Studio C ++에 대한 단위 테스트를 설정하는 방법


93

내가 테스트 프레임 워크에서와 사용 가능한 설정하는 방법을 알아내는 데 문제가 비주얼 스튜디오 2008 를 위해 C++내장 된 단위 테스트 스위트 아마도.

모든 링크 또는 자습서를 주시면 감사하겠습니다.


Google은 xUnit 프레임 워크와 매우 유사한 C ++ 테스트 프레임 워크를 출시합니다. http://code.google.com/p/googletest/
popopome

어떤 프레임 워크를 사용하게 되었습니까?
Joakim Karlsson

실제로 저는 아직 사용하지 않았습니다. 나는 단위 테스트에서 작업하는 것이 가장 효과적인 시간 사용이 아니라고 결정했습니다.
DShook 2009

답변:


56

이 페이지 는 도움 될 수 있으며, 몇 가지 C ++ 단위 테스트 프레임 워크를 검토합니다.

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • 단위 ++
  • CxxTest

CPPUnitLite 또는 CPPUnitLite2를 확인하십시오 .

CPPUnitLite 는 원래 Java의 JUnit을 CPPUnit으로 C ++로 포팅 한 Michael Feathers에 의해 만들어졌습니다 (CPPUnit는 JUnit의 개발 모델을 모방하려고 시도하지만 C ++에는 사용하기 쉽도록 Java의 기능 (예 : 리플렉션)이 없습니다).

CPPUnitLite는 C ++로 포팅 된 Java가 아닌 진정한 C ++ 스타일의 테스트 프레임 워크를 만들려고합니다. (나는 Feather 's Working Effectively with Legacy Code 책 에서 의역했습니다 .) CPPUnitLite2 는 더 많은 기능과 버그 수정이있는 또 다른 재 작성 인 것 같습니다.

또한 CPPUnitLite2 및 기타 프레임 워크의 내용을 포함하는 UnitTest ++ 를 우연히 발견했습니다 .

Microsoft는 WinUnit 을 출시 했습니다 .

체크 아웃 Catch 또는 Doctest


2
Googletest 부스트 :: 테스트와 매우 유사하지만, VS에 통합 할 좀 더 쉽게입니다
마틴 베켓

3
Catch 가 여기에 언급되지 않은 것이 놀랍습니다 . 또한 체크 아웃 doctest가 -를 체크 아웃 - 컴파일 속도에 큰 초점을 잡아 내 다시 구현 자주 묻는 질문 둘 사이에 다른 뭐죠 볼
onqtam

1
@onqtam 너무 놀라지 마세요.이 질문 / 답변은 2008 년부터였습니다! 추천 링크를 추가했습니다.
Aardvark

24

Visual Studio 2008 내의 기본 제공 테스트 프레임 워크를 사용하여 관리되지 않는 C ++를 테스트하는 방법이 있습니다 . C ++ / CLI를 사용하여 C ++ 테스트 프로젝트를 만드는 경우 관리되지 않는 DLL을 호출 할 수 있습니다. 관리되지 않는 C ++로 작성된 코드를 테스트하려면 공용 언어 런타임 지원을 / clr : safe에서 / clr로 전환해야합니다.

내 블로그에 대한 단계별 세부 정보가 있습니다. http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/


1
이것은 당신의 C ++ 코드에 특정한 제한을가합니다. 저는 C ++ / CLI 코드에 헤더를 포함 시키려고하는 것이 가치가있는 것보다 더 문제가되는 코드베이스가 적어도 하나 있습니다. C ++ / CLI 사용의 큰 이점은 mbUnit / NUnit / xUnit.Net의 RowTest와 같은 속성을 사용하여 펑키 한 매개 변수화 된 테스트를 사용할 수 있다는 것입니다.
Andy Dent

9

다음은 Microsoft에서 IIS URL 재 작성 모듈을 테스트하는 데 사용하는 접근 방식입니다 (명령 줄 기반이지만 VS에서도 작동해야 함).

  1. 소스 코드를 cpp 파일로 이동하고 필요한 경우 앞으로 선언을 사용하여 헤더 파일이 사용 가능한지 확인하십시오.
  2. 코드를 컴파일하여 라이브러리 (.lib)로 테스트합니다.
  3. CLR 지원을 사용하여 UnitTest 프로젝트를 C ++로 만듭니다.
  4. 헤더 파일을 포함하십시오.
  5. .lib 파일을 포함합니다.
  6. Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll에 대한 참조를 추가합니다.
  7. 단위 테스트를 선언하기 위해 정말 작은 클래스를 사용하고 다음과 같이 관리되는 코드에서 C ++ / 네이티브 코드로 이동합니다 (오타가있을 수 있음).

다음은 예입니다.

// Example
#include "stdafx.h"
#include "mstest.h"

// Following code is native code.
#pragma unmanaged
void AddTwoNumbersTest() {
  // Arrange
  Adder yourNativeObject;
  int expected = 3;
  int actual;
  // Act
  actual = yourNativeObject.Add(1, 2);
  // Assert
  Assert::AreEqual(expected, actual, L"1 + 2 != 3");
}

// Following code is C++/CLI (Managed)
#pragma managed
using namespace Microsoft::VisualStudio::TestTools::UnitTesting;
[TestClass]
public ref class TestShim {
public:
  [TestMethod]
  void AddTwoNumbersTest() {
     // Just jump to C++ native code (above)
     ::AddTwoNumbersTest();
  }
};

이 접근 방식을 사용하면 사람들이 C ++ / CLI를 너무 많이 배울 필요가 없습니다. 모든 실제 테스트는 C ++ 네이티브로 수행되며 TestShim 클래스는 테스트를 MSTest.exe에 '게시'하거나 표시하는 데 사용됩니다. ).

새 테스트를 추가하려면 새 [TestMethod] void NewTest () {:: NewTest ();} 메서드와 새 void NewTest () 네이티브 함수를 선언하면됩니다. 매크로도, 트릭도없고, 전진합니다.

이제 heade 파일은 선택 사항이지만 C ++ 네이티브 서명 (예 : Stirng ^ 대신 wchar_t *)을 사용하여 Assert 클래스의 메서드를 노출하는 데 사용할 수 있으므로 C ++에 가깝고 C ++ / CLI에서 멀리 유지할 수 있습니다. :

다음은 예입니다.

// Example
#pragma once
#pragma managed(push, on)
using namespace System;
class Assert {
public:
    static void AreEqual(int expected, int actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    static void AreEqual(int expected, int actual, PCWSTR pszMessage) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual, gcnew String(pszMe
ssage));
    }

    template<typename T>
    static void AreEqual(T expected, T actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    // Etcetera, other overloads...
}
#pragma managed(pop)

HTH


6

개인적으로 WinUnit을 선호하는 이유는 테스트를 제외하고는 아무것도 작성할 필요가 없기 때문입니다 (exe가 아닌 .dll을 테스트로 빌드합니다). 프로젝트를 빌드하고 WinUnit.exe를 테스트 출력 디렉토리로 지정하면 찾은 모든 것을 실행합니다. 여기에서 WinUnit 프로젝트를 다운로드 할 수 있습니다 . (MSDN은 이제 기사가 아닌 전체 문제를 다운로드해야합니다. WinUnit이 포함되어 있습니다.)


4

VS9에 포함 된 프레임 워크 .NET이지만 C ++ / CLI로 테스트를 작성할 수 있으므로 일부 .NET isms를 배우는 데 익숙하다면 대부분의 C ++ 코드를 테스트 할 수 있어야합니다.

boost.testgoogletest 모습은 매우 유사하지만 약간 다른 용도에 적합합니다. 둘 다 바이너리 구성 요소가 있으므로 테스트를 컴파일하고 실행하려면 솔루션에 추가 프로젝트가 필요합니다.

우리가 사용하는 프레임 워크 는 훨씬 더 가벼운 CxxTest입니다 . 헤더 만 있으며 Perl (!) 스크립트를 사용하여 헤더에서 테스트 스위트 정보를 긁어냅니다 (스위트는 CxxTest :: Base에서 상속되며 모든 테스트 메소드의 이름은 "test"로 시작 함). 분명히이를 위해서는 한 소스 또는 다른 소스 에서 Perl을 가져와야하므로 빌드 환경 설정에 오버 헤드가 추가됩니다.


CxxTest는 perl 대신 파이썬을 사용할 수 있습니다
Martin Beckett

또한 코드에 필요한 DLL에 대해주의해야합니다. NUnit 및 mbUnit 테스트 C ++ / CLI 코드에 문제가있어 DLL을로드하려고합니다.
Andy Dent

2

UnitTest ++ 사용 합니다.

이 게시물을 작성한 후 몇 년 동안 소스는 SourceForge에서 github로 이동했습니다. 또한 예제 자습서 는 이제 더 독립적입니다. 구성이나 프로젝트 설정에 전혀 들어 가지 않습니다.

프로젝트 파일이 이제 CMake를 통해 생성되므로 Visual Studio 6에서 여전히 작동하지 않을 것입니다. 여전히 이전 버전 지원이 필요한 경우 SourceForge 브랜치 에서 사용 가능한 마지막 버전을 얻을 수 있습니다 .


2

여기에 언급 된 도구는 모두 명령 줄 도구입니다. 더 통합 된 솔루션을 찾고 있다면 C / C ++ 단위 테스트를위한 Visual Studio 추가 기능인 cfix studio를 살펴보세요 . TestDriven.Net과 매우 유사하지만 .NET이 아닌 (관리되지 않는) C / C ++ 용입니다.


1

VS2005 및 Eclipse와 함께 CppUnit 을 사용했습니다 . 위키는 매우 철저합니다 (특히 JUnit에 익숙한 경우).


1

VS2008에 대해 100 % 확신하지는 못하지만 Microsoft가 VS2005에서 Team Suite의 일부로 제공 한 단위 테스트 프레임 워크는 C ++가 아닌 .NET 전용이라는 것을 알고 있습니다.

CppUnit도 사용했는데 괜찮 았습니다. NUnit / JUnit / so on과 매우 동일합니다.

부스트를 사용한 경우 단위 테스트 라이브러리도 있습니다.

boost 뒤에있는 사람들은 심각한 코딩 작업을 가지고 있으므로 프레임 워크가 꽤 좋을 것이라고 말하고 싶지만 가장 사용자 친화적이지 않을 수 있습니다 :-)


1

같은 이유로 CxxTest도 좋아합니다. 헤더 파일이므로 링크가 필요하지 않습니다. Python 러너도 있으므로 Perl에 집착하지 않습니다. 곧 Google 라이브러리를 검토하겠습니다. Boost 물건은 너무 많은 다른 수하물을 가져옵니다.


1

Visual Studio 2008의 단위 테스터는 내가 아는 한 .NET 코드 전용입니다.

저는 Visual Studio 2005에서 CppUnit을 사용했고 꽤 괜찮 았습니다.

내가 기억하는 한 설정은 비교적 고통스럽지 않았습니다. 테스트 프로젝트에서 링커 (링커 → 입력 → 추가 종속성)에 cppunitd.lib가 포함되어 있는지 확인하십시오.

그런 다음 #include <cppunit/extensions/HelperMacros.h>헤더에서.

그런 다음 http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html 의 단계에 따라 테스트 클래스를 작동시킬 수 있습니다.


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