다음을 통해 공유


테스트 탐색기를 사용하여 네이티브 코드 단위 테스트

Visual Studio c + +로 작성 된 관리 되지 않는 코드에 대 한 단위 테스트를 만들 수 있습니다.관리 되지 않는 코드를 네이티브 코드로 라고도 합니다.

다음은 시작 하는 필수 정보가 포함 되어 있습니다.이후 섹션에서는 단계에 자세히 설명 하는 연습을 제공 합니다.

DLL에서 관리 되지 않는 코드에 대 한 단위 테스트를 작성 하려면

  1. 사용 된 기본 테스트 프로젝트 테스트에 대 한 별도 Visual Studio 프로젝트를 만들려면 템플릿을 합니다.

    일부 샘플 테스트 코드를 포함 하는 프로젝트입니다.

  2. DLL 테스트 프로젝트에 액세스할 수 있도록 합니다.

    • #include.h DLL의 외부에서 액세스할 수 있는 함수 선언을 포함 하는 파일입니다.

      .h 파일이 표시 된 함수 선언을 포함 해야 _declspec(dllimport).또는 DEF 파일을 사용 하 여 메서드를 내보낼 수 있습니다.자세한 내용은 가져오기 및 내보내기을 참조하십시오.

      단위 테스트에서 테스트 DLL에서 내보낸 함수에만 액세스할 수 있습니다.

    • DLL 프로젝트에 테스트 프로젝트의 참조를 추가 합니다.

      속성 테스트 프로젝트의 확장 공용 속성, 프레임 워크 및 참조를 선택 하 고 참조 추가.

  3. 테스트 프로젝트에서 테스트 클래스를 만들고 메서드를 다음과 같은 방식으로 테스트 매크로 및 Assert 클래스를 사용 하 여 테스트:

    #include "stdafx.h"
    #include <CppUnitTest.h>
    #include "..\MyProjectUnderTest\MyCodeUnderTest.h"
    using namespace Microsoft::VisualStudio::CppUnitTestFramework;
    TEST_CLASS(TestClassName)
    {
    public:
      TEST_METHOD(TestMethodName)
      {
        // Run a function under test here.
        Assert::AreEqual(expectedValue, actualValue, L"message", LINE_INFO());
      }
    }
    
    • Assert테스트의 결과 확인 하는 데 사용할 수 있는 몇 가지 정적 함수를 포함 합니다.

    • LINE_INFO() 매개 변수는 선택적 요소입니다.경우에서 PDB 파일이 있는 경우, 실패의 위치를 확인 하려면 테스트 러너 수 있습니다.

    • 테스트 설정 및 정리 메서드를 작성할 수도 있습니다.정의 대 한 자세한 내용은 열은 TEST_METHOD 매크로 Cppunittest.h에 있는 메모를 읽고

    • 테스트 클래스를 중첩할 수 없습니다.

  4. 테스트 탐색기를 사용 하 여 테스트를 실행 하려면:

    1. 보기 메뉴를 선택 기타 Windows, 테스트 탐색기.

    2. Visual Studio 솔루션을 빌드합니다.

    3. 테스트 탐색기에서 선택 하 여 를 실행 하는 모든.

    4. 모든 테스트를 테스트 탐색기에서 자세히 조사 하는 방법:

      1. 오류 메시지 및 스택 추적 같은 자세한 정보를 보려면 테스트 이름을 선택 합니다.

      2. 테스트 이름을 테스트 코드를 오류 위치로 이동 합니다 두 번 (예를 들어 클릭)을 엽니다.

      3. 테스트에 대 한 바로 가기 메뉴에서 선택 선택한 테스트 디버그 디버거에서 테스트를 실행할 수 있습니다.

연습: 테스트 탐색기로는 관리 되지 않는 DLL 개발

