다음을 통해 공유


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에는 %\Program Files (x86)\Windows Kits\10\Testing\Development\inc에 있는 프레임워크 WexTestClass.h에 필요한 단일 헤더 파일이 포함되어 있습니다. 여기에는 로거에 대한 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++의 고급 제작 테스트

다음 예제에서는 설치 및 클린up 메서드를 사용하고 테스트 클래스 및 테스트 메서드 선언과 함께 메타데이터를 선언합니다. 이 예제에는 두 가지 테스트 메서드가 있는 단일 클래스(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은 모듈 클린up 함수를 선언합니다. 이 함수는 모든 테스트 후에 실행되고 클래스 클린up 메서드 및 소멸자가 완료된 후에 실행됩니다. 24줄에서 32줄의 클래스에 대해 비슷한 설정 및 클린up 메서드가 있습니다. 이러한 메서드는 클래스 생성자 뒤와 클래스 소멸자 앞에서 각각 실행됩니다.

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

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