다음을 통해 공유


C++에서 테스트 작성

다음 코드 예제에서는 두 개의 테스트 메서드가 있는 단일 테스트 클래스를 포함하는 네이티브 C++ 파일을 보여 줍니다.

1   #include "WexTestClass.h"
2
3   class SimpleTests   {
4      // Declare this class as a TestClass, and supply metadata if necessary.
5      TEST_CLASS(SimpleTests);
6
7      // Declare the tests within this class.
8      TEST_METHOD(FirstTest);
9      TEST_METHOD(SecondTest);
10  };
11
12  void SimpleTests::FirstTest()
13  {
14      VERIFY_ARE_EQUAL(1, 1);
15  }
16
17  void SimpleTests::SecondTest()
18  {
19      VERIFY_IS_TRUE(true);
20  }

줄 1 은 프레임워크에 필요한 단일 헤더 파일인 WexTestClass.h를 포함하고 있으며, 이 파일은 %\Program Files (x86)\Windows Kits\10\Testing\Development\inc에서 찾을 수 있습니다. 이 포함된 헤더 파일에는 로거를 위한 Log.h 파일과 검증 사례를 정의하기 위한 Verify.h 파일도 포함되어 있습니다. 이러한 헤더 파일은 나중에 설명합니다.

줄 3 SimpleTests 테스트 클래스를 정의합니다. 테스트 클래스는 특수 클래스에서 상속할 필요가 없습니다. 또한 해당 콘텐츠는 공개될 필요가 없습니다.

줄 5 이 클래스를 테스트 클래스로 정의합니다.

줄 8과 9 클래스에서 두 개의 테스트 메서드를 선언합니다. FirstTestSecondTest. 12~20줄에 정의됩니다. TEST_METHOD 매크로는 필수 메서드 선언을 클래스에 추가합니다. 이 마크업 체계에서 모든 테스트는 동일한 프로토타입을 가져야 합니다. void반환해야 하며 매개 변수를 사용하지 않아야 합니다.

클래스 선언 내에서 인라인으로 테스트를 정의하려는 경우 전처리기에서 INLINE_TEST_METHOD_MARKUP 정의된 동안 "WexTestClass.h"를 포함하는 한 이 작업을 수행할 수 있습니다.

1   #define INLINE_TEST_METHOD_MARKUP
2   #include "WexTestClass.h"
3
4   class InlineTests
5   {
6       TEST_CLASS(InlineTests);
7 
8       TEST_METHOD(FirstTest)
9       {
10          VERIFY_ARE_EQUAL(1, 1);
11      }
12
13      TEST_METHOD(SecondTest)
14      {
15          VERIFY_IS_TRUE(true);
16      }
17  };

줄 10 및 15 이제 테스트 메서드의 정의가 포함됩니다.

참고 테스트 클래스 선언을 헤더 파일에 배치하는 경우 해당 헤더 파일만 하나의 cpp 파일에 포함하는 것이 가장 좋습니다. 테스트 클래스 선언을 여러 CPP 파일에 포함하면 불필요한 데이터가 테스트 DLL로 컴파일됩니다.

C++에서 고급 제작 테스트

다음 예제에서는 설치 및 정리 메서드를 사용하고 테스트 클래스 및 테스트 메서드 선언과 함께 메타데이터를 선언합니다. 이 예제에는 두 가지 테스트 메서드가 있는 단일 클래스(MetadataAndFixturesTests)도 포함되어 있습니다.

 1  #define INLINE_TEST_METHOD_MARKUP
 2  #include "WexTestClass.h"
 3
 4  BEGIN_MODULE()
 5      MODULE_PROPERTY(L"Feature", L"TAEF")
 6  END_MODULE()
 7
 8  MODULE_SETUP(ModuleSetup)
 9  {
10      return true;
11  }
12
13  MODULE_CLEANUP(ModuleCleanup)
14  {
15      return true;
16  }
17
18  class MetadataAndFixturesTests
19  {
20      BEGIN_TEST_CLASS(MetadataAndFixturesTests)
21          TEST_CLASS_PROPERTY(L"Component", L"Verify")
22      END_TEST_CLASS()
23
24      TEST_CLASS_SETUP(ClassSetup)
25      {
26          return true;
27      }
28
29      TEST_CLASS_CLEANUP(ClassCleanup)
30      {
31          return true;
32      }
33
34      TEST_METHOD_SETUP(TestSetup)
35      {
36          return true;
37      }
38
39      TEST_METHOD_CLEANUP(TestCleanup)
40      {
41          return true;
42      }
43
44      // If you use this syntax, you will have to define the test outside of the test class.
45      BEGIN_TEST_METHOD(FirstTest)
46          TEST_METHOD_PROPERTY(L"Owner", L"Contoso")
47      END_TEST_METHOD()
48
49      // You can still have metadata even if you define your test inside the test class.
50      TEST_METHOD(SecondTest)
51      {
52          BEGIN_TEST_METHOD_PROPERTIES()
53              TEST_METHOD_PROPERTY(L"Owner", L"Contoso")
54          END_TEST_METHOD_PROPERTIES()
55
56          VERIFY_IS_TRUE(true);
57      }
58  };
59
60  void MetadataAndFixturesTests::FirstTest()
61  {
62      VERIFY_ARE_EQUAL(1, 1);
63  }

줄 4 이 헤더가 컴파일되는 테스트 이진 파일에 적용되는 속성 집합인 전역 메타데이터 선언을 시작합니다.

줄 5 에서는 특성 이름을 가진 속성과 TAEF값을 선언합니다. BEGIN... 및 END... 매크로 사이에 단일 이상의 여러 속성이 있을 수 있습니다. 비슷한 속성 선언은 20-24줄(클래스 수준 메타데이터), 45-47(메서드 수준 메타데이터) 및 52-54(인라인으로 정의된 테스트의 테스트 수준 메타데이터)에 있습니다.

줄 45 - 47 및 60 – 63 메타데이터를 추가하기 위한 이러한 테스트 매크로도 테스트 메서드를 선언합니다. 50-57줄 동일한 위치에서 테스트를 선언하고 정의하려는 경우에도 메타데이터를 계속 사용할 수 있음을 보여 줍니다.

줄 8 모듈의 테스트 클래스를 만들기 전에 실행되는 함수인 모듈 설정 함수를 선언합니다.

줄 13 모든 테스트와 클래스 정리 메서드 및 소멸자가 완료된 후 실행되는 함수인 모듈 정리 함수를 선언합니다. 24줄에서 32줄의 클래스에 대해 비슷한 설정 및 정리 메서드가 있습니다. 이러한 메서드는 클래스 생성자 뒤와 클래스 소멸자 앞에서 각각 실행됩니다.

줄 34~42는 테스트 메서드에 대해 유사한 함수를 선언합니다. 테스트 설정 및 정리 메서드는 각 테스트가 실행되기 전과 후에 실행됩니다.

TAEF 설치 및 정리 메서드는 bool을 반환하고 매개 변수를 허용하지 않습니다. 반환 값은 특정 테스트 단위에 대한 테스트를 계속 실행할 수 있는지 여부를 프레임워크에 알릴 수 있습니다. 예를 들어 클래스 설정 메서드가 실패하고 false를 반환하는 경우 프레임워크는 클래스 테스트 메서드를 실행하지 않습니다.