.class에 대해 mock 처리를 해야 할 때가 있다.

이럴 때는 역시 파워목!

MockGateway.MOCK_GET_CLASS_METHOD를 true로 설정하면 된다.


TestCode.java



Leave a Comment

단위 테스트시에 객체 생성이 될 때, 예외가 발생을 하게 해야 하는 경우가 있다.

이런 경우에 PowerMock을 이용하여 테스트한다.


- 객체 생성시 예외 발생시키기 -





Leave a Comment

생성자가 private일 경우 테스트 필요시 처리.


생성자 호출



파라미터가 있는 생성자의 경우



Method 호출



필드값 주입



Leave a Comment

단위 테스트시에 파라미터에 따라서 다양하게 테스트를 해야 하는 경우가 있다.

이런 경우에 변경되는 파라미터에 대해 일일히 개발하거나 파라미터를 공통화해서 진행을 하기도 하는데

이럴 필요 없이 이미 다양한 파라미터에 대해 테스트할 수 있는 Parameterized가 있다.


- 사용법 - 

1. @RunWith(Parameterized.class) 선언 필요

2. 변경되면서 테스트가 필요한 파라미터 조건 선언

2.1. @Parameter를 붙여준다.

2.2. 파라미터는 반드시 public으로 선언해줘야 한다.


3. 파라미터 값들에 대한 테스트 목록 설정이 필요

3.1. @Parameters public static Collection<Object[]> data()로 선언해서 구현


ParamTest.java






Reference

[1] Mkyong (https://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/)

[2] junit team (https://github.com/junit-team/junit4/wiki/parameterized-tests)

Leave a Comment

pom.xml 테스트 설정

powermock 설정시 일부 라이브러리간 실행 안되는 문제가 안되서 기록해준다.


Test.java






pom.xml










Leave a Comment

근래 TDD에 관심을 갖게 되었다. 꾀 효율적인 개발 기법인데 안타까운 점은 이러한 것을 쓰는 회사나 팀이 많지 않을것 같아서, 개인적으로 공부하지 않는한 배울 기회가 별로 없을 것 같다. 나는 단위테스트에 대해 공부하다가 알게 되었는데 꾀 좋다. 단순한 테스트 기법이 아닌 좋은 분석기법이자 설계기법이다.

기존에 프로그래머는 개발을 먼저 하고 그것을 테스트하는 코드를 만들게 됀다.
회사에서 역시 잘 돌아가나 확인하고 잘 돼네?라고 끝나기도 한다.

지금 생각해보면 정말 체계적이지 못한 방법이다. 나도 아직 이 테스트주도개발이 익숙하지 않지만 숙달시켜보려고 한다. 안타까운 점은 체계적이고 정도를 지키는 회사의 부서가 아니라면 이 방식을 계속 쓰기가 힘들것 같다.

※ 테스트 주도 개발(Test Driven Development)
- TDD는 테스트 기술이 아님
- TDD는 분석 기술이며, 설계 기술
- 개발의 모든 활동을 구조화하는 기술
- 자동화된 테스트로 개발을 이끌어 가는 개발 방식

※ TDD 방식
1. 작성해야 하는 프로그램에 대한 테스트를 먼저 작성
2. 테스트를 통과할 수 있도록 실제 프로그램 코드를 작성.

※ TDD 방식 순서
 

1. 무엇을 테스트할 것인가 생각한다.
2. 테스트를 작성한다.
3. 테스트가 실패하게 만든다.
4. 테스트를 통과하는 코드를 작성한다.
5. 코드를 리펙토링한다. (리펙토링 과정에서 물론 테스트를 계속 통과해야만 한다.)
6. 테스트코드 또한 리펙토링한다.
7. 구현해야 할 것이 있을 때까지 위의 작업을 반복한다.

※ Why TDD ?
1. 검증받은 코드, 자신있는 코드가 되기 때문
2. Simple한 코드를 만들기 위한 가장 효과적인 방법

※ TDD 책에서..
* 세 항목만으로 동일한 설계와 구현을 이끌어낼 수 있다면 굳이 항목을 열 개나 나열할 필요는 없다.[3]
* 확실히 하지 말아야 할 일이 있는데, 그것은 코드 전체를 위한 테스트를 한꺼번에 다 만들고, 코드 전체를 한 번에 리팩토링하는 일이다.[3]

※ 책
1. 테스트주도개발
TDD의 창시자가 썼다는 책입니다. 2005년도에 나왔군요. 중간중간 파이썬으로 예제코드가 나와있습니다.
(http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788991268043&orderClick=LAG)

2. 테스트 주도 개발 TDD 실천법과 도구
국내분이 쓰셨고 2010년도에 나온 책이네요. 좋은지 아닌지는 모르겠지만, 어쨌든 책은 창시자가 쓴 책의 번역본과 이 책 뿐인것 같네요.
(http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788979147261&orderClick=LAG)

※ 기타
TDD말고 행위주도개발(Behavior-Driven Development)[4]이라는 방법도 있네요. 어쨌든, TDD는 참 좋은 방법이긴 하지만 활용한다는 것은 쉬운건 아니겠죠, 특히나 국내처럼 촉박한 개발시간에 쫓기다보면 방법이고 뭐고간에 빨리 끝내고 퇴근할 생각밖에는 없게 되겠죠. TDD와 같은 체계적인 방법을 사용할 수 있는 성장된 국내 IT회사들의 모습을 희망해봅니다.

Reference
[1] TDD 방법 (http://blog.naver.com/kimig82?Redirect=Log&logNo=80121320519)
[2] 꽃녀의 도전, TDD방법 및 AsUnit, FlexUnit 소개 (http://2rang.tistory.com/51)
[3] 나는 개발자, 테스트 주도 개발 (http://soupim.tistory.com/44)
[4] UMC와 함께 하는 닷넷 플랫폼 이야기 (http://blog.powerumc.kr/221)
[5] 행복한 아빠, 테스트 주도 개발 -> 테스트 우선 개발 (http://greatkim91.tistory.com/157
 

Leave a Comment

오랜만에 포스팅이다.
자바 웹 관련 개발자들과 애기하다보면 JUnit에 대한 이야기가 늘 나온다. 사실 난 그동안 테스는 main()을 통해서만 테스트만 해왔었다. 업무적으로  JUnit을 써볼 기회가 많지도 않긴 했지만 전문가와  단위테스트에 대한 이야기가 나왔는데 내가 추상적으로 이야기했더니 무시를 당했다. 내가 화술이 부족해서(모르는 것도 아는 것처럼, 아는 것은 더 부풀려서 하는) 그럴수도 있지만, 사실 알고만 있을뿐 내가 개발에 직접 사용해보지 않았으니까 그러려니 했다.

그리고 오늘 웹에서 자료를 찾아가며 사용해보았는데, 이것은 신세계였다. 그동안 난 일부 기능들에 대한 테스트를 각 main()을 통해 하였는데 사실 지저분하고 매우 번거로운 작업이다. 각 테스트를 위한 코드를 작성했다가 주석처리를 하면서 지저분한 테스트 코드를 짜곤 했다. 그런데 JUnit은 정말 깔끔하다.
나 이외에 JUnit을 써보지 않은 자바 개발자가 있다면 이제는 꼭 JUnit을 사용하길 권장한다.

JUnit (http://www.junit.org/)
JUnit은 단위 테스트용 개발자 유틸리티로서 현재 이클립스에 기본적으로 포함(하나의 jar로 구성)되어 있다. 테스트 결과 에러 확인 및 최적 코드를 유추 가능하다.

현재 JUnit은 3버전과 4버전이 나와있다. 3에서는 TestCase클래스를 상속받고 테스트 코드를 작성했지만 4에서는 @Annotation이라는 기능을 사용하여 보다 편리하게 작성할 수 있다.

JUnit3
import org.junit.Test;
import junit.extensions.TestSetup;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class Tester extends TestCase{
public void testGetCurrentVersion(){
assertEquals(new Atin().getCurrentVersion(), "Version 1.0");
}

public void testGetCurrentVersion2(){
assertEquals(new Atin().getCurrentVersion(), "Version 1.0");
}

public Tester(String method){
super(method);
}

public static junit.framework.Test suite(){
TestSuite suite = new TestSuite();
  // 다음 추가하는 메소드명만 단위테스트함
suite.addTest(new Tester("testGetCurrentVersion"));
suite.addTest(new Tester("testGetCurrentVersion2"));
TestSetup wrapper = new TestSetup(suite){
// 메소드 실행 전 작업 
protected void setUp(){
System.out.println("Start");
}
  // 메소드 실행 후 작업
protected void tearDown(){
System.out.println("End");
}
};
return wrapper;
}
}

JUnit 4
import static org.junit.Assert.assertEquals;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

public class Tester4 {
// 실행할 메소드 위에 Test라고 하면 해당 메소드를 단위 테스트함 
@Test
public void testGetCurrentVersion(){
System.out.println("1");
assertEquals(new Atin().getCurrentVersion(), "Version 1.0");
}

 
// 단위 테스트 제외
@Ignore
public void testGetCurrentVersion2(){
System.out.println("2 s");
assertEquals(new Atin().getCurrentVersion(), "Version 2.0");
}

 
// 단위 테스트 제외 및 설명
@Ignore("제명이 됐어요")
public void testPlusString(){
System.out.println("2 s");
assertEquals(new Atin().plusString("A", "BC"), "ABC");
}

 
//  단위 테스트 메소드 전 실행
@Before
public void before(){
System.out.println("Before");
}

 
// 단위 테스트 메소드 후 실행
@After
public void after(){
System.out.println("After");
}

 
// 단위 테스트 전 한번만 실행
@BeforeClass
public static void beforeClass(){
System.out.println("BeforeClass");
}

 
// 단위 테스트 후 한번만 실행
@AfterClass
public static void afterClass(){
System.out.println("AfterClass");
}
}

기타 참고
@Test(timeout = 1000) : 시정한 시간이 경과 하면 test fail. (miiseconds)


실행
처음에 실행을 어떻게 하는지 몰라서 main()으로 실행해야 하는지 착각을 했었따. ^^;
Junit 코드를 작성하고 나면, Run >> Run as >> Junit Test 가 나온다. 이걸로 실행하면 됀다.


나같은 경우는 안드로이드 SDK도 같이 깔려있어서 그런지 다음과 같은 선택창이 떴다. Eclipse Junit Launcher를 선택해주자. (후에 안드로이드 형태도 테스트 해보아야 겠다.)
 


실행 결과는 다음과 같다. 각 메소드별 테스트 시간 및 성공 여부가 나오며, 에러가 날 경우 하단에 Failure Trace에 이유를 표시해준다. 혹시나 이 창이 없다면 Window >> Show View >> other >> Java > Junit 을 선택해서 열면 되겠다.



Reference
JUnit4 Annotation설명(http://jjeong.tistory.com/373)
JUnit 설명 (http://blog.naver.com/julymorning4?Redirect=Log&logNo=100019158166)
단위 테스트 설명 및 JUnit 3 코딩 설명(http://shinewithme.tistory.com/476)


추가 Reference ( TDD와 JUnit에 대해 잘 소개해놓은 곳을 찾았다.)
[1] Junit을 이용한 효율적인 테스트 전략 (http://www.javajigi.net/pages/viewpage.action?pageId=278)
[2] TDD 및 JUnit (http://www.javajigi.net/display/OSS/TDD)


Leave a Comment


to Top