테스트 탐색기를 사용하여 네이티브 코드 단위 테스트
Visual Studio c + +로 작성 된 관리 되지 않는 코드에 대 한 단위 테스트를 만들 수 있습니다.관리 되지 않는 코드를 네이티브 코드로 라고도 합니다.
다음은 시작 하는 필수 정보가 포함 되어 있습니다.이후 섹션에서는 단계에 자세히 설명 하는 연습을 제공 합니다.
DLL에서 관리 되지 않는 코드에 대 한 단위 테스트를 작성 하려면
사용 된 기본 테스트 프로젝트 테스트에 대 한 별도 Visual Studio 프로젝트를 만들려면 템플릿을 합니다.
일부 샘플 테스트 코드를 포함 하는 프로젝트입니다.
DLL 테스트 프로젝트에 액세스할 수 있도록 합니다.
#include.h DLL의 외부에서 액세스할 수 있는 함수 선언을 포함 하는 파일입니다.
.h 파일이 표시 된 함수 선언을 포함 해야 _declspec(dllimport).또는 DEF 파일을 사용 하 여 메서드를 내보낼 수 있습니다.자세한 내용은 가져오기 및 내보내기을 참조하십시오.
단위 테스트에서 테스트 DLL에서 내보낸 함수에만 액세스할 수 있습니다.
DLL 프로젝트에 테스트 프로젝트의 참조를 추가 합니다.
에 속성 테스트 프로젝트의 확장 공용 속성, 프레임 워크 및 참조를 선택 하 고 참조 추가.
테스트 프로젝트에서 테스트 클래스를 만들고 메서드를 다음과 같은 방식으로 테스트 매크로 및 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에 있는 메모를 읽고
테스트 클래스를 중첩할 수 없습니다.
테스트 탐색기를 사용 하 여 테스트를 실행 하려면:
에 보기 메뉴를 선택 기타 Windows, 테스트 탐색기.
Visual Studio 솔루션을 빌드합니다.
테스트 탐색기에서 선택 하 여 를 실행 하는 모든.
모든 테스트를 테스트 탐색기에서 자세히 조사 하는 방법:
오류 메시지 및 스택 추적 같은 자세한 정보를 보려면 테스트 이름을 선택 합니다.
테스트 이름을 테스트 코드를 오류 위치로 이동 합니다 두 번 (예를 들어 클릭)을 엽니다.
테스트에 대 한 바로 가기 메뉴에서 선택 선택한 테스트 디버그 디버거에서 테스트를 실행할 수 있습니다.
연습: 테스트 탐색기로는 관리 되지 않는 DLL 개발
이 연습에서는 자신의 DLL을 개발할 수에 적응할 수 있습니다.주요 단계는 다음과 같습니다.
기본 테스트 프로젝트 만들기.테스트를 별도 프로젝트에서 개발 중인 DLL에서 생성 됩니다.
DLL 프로젝트를 만드는.이 연습에서는 새 DLL을 만들지만 기존 DLL을 테스트 하는 절차와 비슷합니다.
DLL 함수를 테스트 하려면 보이게.
테스트를 반복적으로 보강.개발 코드의 테스트에서 led가 "빨강-녹색-리팩터링" 주기를 하는 것이 좋습니다.
실패 한 테스트 디버깅.디버그 모드에서 테스트를 실행할 수 있습니다.
리팩터링 변경 하지 않으면 테스트.외부 동작은 변경 하지 않고 코드의 구조를 개선 하는 의미를 리팩터링 합니다.성능, 확장성, 코드의 가독성을 향상 시키기 위해 할 수 있습니다.함을 동작을 변경 하는 것 이므로 테스트에 코드를 리팩터링 변경 하는 동안 변경 되지 않습니다.테스트 리팩터링을 하는 동안 버그를 소개 하지 않도록 합니다.따라서 이러한 테스트 하지 않은 경우 보다 훨씬 더 많은 자신감을 변경할 수 있습니다.
검사를 선택.단위 테스트는 더 많은 코드를 실행 하는 경우에 더 유용 합니다.테스트에서 사용 된 코드 부분을 발견할 수 있습니다.
장치 외부 리소스 로부터 격리.일반적으로 DLL 다른 Dll, 데이터베이스 또는 원격 하위 시스템 등 개발 중인 시스템의 다른 구성 요소에 따라 달라 집니다.종속성에서 격리에서 각 단위를 테스트 하는 것이 유용 합니다.외부 구성 요소는 느리게 실행 되는 테스트를 만들 수 있습니다.개발 과정의 다른 구성 요소 완료 수 있습니다.
기본 단위 테스트 프로젝트 만들기
파일 메뉴에서 새로 만들기, 프로젝트를 선택합니다.
대화 상자에서 확장 설치 된, 템플릿, Visual C++, 테스트.
선택 된 기본 테스트 프로젝트 템플릿.
이 연습에서는 테스트 프로젝트 라는 NativeRooterTest.
새 프로젝트를 검사 합니다.unittest1.cpp
다음에 유의하세요:
각 테스트를 사용 하 여 정의 된 TEST_METHOD(YourTestName){...}.
일반적인 함수 시그니처를 작성할 필요가 없습니다.서명 매크로 TEST_METHOD로 만들어집니다.매크로 void를 반환 하는 함수 인스턴스를 생성 합니다.또한 테스트 메서드에 대 한 정보를 반환 하는 정적 함수를 생성 합니다.이 정보는 테스트 탐색기를 메서드를 찾을 수 있습니다.
테스트 메서드 그룹화에 대 한 클래스를 사용 하 여 TEST_CLASS(YourClassName){...}.
테스트를 실행 하면 각 테스트 클래스의 인스턴스가 만들어집니다.테스트 메서드는 임의의 순서로 호출 됩니다.전과 후 각 모듈, 클래스 또는 메서드를 호출 하는 특수 한 메서드를 정의할 수 있습니다.자세한 내용은 를 구성 하는 c + + 테스트.
테스트 테스트 탐색기를 실행 하는 것을 확인 하십시오.
일부 테스트 코드를 삽입 합니다.
TEST_METHOD(TestMethod1) { Assert::AreEqual(1,1); }
여기서는 Assert 클래스는 테스트 메서드에서 결과 확인 하는 데 사용할 수 있는 몇 가지 정적 메서드를 제공 합니다.
에 테스트 메뉴를 선택 실행 , 모든 테스트.
테스트 빌드 및 실행 합니다.
테스트 탐색기가 나타납니다.
테스트에서 나타나는 테스트 통과.
관리 되지 않는 DLL 프로젝트를 만듭니다
만들기는 Visual C++ 를 사용 하 여 프로젝트의 Win32 프로젝트 템플릿.
이 연습에서는 프로젝트 이름이 RootFinder.
선택 DLL 및 심볼 내보내기 Win32 응용 프로그램 마법사에 있습니다.
내보내기 기호 옵션은 내보낸된 메서드를 선언 하는 데 사용할 수 있는 편리한 매크로 생성 합니다.
주 하는.h 파일에서에서 내보낸된 함수를 선언 합니다.
여 자가 __declspec(dllexport) 공용 및 보호 된 멤버 클래스의 외부 DLL 표시 되도록 하면 됩니다.자세한 내용은 Dllimport 및 >dllexport에서 C++ 클래스를 사용합니다.을 참조하십시오.
주.cpp 파일에서 함수에 대 한 최소한의 본문을 추가 합니다.
// Find the square root of a number. double CRootFinder::SquareRoot(double v) { return 0.0; }
두 테스트 프로젝트의 DLL 프로젝트
DLL 프로젝트에 테스트 프로젝트의 프로젝트 참조를 추가 합니다.
테스트 프로젝트의 속성을 열고 선택 공용 속성, 프레임 워크 및 참조.
선택 새 참조 추가.
에 참조 추가 대화 상자에서 DLL 프로젝트를 선택 하 고 선택 추가.
주 단위 테스트.cpp 파일을에 DLL 코드의.h 파일을 다음과 같습니다.
#include "..\RootFinder\RootFinder.h"
내보낸된 함수를 사용 하는 기본 테스트를 추가 합니다.
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()); }
솔루션을 빌드합니다.
새 테스트 테스트 탐색기에 나타납니다.
테스트 탐색기에서 선택 하 여 를 실행 하는 모든.
테스트 및 코드 프로젝트를 설정 하 고 함수에서 코드 프로젝트를 실행 하는 테스트를 실행 하는 확인 했습니다.이제 실제 테스트 및 코드를 쓸 수 있습니다.
반복적으로 테스트를 보강 하 고 전달 하 게
새 테스트를 추가 합니다.
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); } }
팁
통과 된 테스트를 변경 하지 않는 것이 좋습니다.대신 새 테스트 추가, 테스트에 통과 하도록 코드를 업데이트 하 고 다음 다른 테스트를 추가 등.
사용자가 자신의 요구 사항이 변경 되 면 더 이상 정확한 지 테스트를 비활성화 합니다.새 테스트를 작성 하 고 한 번에 하나씩 같은 증분 방식으로 작동 하 게 합니다.
솔루션을 빌드하고 테스트 탐색기에서 선택한 를 실행 하는 모든.
새 테스트가 실패합니다.
팁
즉시 작성 한 후 각 테스트가 실패 하는지 확인 합니다.절대로 실패 하는 테스트를 작성 하기 쉬운 실수를 피할 수 있습니다.
새 테스트를 통과할 수 있도록 테스트 대상 코드를 향상 시킵니다.
#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; }
솔루션을 빌드하고 테스트 탐색기에서 선택한 를 실행 하는 모든.
테스트를 모두 통과합니다.
팁
한 번에 하나의 테스트를 추가 하 여 코드를 개발 합니다.모든 테스트의 각 반복 후 전달 해야 합니다.
실패 한 테스트를 디버깅 합니다.
다른 테스트를 추가 합니다.
#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()); } } }
솔루션을 빌드하고 선택 를 실행 하는 모든.
열 (또는 두 번 클릭) 테스트가 실패 합니다.
실패 한 어설션이 강조 표시 됩니다.오류 메시지 테스트 탐색기의 세부 정보 창에 표시 됩니다.
함수를 단계별로 실행할 테스트에 실패 이유를 확인 하려면:
SquareRoot 함수 시작에 중단점을 설정 합니다.
실패 한 테스트의 바로 가기 메뉴에서 선택 선택한 테스트 디버그.
중단점에서 실행이 중지 되 면 코드를 단계별로 실행 합니다.
개발 중인 함수에 코드를 삽입 합니다.
#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"); }
이제 모든 테스트를 통과 합니다.
테스트를 변경 하지 않고 코드 리팩터링
중앙 계산 SquareRoot 함수에 간단 하 게 합니다.
// old code: // result = result - (result*result - v)/(2*result); // new code: result = (result + v/result)/2.0;
솔루션을 빌드하고 선택 를 실행 하는 모든오류가 발생 하지 않았는지 확인 합니다.
팁
좋은 집합을 단위 테스트 코드를 변경 하는 경우 버그를 도입 해야 자신감을 얻을 수 있습니다.
다른 변경 내용을 별도 리팩터링 유지 합니다.
다음 단계
격리성 대부분의 Dll 다른 Dll 및 데이터베이스와 같은 다른 하위 시스템에 따라 달라 집니다.이러한 구성 요소는 종종 병렬로 개발 됩니다.단위 테스트의 다른 구성 요소를 아직 사용할 수 없는 동안 수행 될 수 있도록 모의 대체 해야 하거나
빌드 확인 테스트 합니다. 팀의 빌드 서버가 설정 된 간격으로 수행 하는 테스트를 할 수 있습니다.이렇게 하면 여러 팀 멤버의 작업을 통합 되 면 버그 도입 되었습니다.
테스트를 체크 인 합니다. 소스 제어로 각 팀 멤버가 코드를 확인 하기 전에 몇 가지 테스트를 수행할 수 있도록 라 만들어 질 수 있습니다.일반적으로이 빌드 확인 테스트의 전체 집합의 하위 집합입니다.
최소 수준의 코드 검사 라 만들어 질 수도 있습니다.
참고 항목
작업
Walkthrough: Creating and Using a Dynamic Link Library (C++)