이 연습에서는 자신의 DLL을 개발할 수에 적응할 수 있습니다.주요 단계는 다음과 같습니다.

  1. 기본 테스트 프로젝트 만들기.테스트를 별도 프로젝트에서 개발 중인 DLL에서 생성 됩니다.

  2. DLL 프로젝트를 만드는.이 연습에서는 새 DLL을 만들지만 기존 DLL을 테스트 하는 절차와 비슷합니다.

  3. DLL 함수를 테스트 하려면 보이게.

  4. 테스트를 반복적으로 보강.개발 코드의 테스트에서 led가 "빨강-녹색-리팩터링" 주기를 하는 것이 좋습니다.

  5. 실패 한 테스트 디버깅.디버그 모드에서 테스트를 실행할 수 있습니다.

  6. 리팩터링 변경 하지 않으면 테스트.외부 동작은 변경 하지 않고 코드의 구조를 개선 하는 의미를 리팩터링 합니다.성능, 확장성, 코드의 가독성을 향상 시키기 위해 할 수 있습니다.함을 동작을 변경 하는 것 이므로 테스트에 코드를 리팩터링 변경 하는 동안 변경 되지 않습니다.테스트 리팩터링을 하는 동안 버그를 소개 하지 않도록 합니다.따라서 이러한 테스트 하지 않은 경우 보다 훨씬 더 많은 자신감을 변경할 수 있습니다.

  7. 검사를 선택.단위 테스트는 더 많은 코드를 실행 하는 경우에 더 유용 합니다.테스트에서 사용 된 코드 부분을 발견할 수 있습니다.

  8. 장치 외부 리소스 로부터 격리.일반적으로 DLL 다른 Dll, 데이터베이스 또는 원격 하위 시스템 등 개발 중인 시스템의 다른 구성 요소에 따라 달라 집니다.종속성에서 격리에서 각 단위를 테스트 하는 것이 유용 합니다.외부 구성 요소는 느리게 실행 되는 테스트를 만들 수 있습니다.개발 과정의 다른 구성 요소 완료 수 있습니다.

기본 단위 테스트 프로젝트 만들기

  1. 파일 메뉴에서 새로 만들기, 프로젝트를 선택합니다.

    대화 상자에서 확장 설치 된, 템플릿, Visual C++, 테스트.

    선택 된 기본 테스트 프로젝트 템플릿.

    이 연습에서는 테스트 프로젝트 라는 NativeRooterTest.

    C++ 단위 테스트 프로젝트를 만드는 중

  2. 새 프로젝트를 검사 합니다.unittest1.cpp

    TEST_CLASS 및 TEST_METHOD가 있는 테스트 프로젝트

    다음에 유의하세요:

    • 각 테스트를 사용 하 여 정의 된 TEST_METHOD(YourTestName){...}.

      일반적인 함수 시그니처를 작성할 필요가 없습니다.서명 매크로 TEST_METHOD로 만들어집니다.매크로 void를 반환 하는 함수 인스턴스를 생성 합니다.또한 테스트 메서드에 대 한 정보를 반환 하는 정적 함수를 생성 합니다.이 정보는 테스트 탐색기를 메서드를 찾을 수 있습니다.

    • 테스트 메서드 그룹화에 대 한 클래스를 사용 하 여 TEST_CLASS(YourClassName){...}.

      테스트를 실행 하면 각 테스트 클래스의 인스턴스가 만들어집니다.테스트 메서드는 임의의 순서로 호출 됩니다.전과 후 각 모듈, 클래스 또는 메서드를 호출 하는 특수 한 메서드를 정의할 수 있습니다.자세한 내용은 를 구성 하는 c + + 테스트.

  3. 테스트 테스트 탐색기를 실행 하는 것을 확인 하십시오.

    1. 일부 테스트 코드를 삽입 합니다.

      TEST_METHOD(TestMethod1)
      {
      Assert::AreEqual(1,1);
      }
      

      여기서는 Assert 클래스는 테스트 메서드에서 결과 확인 하는 데 사용할 수 있는 몇 가지 정적 메서드를 제공 합니다.

    2. 테스트 메뉴를 선택 실행 , 모든 테스트.

      테스트 빌드 및 실행 합니다.

      테스트 탐색기가 나타납니다.

      테스트에서 나타나는 테스트 통과.

      통과한 테스트 1개가 있는 단위 테스트 탐색기

