Akashic Records

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

오래된글/Java

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

Andrew's Akashic Records 2018. 4. 7. 23:35
728x90

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) 특성이 한도 내에 있는가?


728x90
Comments