2011년 6월 13일 월요일

테스트 지향 프로그래밍 with JUnit - 1

Ch 1 Start Unit Test
단위 테스트란
- 테스트 대상이 되는 코드 기능의 아주 작은 특정 영역을 실행해 보는, 개발자가 작성한 코드 조각이다.
- 어떤 코드 조각이 개발자가 생각한 대로 동작하는지 증명하기 위해 수행하는 것이다.

단위 테스트의 지침
- 코드 자체를 작성하기 전에 문제가 되는 메서드를 테스트할 방법을 결정
- 테스트 코드를 기능 구현 코드보다 먼저 작성하거나 동시에 작성한다.

테스트 코드의 요소
- 테스트에 필요한 모든 조건과 상황을 준비 설정한다.(필요한 객체를 모두 생성하기, 필요한 자원을 모두 할당하기 등)
- 테스트 대상이 되는 메서드를 호출한다.
- 테스트 대상이 되는 메서드가 원하는 대로 동작한다는 것을 검증한다.
- 실행이 끝나고 다른 코드에 영향이 없게 정리 작업을 한다.

아주 간단한 단위테스트
메서드 조건
1. 주어진 int배열에서 가장 큰 값을 리턴한다.
2. Message Parameter가 Null이거나 int 배열의 Size가 0일 때 RuntimeException을 발생한다.

대상코드(GetlargeInt.java)
package cha2;
public class GetlargeInt {
public GetlargeInt() {
}
public int getMaxInt(int[] intArry) {
if(intArry == null || intArry.length == 0)
throw new RuntimeException("Message Parameter is null or size 0");
int a = 0;
int b = 0;
for(int i = 0; i < intArry.length; i++ ) {
if(i==0)
a = intArry[i];
if(i!=0 && a < intArry[i])
a = intArry[i];
}
return a;
}
}


Test Case(GetlargeIntTest.java)
package cha2;
import junit.framework.TestCase;
public class GetlargeIntTest extends TestCase {
GetlargeInt tester = new GetlargeInt();
public static void main(String[] args) {
}
public void testGetMaxInt() {
assertEquals(9, tester.getMaxInt(new int[]{0,1,9}));
assertEquals(9, tester.getMaxInt(new int[]{-10,9,8}));
}
public void testNull() {
try {
assertEquals(9, tester.getMaxInt(null));
fail("이값은 Exception 발생합니다.");
} catch (RuntimeException e) {
assertTrue(true);
}
}
}


Test Suite(AllTest.java)
package cha2;
import junit.framework.Test;
import junit.framework.TestSuite;
public class AllTests {
public static void main(String[] args) {
junit.awtui.TestRunner.run(AllTests.class);
}
public static Test suite() {
TestSuite suite = new TestSuite("Test for cha2");
//$JUnit-BEGIN$
suite.addTestSuite(GetlargeIntTest.class);
//$JUnit-END$
return suite;
}
}


Junit의 assert Method
  • assertEquals(String Message, expected, actual, tolerance) : 동일성 테스트 메서드

- Message : 테스트가 실패할 경우 출력될 메시지
- expected : 기대하는 값
- actual : 테스트 대상이 되는 코드에서 리턴된 값
- tolerance : 실수형를 비교하는 메서드에서 오차 한계 지정값
  • assertNull, assertNotNull(String Message, Object object) : object가 null 값인지 아닌지
  • assertNotSame, assertSame(String Message, expected, actual) : expected 와 actual이 같은 객체를 참조하는 지 판단
  • assertFalse, assertTrue(String Message, boolean condition) : boolean 조건의 거짓, 참를 판정한다.
  • fail(String Message) : 테스트를 실패 처리한다.


테스트별 설정 메서드
  • protected void setup() : 각 test 메서드들이 실행되기 전에 호출된다.
  • protected void teardown() : 각각의 test 메서드들이 실행되고 난 다음에 호출된다.


Test의 6가지 영역
  1. Right – 결과가 옳은가? : 유효성 검사
  2. B – 모든 경계(boundary) 조건이 Correct한가? : 경계조건(boundary condition)을 밝혀내는 것은 단위 테스트에서 가장 중요한 부분 중 하나다. 대부분의 버그가 보통 “경계”에 서식하기 때문이다. 다음은 경계 조건을 테스트할 때 유념할 부분이다.(이 부분은 나중에 더 자세히 알아보게 될 것이다..)
    • 형식일치 : 값의 형식이 기대한 형식과 일치하는가?
    • 순서 : 적절한 순서대로 되어 있거나 그렇지 않은 값인가?
    • 범위 : 적당한 최소값과 최대값 사이에 있는 값인가?
    • 참조 : 코드가 자기가 직접 제어하기 않는 외부 코드를 참조하는가?
    • 존재성 : 값이 존재하는가?
    • 개체 수 : 확실히 충분한 값이 존재하는가?
    • 시간 : 모든 것이 순서대로 일어나는가? 제시간에? 때맞추어?
  1. I – 역(inverse)관계를 확인할 수 있는가? : 몇몇 메서드는 논리적 역(inverse)을 적용하여 검증해야 한다.
  2. C – 다른 수단을 사용해서 결과를 교차확인(cross-check)할 수 있는가?
  3. E – 에러 조건(error condition)을 강제로 만들어 낼 수 있는가?
  4. P – 성능(performance) 특성이 한도 내에 있는가?

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...