2017-09-22 1 views
3

이의이 최소한의 작업 예제를 시작하자 범위 보고서에서 자동으로 생성 된 예외 코드를 제거
MAIN.CPP :

[g++/clang++] -std=c++11 -g -Og --coverage -Wall -o main main.cpp 

: 나는 다음과 같은 플래그를 사용하여이 코드를 컴파일

#include <iostream> 
#include <string> 

int main() { 
    std::cout << "hello " + std::to_string(42); 
    return 0; 
} 

clang 4.0.1
gcc 4.8.5.

컴파일러는 in another stackoverflow question과 같이 실행되지 않는 예외 코드를 생성하기 때문에 코드 적용 범위가 50 % 밖에되지 않습니다.

-fno-exceptions을 통해 예외를 비활성화하는 것은 나를위한 옵션이 아닙니다. 내가 사용하는 단위 테스트를 작성하는 코드는 예외를 사용하므로 모든 옵션을 사용할 수 없습니다.

리포트를 생성하기 위해 나는 gcovr을 사용하고 있습니다. clang ++의 경우에는 변환하려면 llvm-cov gcov이 필요합니다. 그러나 나는 이러한 도구에 구속되지 않습니다. 따라서이 동작을 보여주지 않는 다른 도구가 있다면 제안하십시오!

기본적으로이 코드의 단위 테스트를 컴파일/작성하고 예외가 활성화 된 상태에서 100 % 분기/조건부 적용 범위를 얻는 방법이 필요합니다. 방법이 있습니까? 당신이 기억이 없을 때 bad_alloc가 발생 -

답변

1

글쎄, 난

입력하신 코드에서 예외가 발생합니다 ... 당신의 의도가 실제로 코드의 작은 조각을 테스트하지만, 프로젝트의 개념을 사용하지 믿습니다 std::to_string으로 생성 될 문자열을 저장하기 위해 남겨 둡니다. 100 % 안전하려면 std::to_string을 예외로 처리 할 수있는 try-catch으로 묶어야합니다.

100 % 코드 커버리지 단위 테스트를 작성하려면 예외가 발생해야합니다.이 특정 경우에는 매개 변수가 상수이기 때문에 보장하기가 거의 불가능합니다. 그러나 프로젝트에서 할당 할 데이터의 크기가 가변적 인 경우가 있습니다.이 경우 메모리를 할당하는 메서드를 코드에서 분리하여 별도로 테스트 할 수 있습니다. 그런 다음 테스트 함수에서 catch 블록에 무엇을 넣었는지 평가하기 위해 할당 할 엄청난 양의 메서드를 전달합니다 (제대로 처리하는지 확인). 모든 bad_alloc 예외를 처리하지 않을 경우, 그러나

// bad_alloc.cpp 
// compile with: /EHsc 
#include<new> 
#include<iostream> 
using namespace std; 

int main() { 
    char* ptr; 
    try { 
     ptr = new char[(~unsigned int((int)0)/2) - 1]; 
     delete[] ptr; 
    } 
    catch(bad_alloc &ba) { 
     cout << ba.what() << endl; 
    } 
} 

을 (또는 :

예를 들어,이 코드는 테스트를 만들 때 자신을 격려하는 데 사용할 수, (source를) 예외를 던져해야 절대적으로 모든 예외)를 100 % 적용 할 수있는 방법이 없습니다. 100 % 적용되지 않기 때문에 대부분의 경우, true 100 % 적용은 불필요합니다.