정보공간_1

[2기 부산 배보람]Junit을 활용한 테스팅 이야기 본문

IT 놀이터/Elite Member Tech & Talk

[2기 부산 배보람]Junit을 활용한 테스팅 이야기

알 수 없는 사용자 2012. 8. 18. 16:46

안녕하세요 저는 부산 멤버십 20-2기 배보람 입니다. 

저는 이번에 Junit을 활용한 테스트 이야기를 해 볼까 합니다. ^^ 

Junit을 이용한 테스트 케이스 작성과 활용 만으로도 향후 프로젝트의 유지보수에 굉장히 도움이 됩니다. 


1. 익스트림 단위 테스팅이란?

먼저 Junit을 직접 사용하기 앞서 익스트림 단위 테스팅에 대해 간략히 설명 하겠습니다. 

익스트림 단위 테스팅에는 두가지 단순한 규칙이 있습니다. 

  • 모든 코드 모듈은 코딩이 시작 되기 전에 단위 테스트 케이스가 있어야 하고
  •  생산 단계로 릴리즈 되기 전에 테스트 케이스를 모두 통과 해야 한다.   

 중요한 포인트는 모듈을 코딩하기전에 단위 테스트 케이스를 정희하고 작성한다는 것입니다. 

위의 두가지 규칙만을 보고 테스트가 왜 필요한가 에 대해서 생각한다면 불필요하고 귀찮은 것이라고 느낄수도 있습니다.

누구나 그렇게 생각 할 수 있습니다만 코딩을 시작하기 전에 단위 테스트 케이스 작성에 따른 이점은 아래와 같습니다.

  • 코드가 명세에 충족한다는 확신을 얻음
  • 코딩 전에 코드의 최종 결과 표현
  • 애플리케이션 명세와 요구 사항 이해도 향상
  • 초기에 단순히 설계된 부분을 구현하고 명세를 분리하지 않고 코드를 리펙토링

이러한 장점은 프로젝트가 클수록 더 효과적이라고 생각됩니다. 

그러나 작은 프로그램이라도 수동으로 실행하는 단위 테스트는 엄청난 압박입니다. 

어플리케이션의 규모가 커지면서 수백 수천의 단위 테스트 케이스를 작성해야 하기 때문입니다. 

그래서 단위 테스트를 지속적으로 실행하는 자동화 소프트웨어 테스팅 스위트를 사용합니다. 

2. Junit이란?
Junit이란 자바 기반의 오픈소스 단위 테스팅 스위트 입니다.  무료로 사용 할 수 있고, 이클립스에 포함되어 있기 때문에  별다른 설치 없이 사용 할 수 있습니다. 




3. Junit의 활용
그럼 Junit의 활용을 위해 간단한 어플리케이션을 작성하고 테스트 케이스를 만들어 보겠습니다. 

어플리케이션의 명세는 다음과 같습니다. 

0<= N <=1000인 양수 N을 받아 들여 해당 값이 소수인지 확인하는 커멘드 라인 애플리케이션을 개발한다. N이 소수이면 애플리케이션은 소수라는 메시지를 반환해야한다. N이 소수가 아니라면 애플리케이션은 소수가 아니라는 메시지를 반환해야한다. N이 유효한 값이 아니라면 애플리케이션은 도움말 메시지를 보여줘야 한다.

 이 명세에서는 입력값 확인과 소수 확정이라는 두가지 태스크를 식별할 수 있습니다. 테스트 설계 시 블랙박스와 화이트박스 테스팅 기법, 경계 값 분석, 결정 커버리지 기준을 각각 활용 할 수 있으나 이 케이스는 블랙박스 접근 법을 활용한 케이스 입니다. ^^


케이스 No.

입력값 

 예상 결과

 1

n=3n이 소수임을 확인 

 2

 n= 1000n이 소수가 아님을 확인 

 3

 n= 0n이 소수가 아님을 확인 

 4

 n=-1도움메시지 출력 

 5

 n=1001도움메시지 출력 

 6

 2개 이상의 입력값도움메시지 출력 

 7

 n="a"도움메시지 출력

 8

 n이 공백임도움메시지 출력

위와 같이 테스트 케이스를 설계를 한뒤에는 테스트 드라이버와 테스트 어플리케이션을 작성해야 합니다.  


아래 표는 테스트 드라이버 메소드 입니다.

메소드 

