2010-05-07 2 views
2

C++/CLI 코드가 있고 Visual Studio 2008 Team Suite 코드 커버리지를 사용하고 있습니다.C++/CLI의 return 문 일부분 적용

코드 헤더 :

// Library.h 

#pragma once 

#include <string> 

using namespace System; 

namespace Library 
{ 
    public ref class MyClass 
    { 
    public: 
    static void MyFoo(); 
    static std::string Foo(); 
    }; 
} 

코드 구현 :

#include "Library.h" 

using namespace Library; 
using namespace System; 

void MyClass::MyFoo() 
{ 
Foo(); 
} 

std::string MyClass::Foo() 
{ 
return std::string(); 
} 

나는 C#을 단위 테스트를, MyClass.MyFoo() 호출 어떤 이유로

[TestMethod] 
public void TestMethod1() 
{ 
    Library.MyClass.MyFoo(); 
} 

을, 나는 돈 MyClass에 대한 전체 코드 보장을받지 못했습니다. Foo() 메서드에는 3 개의 블록과 5 개의 블록이 있습니다. 닫는 중괄호 (})는 주황색으로 표시되어 부분적으로 덮여 있습니다. 나는 완전히 덮지 않고 부분적으로 덮는 이유를 모른다. 이것이 나의 질문이다.

MyClass Code Coverage Print Screen http://img217.imageshack.us/img217/7664/myclasscoverage.png

UPDATE

다른 예 :

헤더 :

// Library.h 

#pragma once 

using namespace System; 

namespace Library 
{ 
    struct MyStruct 
    { 
     int _number; 
    }; 

    public ref class MyClass 
    { 
    public: 
     static void MyFoo(); 
     static MyStruct* Foo(); 
    }; 
} 

구현 :

#include "Library.h" 

using namespace Library; 
using namespace System; 

void MyClass::MyFoo() 
{ 
    delete Foo(); 
} 

MyStruct* MyClass::Foo() 
{ 
    return new MyStruct(); 
} 
01,

나는 Foo의 return 성명에서 여전히 같은 누락 된 적용 범위를 얻고 있습니다.

답변

2

함수가 정상적으로 처리되지 않고 종료되는 경우는 다루지 않습니다. 물론 길이가 0 인 std::string을 만들 수 없다면 프로그램이 복구하기에는 너무 어려울 지 모르지만 코드 적용 범위 분석의 범위를 벗어나는 것으로 판단 할 수 있습니다.

편집 : 적용 범위를 향상 시키려면 테스트 사례에서 설정할 수있는 일부 글로벌 플래그 (또는 더 유연하게 N 번째 할당에 실패 함)에 따라 실패한 글로벌 operator new을 조롱 할 수 있습니다.

int allocation_failure = 0; 
void* operator new(size_t requestedbytes) 
{ 
    if (allocation_failure) { 
     if (!--allocation_failure) { 
      throw std::bad_alloc(); 
     } 
    } 
    void* retval = malloc(requestedBytes); 
    if (!retval) { 
     throw std::bad_alloc(); 
    } 
    return retval; 
} 

void operator delete(void* p) 
{ 
    if (p) free(p); 
} 

또는 당신은 조건부 코드를 통해 모든 가능한 경로를 행사할 수있는 특정 크기 또는 특정 크기 등의 N 번째 할당의 할당을 실패 할 수 있습니다.

+0

내가 준 두 번째 사례를 살펴보십시오. std :: string은 사용하지 않습니다. – brickner

+2

'new'를 사용하면 예외를 throw하여 실패 할 수 있습니다. 테스트 케이스가 예외적 인 경로를 다루지 않습니다. –

+0

나는 의심 스럽지만 당신이 옳았다. 제 2의 예와 비슷한 코드를 작성하여 예외를 던지도록 완전히 관리했습니다. std :: string을 반환하는 것을 완전히 커버 할 수는 없지만 가능한 모든 장소에서 예외를 throw하는 데 어려움을 겪고있는 것처럼 보입니다. 감사합니다. – brickner

1

:

릴리스 빌드가 아닌 디버그 빌드에 대해 코드 커버리지를 수집하는 시도 [전체 공개 나는 VS에서 코드 검사 도구를 만들 수 있습니다 팀에있어].

컴파일러는 특정 최적화/변환이 적용된 후에 실제로 도달 할 수없는 IL을 방출 할 수 있습니다. 이 경우인지를 확인하는 가장 쉬운 방법은 ildasm 또는 Reflector로 일리노이를 관찰하는 것입니다. 예를 들어 here을 참조하십시오.

+0

호기심에서 벗어났습니다. (여기에 :-P가 있기 때문에) Microsoft는 어느 시점에서 네이티브 C++에 대한 테스트 및 적용 범위 분석을 지원할 예정인지 알고 있습니까? 우리는 C++ 개발자들이 종종 추위에 빠져들고 새로운 Visual Studio 기능이 .NET 전용이라는 것을 느낍니다. (물론, 원시 코드 프로파일 러는 아주 훌륭합니다.) –

+0

툴을 사용하여 원시 코드를 더 잘 지원해야한다는 의견에 대해 많은 피드백을 얻었습니다. 미래의 네이티브 테스트 (다른 ​​팀)에 대해서는 말할 수 없지만 VS2005 이후 (코드 작성기와 같은) 원시 코드에 대한 코드 커버리지는 작동했습니다. 경험은 매니지먼트만큼이나 세련된 것은 아니지만 기능성이 있습니다. 자세한 내용은 http://blogs.msdn.com/ms_joc/archive/2005/10/04/477166.aspx를 참조하십시오. –

+0

@Chris : 링크에 대해 감사드립니다. 나는 이것이 가능한 기능인지 전혀 몰랐다. Visual Studio GUI에서 네이티브 코드 커버리지가 지원되는 것을 결코 상상할 수 없습니다. 빌트인 하이라이팅 지원의 부족은 실망 스럽지만 커버리지 메트릭 + XML 포맷 출력 = 큰 플러스. 굉장해. –