관리 되지 않는 DLL 프로젝트를 만듭니다

  1. 만들기는 Visual C++ 를 사용 하 여 프로젝트의 Win32 프로젝트 템플릿.

    이 연습에서는 프로젝트 이름이 RootFinder.

    C++ Win32 프로젝트를 만드는 중

  2. 선택 DLL심볼 내보내기 Win32 응용 프로그램 마법사에 있습니다.

    내보내기 기호 옵션은 내보낸된 메서드를 선언 하는 데 사용할 수 있는 편리한 매크로 생성 합니다.

    DLL에 대한 C++ 프로젝트 마법사 집합 및 기호 내보내기

  3. 주 하는.h 파일에서에서 내보낸된 함수를 선언 합니다.

    새 DLL 코드 프로젝트 및 API 매크로가 있는 .h 파일

    여 자가 __declspec(dllexport) 공용 및 보호 된 멤버 클래스의 외부 DLL 표시 되도록 하면 됩니다.자세한 내용은 Dllimport 및 >dllexport에서 C++ 클래스를 사용합니다.을 참조하십시오.

  4. 주.cpp 파일에서 함수에 대 한 최소한의 본문을 추가 합니다.

    // Find the square root of a number.
    double CRootFinder::SquareRoot(double v)
    {
      return 0.0;
    }
    

두 테스트 프로젝트의 DLL 프로젝트

  1. DLL 프로젝트에 테스트 프로젝트의 프로젝트 참조를 추가 합니다.

    1. 테스트 프로젝트의 속성을 열고 선택 공용 속성, 프레임 워크 및 참조.

      C++ 프로젝트 속성 - 프레임워크 및 참조

    2. 선택 새 참조 추가.

      참조 추가 대화 상자에서 DLL 프로젝트를 선택 하 고 선택 추가.

      C++ 프로젝트 속성 - 새 참조 추가

  2. 주 단위 테스트.cpp 파일을에 DLL 코드의.h 파일을 다음과 같습니다.

    #include "..\RootFinder\RootFinder.h"
    
  3. 내보낸된 함수를 사용 하는 기본 테스트를 추가 합니다.

    TEST_METHOD(BasicTest)
    {
    CRootFinder rooter;
    Assert::AreEqual(
    // Expected value:
    0.0, 
    // Actual value:
    rooter.SquareRoot(0.0), 
    // Tolerance:
    0.01,
    // Message:
    L"Basic test failed",
    // Line number - used if there is no PDB file:
    LINE_INFO());
    }
    
  4. 솔루션을 빌드합니다.

    새 테스트 테스트 탐색기에 나타납니다.

  5. 테스트 탐색기에서 선택 하 여 를 실행 하는 모든.

    단위 테스트 탐색기 - 기본 테스트 통과

테스트 및 코드 프로젝트를 설정 하 고 함수에서 코드 프로젝트를 실행 하는 테스트를 실행 하는 확인 했습니다.이제 실제 테스트 및 코드를 쓸 수 있습니다.

반복적으로 테스트를 보강 하 고 전달 하 게

  1. 새 테스트를 추가 합니다.

    TEST_METHOD(RangeTest)
    {
      CRootFinder rooter;
      for (double v = 1e-6; v < 1e6; v = v * 3.2)
      {
        double actual = rooter.SquareRoot(v*v);
        Assert::AreEqual(v, actual, v/1000);
      }
    }
    
    팁

    통과 된 테스트를 변경 하지 않는 것이 좋습니다.대신 새 테스트 추가, 테스트에 통과 하도록 코드를 업데이트 하 고 다음 다른 테스트를 추가 등.

    사용자가 자신의 요구 사항이 변경 되 면 더 이상 정확한 지 테스트를 비활성화 합니다.새 테스트를 작성 하 고 한 번에 하나씩 같은 증분 방식으로 작동 하 게 합니다.

  2. 솔루션을 빌드하고 테스트 탐색기에서 선택한 를 실행 하는 모든.

    새 테스트가 실패합니다.

    RangeTest 실패

    팁

    즉시 작성 한 후 각 테스트가 실패 하는지 확인 합니다.절대로 실패 하는 테스트를 작성 하기 쉬운 실수를 피할 수 있습니다.

  3. 새 테스트를 통과할 수 있도록 테스트 대상 코드를 향상 시킵니다.

    #include <math.h>
    ...
    double CRootFinder::SquareRoot(double v)
    {
      double result = v;
      double diff = v;
      while (diff > result/1000)
      {
        double oldResult = result;
        result = result - (result*result - v)/(2*result);
        diff = abs (oldResult - result);
      }
      return result;
    }
    
  4. 솔루션을 빌드하고 테스트 탐색기에서 선택한 를 실행 하는 모든.

    테스트를 모두 통과합니다.

    단위 테스트 탐색기 - 범위 테스트 통과

    팁

    한 번에 하나의 테스트를 추가 하 여 코드를 개발 합니다.모든 테스트의 각 반복 후 전달 해야 합니다.

