Download VCard

© 최병일 1981-‘10

테스트와 장인 - 10

작성자 : yagur rev : 2


테스트 항해(Test Nevigation)

 먼 곳으로 항해하는 배가 풍파를 만나지 않고 조용히만 갈 수 는 없다. 풍파는 언제나 전진하는 자의 벗이다.
- 니체

 항해의 주 목표는 목표 지점에 정확히 안전하게 가는 것이지만, 좋은 위치 측량없이는 힘들다. '명세에 맞는 결함이 적은 코드 생산'을 목표 지점으로하는 항해를 하기 위해선 위치 측정이 중요하다. 육분의는 현재 위치를 측정할수 있는 좋은 도구이다.


 프로그램을 작성하면서 코드의 결함도를 측정하는 행위는 단위테스트이다. 이는 프로그램이 시간의 흐름에 따라 점진적으로 크기가 커질때 그 신뢰도(완성도)가 어느 위치에 있는지 알려주기때문에, 항해의 육분의와 유사하다. 항해에 GPS가 마련되있으니 육분의 사용이 필요 없는 팀이나 개인은 손으로 꼽을수 있을것이라 생각한다. 대부분은 덜 명확한 지도(명세, 달성 목표, 설계)를 보고 목표를 향해 항해할것이다.

        GPS로 위치를 정확히 알수만 있다면,              하지만 현실은 추정으로 이루어진 지도와 육분의뿐이다.

 GPS를 사용할수 없어서, 육분의로 항해하는 배는 삼각측량법을 사용한다. 이를 위해 항해사는 세개의 육분의를 사용한다. 그 이유는 육분의의 오차때문이다. 측정오차는 0.5′(분; 1°= 60")정도라고 한다. 짧은 거리(작은 소프트웨어)를 항해할때는 하나의 육분의로도 목표에 근접할수 있겠지만, 먼 거리를 항해할때 오차는 목표로부터 꾀 먼거리에 도달하게 만든다. 측정 반복 과정이 짧다고 가정했을때, 최악의 경우는 측정 반복 횟수와 시간의 증가에 따라 오차 최대치가 누적될것이다.
 하나의 육분의로 측정할때, 그리고 두개로 측정할때는 다르다. 두개로 측정할때는 두 결과물을 놓고 비교하기 때문에, 좀더 정확한 위치에 가까워지거나, 어느 육분의에 오류가 있는지 알아낼 확률이 높아진다. 세개가 있을때는 말할것 없이 두개보다 측정값이 더 정확해질 확률이 높다.
 테스팅의 세계로 돌아와 보자. 한개의 검증이 존재하는 단위테스트를 패스한 테스트 대상이 오동작활 확률을 50%로 가정한다면, 두개가 존재할때는 25%, 세개가 존재할때는 12.5%가 될것이다. 물론 코드 테스팅은 논리의 구현를 검증하는 행위이기 때문에 물리적인 측량과는 다르다.

아래는 절대값을 구하는 작위적인 테스트이다.
int abs(int i)
{
   return -i;
}

TEST(abs)
{
    FAIL_IF(abs(-1) != 1);
}
 단위 테스트안에 하나의 검증이 존재할때의 상황이다. abs(1)이 들어간다면 어떠할까. 테스트를 통과해 신뢰성이 높아졌다고 생각했던 abs가 당신을 배신했다.

int abs(int i)
{
   return -i;
}

TEST(abs)
{
    FAIL_IF(abs(-1) != 1);
    FAIL_IF(abs(1) != 1);
}
이제 빨간막대를 볼수 있다.

int abs(int i)
{
   if(i < 0)
       return -i;
   return i;
}
 이것이 녹색막대를 보여주는 절대값 함수이다. CC(CyclomaticComplexity)는 2이다. CC가 증가함에 따라 오류를 낮추기 위해 검증 횟수 역시 증가된것을 볼수있다. 위의 예는 반대 순서로 흘렀지만, 다른 길이가 길어진 프로시저들의 CC가 증가하면 그것을 검증하는 비용을 역시 증가한다.

Carnegie Mellon의 CC표.(Edmond VanDoren, Kaman Sciences, Colorado Springs)
  Cyclomatic Complexity   Risk Evaluation
  1 - 10  a simple program, without much risk
  11 - 20  more complex, moderate risk
  21-  50  complex, high risk program
  > 50  untestable program (very high risk)

 오차 확률이 누적되 항로가 많이 달라졌더라도, 적당한수의 육분의가 있다면 항로를 원래 항로로 맞출 확률은 더 높아진다. 그렇다고 모든 경우에 삼각측량법을 사용하란것은 아니다. 하지만 무의식중에 자주쓰고있는 방법임은 분명하다.

 개발자 테스트는 "깨끗한 테스트"가 되기 쉽다. - Boris Beizer 1994

  하지만 우연적인 방법에서 한단계 올라가자면 의도적으로 삼각측량법을 쓰는것이다. 테스트를 우연에 맞기겠는가? 아니면 의도적으로 오류검출 확률을 높히겠는가? 테스트는 부시기 위한 테스트인가? 아니면 통과하기 위한 테스트인가? 의도적으로 방법을 쓰지 않았다면 이 질문에 대해 생각해보는것이 시간낭비가 되진 않을것이다.

 나는 어떤 계산을 어떻게 해야 올바르게 추상화할 것인지에 대해 정말 감잡기 어려울 때만 삼각측량을 사용한다.
- Kent Beck(테스트 주도 개발중)

 나의 경우엔 처음 테스팅을 시작할때, 명백해 보이는 것들도 빨간막대를 보이는 경우가 많았다. 삼각측량법으로 접근하고, 추상화되거나 의미 없는 테스트가 되었을땐 삼각측량법으로 인해 증가한 검증들을 과감히 삭제해도 좋다. 하지만 저들이 검증에 도움이 되보이는 경우가 많다 생각하여, 보통의 경우 삭제하지 않는다. 그 명백함을 지니는것으로 보이는 함수의 구현이 변경될때를 대비해서이다. 모든 테스트가 수식으로만 이루어진 함수를 대상으로 하지 않는다는 것을 생각해보면 된다.
 목표에 좀더 정확히 다가가기 위해서는, 현재 위치가 중요하다. 풍랑과 같은 예측 불가한 위험은 항로를 이탈하게 만든다. 작은 검증 추가(삼각측량법)가 예측 불가한 위험으로부터 항해를 지켜줄것이다.

'개발 > 수필' 카테고리의 다른 글

테스트와 장인 - 10  (0) 2008/09/30
테스트와 장인 - 9  (0) 2008/07/12
객체 지향 소프트웨어 일주 - 5  (0) 2008/05/18
객체 지향 소프트웨어 일주 - 4  (0) 2008/05/08
객체 지향 소프트웨어 일주 - 3  (0) 2008/03/28
테스트와 장인 - 8  (0) 2008/03/19
Comment 0 Trackback 0

Trackback : http://yagur.impon.net/trackback/145 관련글 쓰기

Top

prev 1 2 3 4 5 6 7 8 9 ... 81 next