2013-11-10 2 views
3

프로그램을 작성하는 경우 일반적으로 모든 경로가 포함되도록 프로그램을 실행할 수 있습니다. 따라서 100 % 적용 범위는 쉽게 구할 수 있습니다 (현대 컴파일러가 어쨌든 잡는 실행 불가능한 코드 경로를 무시함).데이터 흐름 범위

그러나 코드 범위가 100 %이면 모든 변수 정의 사용 범위도 달성해야 함을 의미해야합니다. 변수가 프로그램 내에서 정의되어이 변수 내에서 사용되기 때문입니다. 모든 코드가 다루어지면, 모든 DU 쌍도 보상해야합니다.

그렇다면 왜 경로 도달 범위는 더 쉽게 얻을 수 있다고하지만, 데이터 흐름 범위는 일반적으로 100 %를 달성 할 수 없습니다. 나는 왜 안 이해하지 못하니? 그 예가 무엇입니까?

답변

4

가능한 모든 입력 집합이 매우 크거나 실질적으로 무제한 일 수 있기 때문에 100 % 코드 적용 범위를 달성하는 것이 더 쉽습니다. 모두 테스트하는 데 너무 많은 시간이 걸립니다. 간단한 예를 들어 기능에

살펴 보자 :

double invert(double x) { 
    return 1.0/x; 
} 

단위 테스트는 다음과 같이 수있는 것 :

double y = invert(5); 
double expected = 1.0/5.0; 
EXPECT_EQ(expected, y); 

이 테스트는 100 %의 코드 커버리지를 달성 할 수있다. 그러나, 1.8446744e + 19 개의 가능한 입력에서 단지 1입니다 (두 배가 64 비트 폭이라고 가정).

뒤에있는 아이디어 All-pairs Testing은 모든 가능한 입력을 테스트하는 것이 현실적이지 않기 때문에 모든 사례를 포괄 할 수있는 범위를 식별해야합니다.

invert() 기능을 사용하면 {0이 아닌 값}과 {0}의 두 세트 이상이 중요합니다.

우리는 같은 코드 경로를 다룹 다른 테스트를 추가해야하지만 다른 결과를 가지고 테스트 작가가 전체 데이터를 달성하기 위해 매개 변수의 다른 가능한 세트를 설계해야하기 때문에, 또한

EXPECT_THROWS(invert(0.0)); 

을 테스트에 적용 범위를 입력하면 올바른 세트가 무엇인지 알 수 없습니다.

이 기능을 고려해

double multiply(double x, double y); 

내 본능이 오버 플로우를 테스트하는 작은 숫자와 큰 숫자에 대한 서로에 대한 테스트를 작성하는 것입니다.

그러나, 개발자는이 방법으로, 가난을 작성한 수

double multiply(double x, double y) { 
    if(x==0) return 0; 
    return 1.0/((1.0/x) * (1.0/y)); 
} 

우리의 시험은 우리가 버그를 놓칠 것, y를 0을 사용하지 않은 경우. 알고리즘을 설계하는 방법에 대한 지식은 단위 테스트의 적절한 입력을 이해하는 데 매우 중요합니다. 따라서 코드를 작성하는 프로그래머는 단위 테스트에 참여해야합니다.