160627: 72회차
Programming
2016. 6. 27. 15:56
종료하기 전 티스토리 네이버 로그아웃 할 것
1. 툴
동일
추가시:
2. 폴더
동일
추가시:
3. 사용할 사이트
동일
추가시:
4. 공부하는 것
[06] 단위테스트 프레임워크 JUnit 3
[01] JUnit
- 에릭감마와 켄트 백이 탄생시킨 Junit은 현재 전 세계적으로 가장 널리 사용하는
Java 단위 테스트 프레임워크다.
//이런 거를 xunit이라고 함
dunit cunit junit
- 외부 테스트 프로그램(케이스)을 작성하여 System.out으로 번거롭게 디버깅하지
않아도 된다.
- 프로그램 테스트 시 걸릴 시간도 관리할 수 있게 해주며 오픈 소스이다.
- 플러그인 형태로 Eclipse에 포함되어 있다.
- 어느 정도 개발이 진행되면 프로그램에 대한 단위 테스트는 반드시 수행한다.
- JUnit은 보이지 않고 숨겨진 단위 테스트를 끌어내어 정형화시켜 단위 테스트를 쉽게
해주는 테스트용 Framework 이다.
않아도 된다.
- 프로그램 테스트 시 걸릴 시간도 관리할 수 있게 해주며 오픈 소스이다.
- 플러그인 형태로 Eclipse에 포함되어 있다.
- 어느 정도 개발이 진행되면 프로그램에 대한 단위 테스트는 반드시 수행한다.
- JUnit은 보이지 않고 숨겨진 단위 테스트를 끌어내어 정형화시켜 단위 테스트를 쉽게
해주는 테스트용 Framework 이다.
- 오픈소스 프로젝트 방식이며 꾸준히 버전업되고 있다.
- Junit 단위 테스트의 제공 기능
. assertions : 테스트결과값과 예상값이 같은지 비교하는 단정문
. test fixture : 일관된 테스트 실행환경
. test runner : 테스트 작업수행을 위한 테스트 실행 클래스
. 단위 테스트 케이스와 단위 테스트 메소드
1. JUnit3
1) 규칙
- TestCase 상속 //JUnit3에서는 상속 필수 JUnit4에서는 필요없음
- 테스트메소드 이름은 test로 시작
---------------------------------------------------
public class AccountTest extends TestCase {
:
public void testAccount() {
fail("Not yet implemented");
}
:
}
----------------------------------------------------
2) 테스트 픽스처 메소드
- setUp() : 테스트 메소드 실행전 호출
자원할당, 객체생성, DB연결등 테스트 환경준비
- tearDown() : 테스트 메소드 실행후 호출
자원해제, 연결해제등 뒷정리

3) 단정문 // []는 해도 되고 안해도 되고
- assertEquals([msg],예상값,실제값) : 두값이 같은지 비교
- assertTrue(([msg],예상값) : 참/거짓을 판별하는 단정문
- assertFalse
- assertNull([msg],예상값) : null 여부를 판단하는 단정문
- assertNotNull
- assertSame([msg],예상값,실제값) : 구 객체가 동일한 객체인지 해쉬코드 비교
- assertNotSame
- fail([mgs]) : 이메소드 호출되면 해당 테스트 케이스는 그 즉시 실패한다.
4) 테스트 러너
- 테스트 실행 클래스로 Swing UI, 텍스트, Java AWT UI등 세가지 실행방법 제공
- junit.swingui.TestRunner.run(테스트클래스.class)
- junit.textui.TestRunner.run(테스트클래스.class)
- junit.awtui.TestRunner.run(테스트클래스.class)
5) 테스트 스위트
- 여러개의 테스트 케이스를 한꺼번에 수행하고자 할때 사용
- 테스트 스위트? 테스트 케이스와 다른 테스트 스위트를 포함시킬 수 있다.
- 메소드는 반드시 public static Test suite()여야 한다.
- 테스트 추가는 sute.addTestSuite(테스트클래스.class) 형식을 갖는다.
6) JUnit 3의 테스트
- test.Account.java 클래스 생성
package test;
public class Account {
int account;
public Account(int i){
account = i;
}
public int getBalance(){
return account;
}
/** 출금 **/
public void withdraw(int i) {
account =account- i;
}
/** 예금 **/
public void depoit(int i) {
account=account+i;
}
}
- test.AccountTest.java 생성



