사용한 예제는 이클립스 에서 작성한것이다.(자니메드인가? 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
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
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
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
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);
}
}
}
댓글 없음:
댓글 쓰기