Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

TDD 실천하기

TEST/JUint 2015.11.24 16:58
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T




- JUNIT TEST

리펙토링을 하는데 있어서 테스트가 필수!(리펙토링을 하기 위한 전제조건!)


- How to test?

mockito를 이용 해보자.

설정을 해보자. 현재 maven을 사용.




위의 그림처럼 maven dependency를 설정(pom.xml)하여 준다.(mockito라는것을 사용해보려고 한다.)

현재(2015년11월의 최신 릴리즈버전이다.)

<dependency>

    <groupId>org.mockito</groupId>

    <artifactId>mockito-core</artifactId>

    <version>1.10.19</version>

</dependency>


소스에서는 import static org.mockito.Mockito.*; 를 static으로 import 시킨 뒤!

상황에 맞게 테스트 코드를 만들어서 사용하시면 됩니다.

참고 url : https://code.google.com/p/mockito/wiki/MockitoFeaturesInKorean


- TDD를 하는데 있어서 가장 어려운 것은 무엇일까? 특히나 as-is소스에 대한 테스트 코드를 짜려고하는데 왜이렇게 힘든걸까?

BDD의 given / when / then의 패턴을 따른다고 가정하면..

1. 테스트 범위 선정에 대한 어려움.

2. 테스트를 해야하는지에 대한 여부 판단.

3. 다른 객체들과의 참조일 때의 처리 방법.(mockito의 사용법을 잘 모르는 상태)

4. BDD에서 말하는 given / when / then의 패턴과 mockito의 문법과 헷깔림. how to use??



TDD 실천하기 Step 01.

 - 선정해보자. TDD를 하기 위한 소스!

 - mockito 익히기!

 - TDD 소스 짜보기(given / when / then 형태)


** 선정 기준 **

우선은 리턴이 있는 친구로!

ex) 

test  할 소스( 조금 애매할 수 있는 소스..ㅋㅋ)


public accountResultDto getAccount(AccountInfo accountInfo){

   AccountResultDto  accountResultDto = accountRepository.getAccount(accountInfo.getAccountSeq);

   if(accountResultDto == null) return null;

   accountResultDto.setXXX(accountInfo);

   return accountResultDto;

}


-- TEST Code --

// given

제공해야하는 객체 또는 파라미터들에 대한 셋팅을 해준다.

accountResultDto와 accountInfo가 되겠다.


// when

mock객체(Repository같은 database와 연결되어지는 것 들)

실제로 테스트할 메소드 호출을 하는 부분이다. 


// then

그 결과를 assertThat 등으로 체킹한다.


아래의 소스를 보고 더 파악을 해보자.

더보기



위의 소스에서와 같이 BDD의 given / when / then 방식으로 코딩을 하였고 중요하게 보아야할 것은 @InjectMocks와 @Mock 어노테이션을 통해 쉽게 DI를 해주었다는 부분과 아래의 소스 부분이다.


  1)  when(accountRepository.getAccount(accountSeq)).thenReturn(accountResultDto);

  2) account.getAccountInfo(accountInfo);


1) 부분이 Mock을 처리한 부분이고 2)가 테스트 대상을 호출하였다.(DI는 @InjectMocks)

호출을 하게 되면 소스상에서 Mock으로 선언된 accountRepository를 만나게 되면 when구문이 발동되어 우리가 예상했던 Return값을 받게 된다.(accountResultDto) 즉, 아래에서 우리가 테스트를 할 녀석은 b) 인 것이다.

   a) if(accountResultDto == null) return null;

   b) accountResultDto.setXXX(accountInfo);


그리고나서 assertThat등으로 확인을 하면 된다.

#참고 : given에서 넘겨줄 데이터를 채워서 보내주는데 이러한 부분을 '픽스처' 라는 용어를 사용하기도 한다.


픽스처를 다양하게 만들어서 필요한 테스트 코드를 만들면 된다.

그러나 보통 픽스처가 덩치가 크거나 공통적으로 사용되는 부분이 있어서 많아지게 되면 관리의 어려움이 있다.

이것에 대한 해결책은 한번 찾아보고 생각해봐야할 것이다.


일단은.. 끝~




저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

[Junit] java.lang.NoClassDefFoundError: Could not initialize class org.springframework.beans.factory.BeanCreationException

TEST/JUint 2014.01.06 11:51
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

[본 사진은 아래의 내용과 무관 합니다. 그림이 없는 것보단 나아서..ㄷㄷ]

Junit은 말그래도 Unit 테스트 이다.. Unit 테스트 답게 리소스를 사용하는게 맞을 것 같다.

그렇지 아니하면 아래와 같이 메모리가 부족하여..오류가 난다.^-^;;

전체의 리소스를 잡는것이 아니라 해당 유닛 테스트를 위해 scope을 줄여서 테스트를 해야 빠르고

쉽게 개발을 할 수 있을 것이다.


<< 오류 >>

java.lang.NoClassDefFoundError: Could not initialize class org.springframework.beans.factory.BeanCreationException

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)

at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)

at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)

at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)

at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)

at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:103)

at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)

at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228)

at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124)

at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148)

at  블라블라~~


 



<< 해결방법 >>

-Xss2m

-Xms256m

-Xmx512m

-XX:PermSize=256m

-XX:MaxPermSize=512m 

 


저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Server node별 instance명 구하기

TEST/JUint 2013.08.20 09:07
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

 

  전제 :

      1) Was Server의 instance명이 VM Agument에 설정이 되어있어야 한다.

      2) "classpath:spring/context/context-properties.xml" 에서 config.properties가 연결되어있어야 함. 

  

# 선 셋팅 작업

1)     Local test   Vm argument server명 입력 : -Dserver="acetServer11"

   => # Run 할 때 설정에서 vm argument를 넣어줘야한다는거~!(in eclipse)

2)     config.properties에 아래 내용 추가

#instance name

node.instance.name=${server}

 

# Junit Test 소스

package com.kt.oss.pcp.acet;

import static org.junit.Assert.*;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

 

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = {

        "classpath:spring/context/context-properties.xml"

       

        })

 

public class PropertyTest {

          

           @Value(value="${node.instance.name}")

           private String serverName;

 

           @Test

           public void getPropertiesTest() {

                     System.out.println("=======test start==============");

                     System.out.println("serverName=>"+this.serverName);

           }

}

 

# 결과 : serverName=>acetServer11

 

- 끝 -

 

 

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Junit Resource

TEST/JUint 2013.07.05 17:40
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

 

JUnit 테스트를 하려고 했을 때 혼돈이 되었던 내용이다.

Resource는 어디에 것을 써야 할까???

 

구성은 보통 maven 프로젝트를 사용 한다면

 

main / test 로 나뉘어진다.

 

java build path를 보면 source쪽에 보면 알 수 있다.

 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
  "classpath:spring/context/context-common.xml",
  "classpath:spring/context/context-aspect.xml",
  "classpath:spring/context/context-test-datasource.xml",  
  "classpath:spring/context/context-test-mybatis.xml",
  "classpath:spring/context/context-properties.xml",  
  "classpath:spring/context/context-test-transaction.xml"
  })

 

위와 같이 context 파일을 main쪽과 test쪽 병행하여 사용 할 수 도있고

입맛에 따라 하면 될 것 이다. 상황에 맞게^-^good~

 

즉, context를 기준으로 했을 때

1) main쪽의 리소스를 전부 사용하거나

2) 몇가지만 test로 하고 나머지는 main쪽을 사용!

3) 전부 test 리소스로! 하는 경우가 있다.

 

단, mybatis와 spring을 쓰고 있다면..mybatis는 예민한 녀석이다....

 

mapper쪽을 main과 test에 같은 mapper를 사용하고 있다면..2 datasource를 사용 하였을 때 에러가 날 것이다.

 

더보기

 

 

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

TDD(테스트 주도 개발)

TEST/JUint 2013.04.16 01:31
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


테스트 주도 개발..!
우선 TDD란 무엇인지 알아보자^-^

프로그램을 작성하기 전에 테스트부터 먼저하라!
(Test the program before you write it)
- Kent Beck -

말 그대로 테스트 부터 하는 것이다.

테스트 주도 개발의 목표는?
Clean code that works
(잘 동작하는 깔끔한 코드)
- Ron Jeffries -







저작자 표시 비영리 변경 금지
신고

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바