문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다.
번역
영문
Visual Studio 2017을 사용하는 것이 좋습니다.

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

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

다음 절차는 시작에 도움이 되는 중요 한 정보를 포함 합니다. 이후 섹션에서는 단계를 자세히 설명 하는 연습을 제공 합니다.

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

  1. 사용의 기본 테스트 프로젝트 템플릿 테스트를 위한 별도 Visual Studio 프로젝트를 만들 수 있습니다.

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

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

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

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

      단위 테스트에 테스트 중인 코드에서 내보낸 함수만 사용됩니다.

    • 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. 보기 메뉴에서 다른 창, 테스트 탐색기를 선택합니다.

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

    3. 테스트 탐색기에서 모두 실행을 선택합니다.

    4. 테스트 테스트 탐색기에서 자세히 조사 합니다.

      1. 오류 메시지 및 스택 추적 등의 자세한 내용을 보려면 테스트 이름을 선택 합니다.

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

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

이 연습에서는 DLL 자체를 개발하는 데 적응할 수 있습니다. 주요 단계는 다음과 같습니다.

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

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

  3. DLL 함수를 테스트 볼 수 있도록 하세요..

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

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

  6. 리팩터링 변경 하지 않고 테스트를 유지 하는 동안 리팩터하세요.. 리팩터링의 외부 동작은 변경 하지 않고 코드의 구조를 개선 하는 수단입니다. 성능, 확장성, 코드의 가독성을 향상 시키기 위해 수행할 수 있습니다. 의도 된 동작을 변경할 수 없습니다 이기 때문에 테스트는 코드를 리팩터링 변경 하는 동안 변경 되지 않습니다. 테스트 할 리팩터링을 하는 동안 버그가 발생 하지 않습니다. 따라서 테스트가 없는 경우 보다 훨씬 더 많은 확신을가지고 이러한 변경을 수행할 수 있습니다.

  7. 검사. 단위 테스트는 실행 코드 보다 더 유용 합니다. 테스트에서 사용 된 코드의 어떤 부분을 발견할 수 있습니다.

  8. 외부 리소스에서 유닛을 분리할. 일반적으로 DLL은 다른 Dll, 데이터베이스 또는 원격 하위 시스템 등 개발 중인 시스템의 다른 구성 요소에 따라 다릅니다. 종속성에서 격리 된 상태에서 각 단위 테스트는 유용 합니다. 외부 구성 요소는 느리게 실행 되는 테스트를 만들 수 있습니다. 개발 하는 동안 다른 구성 완료 수 있습니다.

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

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

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

    Native Test Project단위 테스트 프로젝트 템플릿 선택

    이 연습에서는 테스트 프로젝트 이름은 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 외부에 표시 되도록 클래스의 공용 및 보호 된 멤버를 사용 하면 됩니다. 자세한 내용은 C++ 클래스에서 dllimport 및 dllexport 사용을 참조하십시오.

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

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

DLL 프로젝트에 테스트 프로젝트 연결

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

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

      C++ 프로젝트 속성 - 프레임워크 및 참조
    2. 새 참조 추가를 선택합니다.

      참조 추가 대화 상자에서 프로젝트 탭을 선택합니다.

      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. 함수 시작 부분에 위치 중단점을 설정합니다.

    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과 데이터베이스 같은 다른 하위 시스템에 따라 다릅니다. 이러한 구성 요소는 동시에 종종 개발 됩니다. 단위 테스트를 다른 구성 요소로 사용할 수 없습니다 동안 수행할 수 있도록 모의 대체 해야 합니다.

  • 확인 테스트(BVT, Build Verification Test)를 빌드합니다. 설정 된 간격에 팀 빌드 서버에서 수행 되는 테스트를 할 수 있습니다. 이렇게 하면 여러 팀 멤버의 작업은 통합 버그가 도입합니다.

  • 테스트를 체크 인 합니다. 각 팀 멤버는 코드를 소스 제어에 검사 전에 일부 테스트 수행 요구 수 있습니다. 일반적으로 전체 빌드 확인 테스트 집합의 하위 집합입니다.

    최소 수준의 코드 검사도 요구 수 있습니다.

표시: