출처: http://www.naturalsoftware.jp/blog/4271 http://www.naturalsoftware.jp/blog/4611

번역: 최흥배

 

Visual Studio 2012에서는 아래의 3개의 유닛테스트 프로젝트가 추가되었다.

  • C++/CLI(.NET) 유닛테스트 프로젝트
  • C++/CX(Windows 스토어 ) 유닛테스트 프로젝트
  • C++(Native) 유닛테스트 프로젝트


여기서는 C++ 유닛테스트를 소개한다.

1. 테스트 대상 프로젝트를 만든다. 여기서는「Win32 콘솔 애플리케이션」으로「NativeLibrary」라는 프로젝트 이름으로 한다.

2. 애플리케이션 종류를 '스테틱 라이브러리' 하고 완료 한다.

 

3. 다음으로 같은 솔류션에 '기본 유닛테스트 프로젝트' 만든다.

4. 솔루션에 테스트 대상 라이브러리 NativeLibrary」와 테스트 프로젝트 NativeLibraryTest2개가 만들어졌다.

 

5. 상태에서 한번 빌드 해본다. 테스트 탐색기에 ' 실행 테스트' 추가되었다. 테스트 탐색기가 표시되지 않은 경우는 메뉴의 '테스트 | 윈도우 | 테스트 탐색기' 표시한다.

6. 이번에는 '테스트 탐색기' 왼쪽 위에 있는 버튼을 눌러서 '리빌드' 해본다. 빌드 종료와 같이 테스트가 실행된다.

7. 테스트 이름을 바꾸어본다. 테스트 이름은 한국어를 사용해본다. 빌드하면 테스트 탐색기쪽에 메소드 이름이 바뀐다.

8. 실제 테스트 대상으로 하는 클래스를 만들어본다. NativeLibrary 프로젝트의 '추가' 클래스를 추가한다.

 

9. Calc 이라는 이름을 붙인 클래스를 만든다.

 

10. 더하기 계산 멤버 함수를 만든다. 먼저 구현은 하지 않는다.

 

11. NativeLibraryTest 프로젝트 속성을 열고, C++ 「추가 포함 디렉토리」에 $(SolutionDir」을 추가한다.

12. 계속해서 「공통 속석」의 「새로운 참조 추가」를 누른다.

 

13. 테스트 대상 NativeLibrary 프로젝트가 표시 되므로 체크를 넣어서 OK」를 누른다.

14. 참조에 NativeLibrary」가 추가된 것을 확인한다.

 

15. 이것으로 테스트 준비가 끝났으므로 NativeLibraryTest 프로젝트에 테스트 코드를 쓴다. 테스트 대상을 구현하지 않았으므로 테스트는 실패한다.

16. 테스트 대상을 구현한다. 테스트는 성공.

 

이것으로 네이티브 C++ 에서 단위 테스트는 끝이다. C# 같이 메소드나 클래스의 동적 생성, 리팩토링과 같은 기능은 없으므로 조금 시간이 걸린다.

 

 

 

 

 

 

 

 

Visual Studio 2012 네이티브 C++ 유닛테스트에서 아래와 비슷한 클래스간의 테스트를 만든 경우 Asert::AreEqual 에서 다음과 같은 에러가 나온다.

에러 1 error C2676: 이항연산자 '==' : 'const Person' 、이 연산자 또는 정의된 연산자에 적절한 형으로의 변환을 정의하지 않았다.

이것은 Asert::AreEqual == 연산자를 사용하고 있지 않기 때문으로 Person == 연산자를 구현한다.

그러면 이번에는 다른 에러가 나온다.

에러 1 error C2338: Test writer must define specialization of ToString<const Q& q> for your class class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString<class Person>(const class Person &).

모르므로 에러를 더블클릭 해보면 다음의 파일로 이동한다.

에러를 출력하기 위한 함수 템플릿 ToString」이 필요해서 기본적인 형에 대해서는 특별화 되어 있지만 유저 정의현 클래스 등은 특별화 되어 있지 않으므로 static_assert 호출되어 ToString」가 호출되고 있는 같다.

이런 이유로 ToString」을 구현하면 좋을 같다. ToString」는 이름 공간「namespace Microsoft{ namespace VisualStudio {namespace CppUnitTestFramework {」에 구현되어 있으므로 이것에 맞춘다. (Person std::string std::wstring 변환하였다).

 

이것으로 테스트를 실행할 있고 Assert 실패한 경우네는 에러 내용이 표시되도록 되었다.

 

신고
by 흥배 2014.09.15 08:00