- 자동 생성된 AccountTest.java class를 아래처럼 바꾼다.
package test;
import junit.framework.TestCase;
public class AccountTest extends TestCase {
Account account;
protected void setUp() throws Exception {
account = new Account(10000);
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testAccount() {
//fail("Not yet implemented");
}
public void testGetBalance() {
assertEquals(10000, account.getBalance());
}
public void testWithdraw() {
account.withdraw(1000);
assertEquals(9000, account.getBalance());
}
public void testDepoit() {
account.depoit(1000);
assertEquals(11000, account.getBalance());
}
}
- 실행 방법 및 결과
AccountTest.class 선택 -> Run As -> JUnit Test

- 테스트 케이스는 독립적으로 수행하므로 테스트 메소드 수행전 테스트 클래스 자체를 초기화 한다.
- 각각의 테스트 메소드만 수행하는 식으로 다른 테스트 메소드들로 인한 영향을 최소한다.
- Account.java class의 생성자 아래 코드 추가
System.out.println("생성자 호출:"+account);
- JUnit Test 실행 후 Console 결과 확인(메소드 수만큼 Account 클래스 객체생성)
생성자 호출:10000
생성자 호출:10000
생성자 호출:10000
생성자 호출:10000
[07] 애노테이션 기반의 JUnit 4
[01] JUnit 4
- 실행및 결과확인 -> Run As ->JUnit Test
1. JUnit 4의 특징
- Java 5의 애노테이션 지원
- test라는 글자로 method 이름으로 시작해야 하는 제약 해소
test 메소드는 @Test 선언
- 애노테이션 기반 픽스처
@BeforeClass, @AfterClass, @Before, @After
- 예외 테스트
@Test(expected=NumberFormatException.class)
- 시간 제한 테스트
@Test(timeout=1000)
- 테스트 무시
@Ignore("this method isn't working yet")
- 배열 지원
assertAttrayEquals([msg],예상값,실제값);
- @RunWith(클래스이름.class)
JUnit Test 클래스를 실행하기 위한 러너(Runner)를 명시적으로 지정한다.
@RunWith는 junit.runner.Runner를 구현한 외부 클래스를 인자로 갖는다.
- @SuiteClasses(Class[])
보통 여러 개의 테스트 클래스를 수행하기 위해 쓰인다. @RunWith를 이용해
Suite.class를 러너로 사용한다.
- 파라메터를 이용한 테스트
@RunWith(Parameterized.class)
@Parameters
public static Collection data(){
:
}
1. @Test
- JUnit 4는 메소드 이름과 관계없이 @Test 애노테이션만 선언하면 테스트 메소드로 인식한다.
- 더이상 test로 메소드의 이름을 시작하지 않아도 된다.
- JUnit 3에서 testDeposit 대신 testDepoist으로 타이핑 오타를 내면 실행이 안된다.
그러나 JUnit4 @Test 선언하면 실행이 잘된다.
2. 픽스처 메소드 추가 지원
- JUnit 3는 setUp(), tearDown() 만 지원
- JUnit 4는 @Before, @After 애노테이션으로 같은 기능의 메소드 선언
- JUnit 4는 @BeforeClass, @AfterClass 애노테이션으로 하나의 테스트 클래스 내에서
한 번만 실행하는 메소드 만들수 있다.

3. 예외 테스트
- JUnit 3에서는 예외처리를 테스트하려면 try/catch문을 사용해야만 했다.
- JUnit 4에서는 애노테이션을 이용해서 아래처럼 코딩할 수 있다.
@Test(expected=NumberFormatException.class)
public void testException(){
String value = "a123";
System.out.println(Integer.parseInt(value));
}
- expected 값으로 예외 클래스를 지정했을 때, 만일 테스트 메소드 내에서 해당 예외가
발생하지 않으면 테스트 메소드는 실패로 간주한다.
4. 테스트 시간 제한
- 밀리초 단위의 시간을 정해준 후 해당 시간 내에 테스트 메소드가 수행완료가 되지
않으면 실해한 테스트 케이스로 간주하다.
@Test(timeout=5000)
public void testPingback() throws Exception
:
}
5. 테스트 무시
- @Ignore 가 선언된 메소드는 해당 애노테이션을 지울때까지 수행하지 않는다.
6. 배열 지원
- 배열을 비교할 수 있다 (assertArrayEquals(names, anotherNames);
- 배열의 순서가 다르면 테스트가 실패한다.
7. JUnit 4의 테스트 실행
- Terminal.java 생성
- TerminalTest.java 생성

- 자동으로 생성된 TerminalTest.java의 메소드의 내용 수정.
package test;1. @Test
- JUnit 4는 메소드 이름과 관계없이 @Test 애노테이션만 선언하면 테스트 메소드로 인식한다.
- 더이상 test로 메소드의 이름을 시작하지 않아도 된다.
- JUnit 3에서 testDeposit 대신 testDepoist으로 타이핑 오타를 내면 실행이 안된다.
그러나 JUnit4 @Test 선언하면 실행이 잘된다.
2. 픽스처 메소드 추가 지원
- JUnit 3는 setUp(), tearDown() 만 지원
- JUnit 4는 @Before, @After 애노테이션으로 같은 기능의 메소드 선언
- JUnit 4는 @BeforeClass, @AfterClass 애노테이션으로 하나의 테스트 클래스 내에서
한 번만 실행하는 메소드 만들수 있다.

3. 예외 테스트
- JUnit 3에서는 예외처리를 테스트하려면 try/catch문을 사용해야만 했다.
- JUnit 4에서는 애노테이션을 이용해서 아래처럼 코딩할 수 있다.
@Test(expected=NumberFormatException.class)
public void testException(){
String value = "a123";
System.out.println(Integer.parseInt(value));
}
- expected 값으로 예외 클래스를 지정했을 때, 만일 테스트 메소드 내에서 해당 예외가
발생하지 않으면 테스트 메소드는 실패로 간주한다.
4. 테스트 시간 제한
- 밀리초 단위의 시간을 정해준 후 해당 시간 내에 테스트 메소드가 수행완료가 되지
않으면 실해한 테스트 케이스로 간주하다.
@Test(timeout=5000)
public void testPingback() throws Exception
:
}
5. 테스트 무시
- @Ignore 가 선언된 메소드는 해당 애노테이션을 지울때까지 수행하지 않는다.
6. 배열 지원
- 배열을 비교할 수 있다 (assertArrayEquals(names, anotherNames);
- 배열의 순서가 다르면 테스트가 실패한다.
7. JUnit 4의 테스트 실행
- Terminal.java 생성
package test;
public class Terminal {
private String id;
private String pw;
private String msg;
public void netConnect(){
System.out.println("터미널 접속");
}
public void netDisConnect(){
System.out.println("터미널 접속 해제");
}
public void logon(String id, String pw){
this.id = id;
this.pw = pw;
System.out.println("로그인");
}
public void logoff(){
System.out.println("로그오프");
}
public boolean isLogon(){
if(id!=null && pw!=null){
return true;
}else{
return false;
}
}
public void sendMessage(String msg) {
this.msg = msg;
}
public Object getReturnMsg() {
return msg;
}
}
- TerminalTest.java 생성

- 자동으로 생성된 TerminalTest.java의 메소드의 내용 수정.
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class TerminalTest {
private static Terminal term;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
term = new Terminal();
term.netConnect();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
term.netDisConnect();
}
@Before
//test method 호출 될 때마다 매번 호출됨
public void setUp() throws Exception {
term.logon("user1", "1234");
}
@After
//test method 호출 될 때마다 매번 호출됨
public void tearDown() throws Exception {
term.logoff();
}
@Test
public void TerminalConnected() throws Exception{
assertTrue(term.isLogon());
System.out.println("== logon test");
}
@Test
public void getReturnMsg() throws Exception{
term.sendMessage("hello");
assertEquals("hello", term.getReturnMsg());
System.out.println("== message test");
}
}
- 실행및 결과확인 -> Run As ->JUnit Test
@BeforeClass
@Before @Test @After
@Before @Test @After
@Before @Test @After
...
@AfterClass의 순서인것
assert 친구들이 리턴값은 없는 것 - 그냥 성공 - 초록색 / 실패 - 뻘건색 뜨는 것
5. 수업
진도:
hw:
6. 할것
내 홈페이지 (모델1방식) -> 모델2 방식으로 고친 다음에 스프링으로 고치기
JUnit & DBUnit 쓸 예정
spring_blog -> bbs
'Programming' 카테고리의 다른 글
160629: 74회차 (0) | 2016.06.29 |
---|---|
160628: 73회차 (0) | 2016.06.28 |
160624: 71회차 (0) | 2016.06.24 |
160623: 70회차 (0) | 2016.06.23 |
160622: 69회차 (0) | 2016.06.22 |