실패 한 테스트를 디버깅 합니다.

  1. 다른 테스트를 추가 합니다.

    #include <stdexcept>
    ...
    // Verify that negative inputs throw an exception.
    TEST_METHOD(NegativeRangeTest)
    {
      wchar_t message[200];
      CRootFinder rooter;
      for (double v = -0.1; v > -3.0; v = v - 0.5)
      {
        try 
        {
          // Should raise an exception:
          double result = rooter.SquareRoot(v);
    
          _swprintf(message, L"No exception for input %g", v);
          Assert::Fail(message, LINE_INFO());
        }
        catch (std::out_of_range ex)
        {
          continue; // Correct exception.
        }
        catch (...)
        {
          _swprintf(message, L"Incorrect exception for %g", v);
          Assert::Fail(message, LINE_INFO());
        }
      }
    }
    
  2. 솔루션을 빌드하고 선택 를 실행 하는 모든.

  3. 열 (또는 두 번 클릭) 테스트가 실패 합니다.

    실패 한 어설션이 강조 표시 됩니다.오류 메시지 테스트 탐색기의 세부 정보 창에 표시 됩니다.

    NegativeRangeTests 실패

  4. 함수를 단계별로 실행할 테스트에 실패 이유를 확인 하려면:

    1. SquareRoot 함수 시작에 중단점을 설정 합니다.

    2. 실패 한 테스트의 바로 가기 메뉴에서 선택 선택한 테스트 디버그.

      중단점에서 실행이 중지 되 면 코드를 단계별로 실행 합니다.

  5. 개발 중인 함수에 코드를 삽입 합니다.

    #include <stdexcept>
    ...
    double CRootFinder::SquareRoot(double v)
    {
        // Validate parameter:
        if (v < 0.0) 
        {
          throw std::out_of_range("Can't do square roots of negatives");
        }
    
  6. 이제 모든 테스트를 통과 합니다.

    모든 테스트 통과

테스트를 변경 하지 않고 코드 리팩터링

  1. 중앙 계산 SquareRoot 함수에 간단 하 게 합니다.

    // old code:
    //   result = result - (result*result - v)/(2*result);
    // new code:
         result = (result + v/result)/2.0;
    
  2. 솔루션을 빌드하고 선택 를 실행 하는 모든오류가 발생 하지 않았는지 확인 합니다.

    팁

    좋은 집합을 단위 테스트 코드를 변경 하는 경우 버그를 도입 해야 자신감을 얻을 수 있습니다.

    다른 변경 내용을 별도 리팩터링 유지 합니다.

다음 단계

  • 격리성 대부분의 Dll 다른 Dll 및 데이터베이스와 같은 다른 하위 시스템에 따라 달라 집니다.이러한 구성 요소는 종종 병렬로 개발 됩니다.단위 테스트의 다른 구성 요소를 아직 사용할 수 없는 동안 수행 될 수 있도록 모의 대체 해야 하거나

  • 빌드 확인 테스트 합니다. 팀의 빌드 서버가 설정 된 간격으로 수행 하는 테스트를 할 수 있습니다.이렇게 하면 여러 팀 멤버의 작업을 통합 되 면 버그 도입 되었습니다.

  • 테스트를 체크 인 합니다. 소스 제어로 각 팀 멤버가 코드를 확인 하기 전에 몇 가지 테스트를 수행할 수 있도록 라 만들어 질 수 있습니다.일반적으로이 빌드 확인 테스트의 전체 집합의 하위 집합입니다.

    최소 수준의 코드 검사 라 만들어 질 수도 있습니다.

참고 항목

작업

Walkthrough: Creating and Using a Dynamic Link Library (C++)

개념

가져오기 및 내보내기

기타 리소스

관리 되 는/관리 되지 않는 코드 상호 운용성에 간략하게

네이티브 코드 디버깅