커버한 테스트 케이스 

 testCheckPrime_true()

 1 

 testCheckPrime_false()

 2,3 

 testCheckPrime_checkArgs_char_input()

 7 

 testCheckPrime_checkArgs_above_upper_bound()

 5

 testCheckPrime_checkArgs_neg_input()

 4

 testCheckPrime_checkArgs_2_input()

 6

 testCheckPrime_checkArgs_0_input()

 8



테스트 드라이버 메소드가 테스트 케이스를 모두 커버하는지에대한 체크가 필요합니다. 


테스트 드라이버 설계까지 끝났으니 실제로 Junit을 활용하여 작성해 보겠습니다.



간단하게 프로그램 명세를 만족하는 어플리케이션을 작성하였습니다.  정말 간단합니다.



이제 실제로 Junit을 이용해서 테스트 케이스를 작성해보겠습니다. 

우선 프로젝트에 test 라는 새로운 소스 폴더를 하나 만들겠습니다.



그리고 test폴더 아래 JUnit Test Case를 하나 만들도록 하겠습니다. 먼저 말씀 드린데로 Junit이 이클립스에 포함되어 있기때문에 별도의 설치는 필요하지 않습니다. ^^


적당한 테스트 케이스 명을 주고 테스트할 클래스를 지정합니다. 



next를 누르면 아래와 같이 해당 클래스에 테스트할 메서드를 직접 지정할 수 있습니다. 



이렇게 하는 방법도 있지만 여기서는 위에서 설계한 테스트케이스와 테스트케이스를 커버하는 드라이버 메서드 표를 기준으로 직접 작성하겠습니다. 


Finish를 누르고 위에 보이시는대로 빌드 패스를 추가 하면 됩니다. 



위와 같이 테스트 케이스를 작성 하였습니다. 


그럼 실제로 테스트를 해보겠습니다. 

위와 같이 모든 테스트케이스가 통과 된것을 볼 수 있습니다. Junit을 사용하는 것 자체는 어렵지 않습니다. 


위의 테스트 케이스 코드를 보면 

assertTrue(check.primeCheck(3));

fail("should raise an exception");

와 같은 Junit메서드를 사용 한 것을 볼 수 있습니다. 

이것은 Junit의 단정 메서드라고 테스트 결과를 위해 사용하는 메서드 입니다. 


마지막으로 이 단정 메서드에 대해 간단하게 정리해 보도록 하겠습니다.

 Junit 단정 메서드

 용도 

  assertEquals 

 같은지 비교

  assertNull 

 null값을 리턴하는지 비교

  assertNotNull 

 인자로 넘겨받은 객체가 null인지 판정하고 반대인경우 실패로 처리한다.

  assertSame 

 assertSame 은 expected 와 actual이 같은 객체를 참조하는지 판정하고 그렇지 않다면 실패로 처리한다.

  assertNotSame 

 expected 와 actual이 서로 '다른' 객체를 참조하는지 판정하고, 만약 같은 객체를 참조한다면 실패로 처리한다.

  assertTrue 

 boolean 조건이 참인지 판정한다. 만약 조건이 거짓이라면 실패로 처리한다.

  fail 

 테스트를 바로 실패 처리한다.

 


4. 마치며

 간략하게 테스팅과 Junit사용법에 대해서 알아 보았습니다. 직접 해보시면 알겠지만 Junit의 사용법은 정말 쉽습니다.  반면에 junit을 사용하면 프로젝트의 성공에 아주큰 힘이 되어준답니다^^ 

 이렇게 단위테스트 케이스를 작성·검증하고 나면, 테스팅코드 베이스는 개발하려는 소프트웨어 어플리케이션만큼이나 가치를 갖습니다!!

가령 모듈의 알고리즘이나 자료구조 수정, 리페토링이 있었을 경우 과거에 작성한 테스트 케이스는 변경사항에 대한 좋은 검증 도구가 됩니다. 

따라서 테스트한 사항들은 코드 저장소에 보관하고 보호하여야 합니다. ^^

 그리고 이포스팅에서는 설명하지 않았지만  테스트 케이스를 설계하는 과정에서의 테스팅 접근법, 테스트 케이스 설계 기법에 대한 이해가 매우 중요합니다. 

이번기회에 프로젝트를 하시며 Junit을 한번 사용해보시길 권장합니다.



[참고문헌]

- The Art of Software Testing second edtion

- Software Engineering a practitioner's Approch seeventh edtion

- Junit Quick Reference.pdf