2008년 9월 7일 일요일

JUnit 연습하기1

JUnit 연습하기1 [Junit]

사용한 예제는 이클립스 에서 작성한것이다.(자니메드인가? Version: 3.4.0 Build id: I20080617-2000)



Largest 메소드를 작성.



초기 작성
public class Largest {
/**
* 목록에서 가장큰수를 반환한다.
*
* @param list 정수목록
* @return 주어진 목록에서 가장큰수
*/
public static int largest(int[] list){
int index, max= Integer.MAX_VALUE;
for (index = 0; index if(list[index]>max){
max= list[index];
}
}
return max;
}
}



Largest 메소드 테스트 Junit 3과 4버전의 경우 import 부분만 과 상속받는 부분만 다를분 다른부분은 동일하다.

4를 기준으로 작성하도록하겠다.



Junit 초기 작성

junit 3 일경우

import junit.framework.TestCase;

public class LargestTest_J3 extends TestCase {

public void testLargest() {
assertEquals(9,Largest.largest(new int[] {7,9,8}));
}

}



JUnit 4일경우



import static org.junit.Assert.*;

import org.junit.Test;


public class LargestTest {

@Test
public void testLargest() {
assertEquals(9,Largest.largest(new int[] {7,9,8}));
}

}


실행할경우 에러 발생. 예상결과 9대신 2147483647이 나온다.



이 문제를 해결하기 위해서는 max= Integer.MAX_VALUE 요놈을 수정해야 한다.

이것을 max=0 으로 변경한다.

max를 초기화 해서 입력의 어떤 값이 바로 다음 최대값이 되기를 원한다.



수정1

public class Largest {
/**
* 목록에서 가장큰수를 반환한다.
*
* @param list 정수목록
* @return 주어진 목록에서 가장큰수
*/
public static int largest(int[] list){
int index, max= 0;
for (index = 0; index if(list[index]>max){
max= list[index];
}
}
return max;
}
}



JUnit을 다시 실행한다. 정상적으로 Pass 되는것을 볼수있다.


하지만 아래의 테스트를 수행하면 실패하는 것을 볼수 있을 것이다.



Junit 수정1

import static org.junit.Assert.*;

import org.junit.Test;


public class LargestTest {

@Test
public void testLargest() {
assertEquals(9,Largest.largest(new int[] {7,9,8}));
assertEquals(9,Largest.largest(new int[] {9,7,8}));
assertEquals(9,Largest.largest(new int[] {7,8,9}));

}
}


왜 가장큰수가 8로 나왔을까? 결과를 보면 테스트가 배열의 마지막 원소를 무시해서 나타난것이다.

예상결과는 9인데 실제결과는 8이 나와서 나타나는 결과이다.


for (index = 0; index
이부분이 문제이다.

이것을 아래와 같이 바꾼다.

수정2

public class Largest {
/**
* 목록에서 가장큰수를 반환한다.
*
* @param list 정수목록
* @return 주어진 목록에서 가장큰수
*/
public static int largest(int[] list){
int index, max= 0;
for (index = 0; index if(list[index]>max){
max= list[index];
}
}
return max;
}
}

다시 Junit을 실행하면 Fail없이 정상적으로 동작하는 것이 보여진다.



그러면 동일한 숫자가 있을경우는 어떻게 되는지 보자.

그냥 동일한 테스트 메소드에 넣어도되지만 테스트 메소드를 하나더 추가해서 만들겠다.



Junit 추가1

public void testDups(){

assertEquals(9,Largest.largest(new int[] {7,9,8,9}));


}



역시 통과한다.



한개의 수가 있을경우는?



Junit 추가2

public void testOne() {
assertEquals(1, Largest.largest(new int[] { 1 }));

}

역시 통과



- 일경우는?



Junit 추가3

public void testNegative(){
assertEquals(-7,Largest.largest(new int[] {-7,-9,-8}));

}



실패한다. 예상결과에는 -7이였지만 결과는 0으로 나온다. 왜그럴까?



그건 Max=0을 줘서 그렇다. Max의 값을 음수 보다도 적게 하려면 Integer.MIN_VALUE를 사용하면 된다.



최종

public class Largest {
/**
* 목록에서 가장큰수를 반환한다.
*
* @param list 정수목록
* @return 주어진 목록에서 가장큰수
*/
public static int largest(int[] list){
int index, max= Integer.MIN_VALUE;
for (index = 0; index if(list[index]>max){
max= list[index];
}
}
return max;
}
}



공백에 대한 테스트를 하여야 하지만 이부분은 예외처리를 하도록하겠다.



Junit 추가4

public void testEmpty() {
try {
Largest.largest(new int[] {});
fail("Should have thrown an exception");
} catch (RuntimeException e) {
assertTrue(true);
}

}



Junit 전체

import static org.junit.Assert.*;

import org.junit.Test;

public class LargestTest {

@Test
/*
* 순서 일반비교
*/
public void testLargest() {
assertEquals(9, Largest.largest(new int[] { 7, 9, 8 }));
assertEquals(9, Largest.largest(new int[] { 9, 7, 8 }));
assertEquals(9, Largest.largest(new int[] { 7, 8, 9 }));

}

@Test
/*
* 동일한 숫자가 있을경우
*/
public void testDups() {
assertEquals(9, Largest.largest(new int[] { 7, 9, 8, 9 }));

}

@Test
/*
* 숫자 하나만 있는 경우
*/
public void testOne() {
assertEquals(1, Largest.largest(new int[] { 1 }));

}

@Test
/*
* 음수가 들어간경우
*/
public void testNegative() {
assertEquals(-7, Largest.largest(new int[] { -7, -9, -8 }));

}

@Test
/*
* 공백일경우
*/
public void testEmpty() {
try {
Largest.largest(new int[] {});
fail("Should have thrown an exception");
} catch (RuntimeException e) {
assertTrue(true);
}

}
}

댓글 없음:

댓글 쓰기