Back-end/JAVA,Spring

JUnit Test 자바 단위테스트란? feat. 서비스 단에서 DB연결 테스트해보기.

cheersHena 2022. 6. 5. 01:13
반응형

junit 자바 단위테스트란?

Java에서 독립된 단위테스트 (Unit test)를 지원해주는 프레임워크.

* 단위테스트란?

특정 소스코드의 모듈이 의도한 대로 작동하는지 검증하는 테스트이다.

즉, 함수 및 메소드에 대한 테스트를 하는 작업.

Spring에서 단위테스트를 하는것은 스프링 커네이너에 올라와있는 Bean들을 테스트 하는 것이다.

Junit을 사용하면 스프링 컨테이너를 띄워, 그 위에 올라가있는 Bean을 테스트 할 수 있다.

 

JUnit 특징

  • 단정 메서드(assert)로 테스트 케이스의 수행결과를 판별.

 ex) assertEquals(예상값, 실제값)

  assert()는 junit의 대표적인 기능이다. 이 메소드를 사용하여 테스트가 정상인지 아닌지 판별한다.

  • Junit 4부터는 테스트 어노테이션을 제공

 ex) @Test @Before @After

  • 각 @Test 어노테이션 메서드 호출 시 새로운 인스턴스를 생성하여 독립적인 테스트가 이루어지도록 함.

 

JUnit 테스트 어노테이션

@Test

 - 메서드에 @Test를 선언 : 테스트를 수행하는 메소드라는 의미

    - JUnit은 각각의 테스트가 서로 영향을 주지않고 독립적으로 실행되는 것을 원칙으로 하기때문에 @Test메소드마다 객체를 별도로 생성한다.

@Before

   - @Before 어노테이션이 선언된 메소드는 @Test 메소드가 실행되기 전 반드시 실행한다.

   - 보통 공통으로 사용되는 set-up 코드를 @Before메소드에 선언한다. @Before은 각 메서드 전에 실행되는데, 같은 환경에서 여러 메소드를 테스트하는 경우 단위테스트 전체 수행 전 @BeforeClass 어노테이션 선언으로 1번만 선언하면 된다

 

@After

  - @After 어노테이션이 선언된 메소드는 @Test 메소드가 실행된 후 반드시 실행한다. 마찬가지로 전체 수행 후에는 @AfterClass 어노테이션 선언

 

@Ignore

  - @Ignore 어노테이션을 선언하면 테스트를 Skip한다.

 

 

JUnit4 테스트 방법 

  1. junit을 사용하기 위해 pom.xml에 Dependency 추가.(환경에 따라 맞는 버전으로 추가 후 메이븐 업데이트)

 (https://mvnrepository.com/artifact/junit/junit/4.13.2)

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>

2. src/test/java

이하에 테스트 패키지를 생성후, 테스트 클래스 생성.

 

3. 테스트 메소드 작성.

스프링 컨테이너 객체 생성, 빈 의존성 주입 작업 후, 테스트할 메소드를 호출한 리턴값을 assert()로 검사한다.

(system out으로 console에 찍어볼수도 있겠다)

 

4. 테스트 실행 

테스트하고자 하는 메소드에 @Test 어노테이션을 선언해주면 파일 우클릭> Run as > Junit Test 버튼이 활성화 된다. 

성공 시 결과화면 ) 녹색 바로 표시.

 

에러 시 결과화면 ) 적색 바와 에러로그 표시.

 

 

Spring-Test에서 테스트를 지원하는 어노테이션

 

@RunWith(SpringJUnit4ClassRunner.class)

-SpringRunner클래스는 JUnit Test에서 Spring Application Context 에 빈을 등록하고 @Autowired 어노테이션을 지원한다.

 

@ContextConfiguration({"파일경로"})

-스프링 빈 설정파일의 위치를 지정하는 어노테이션

ex) @ContextConfiguration({"classpath:config/*.xml"})

파라미터로 스프링 빈 설정파일 경로를 넣어주면, 테스트 케이스를 실행할때 마다 설정파일을 로딩시켜준다.

@Autowired

-스프링 의존성주입(DI)을 대신해준다.

-해당 변수에 자동으로 빈을 매핑해 준다.

 

 

서비스 단 - DB연결 단위 테스트 해보기.

 

여기서는 스프링 기본구조인 controller-service-dao가 아닌, 서비스 단에서 디비까지 정상적으로 연결 및 소스에 문제가 없는지

서비스 모듈을 테스트 한다. (service <-> dao <->DB)

테스트 클래스를 만들어서 테스트하고자 하는 서비스를 호출해서 결과값이 system out으로 잘 찍히는지 테스트 해 보겠다.

  • 테스트 클래스: Test.class
  • 테스트 할 서비스: junitTestService.class 내의 selectDate() 모듈.

junitTestService class 의 selectDate()에서는 dao를 호출하여, 현재 날짜를 구하는 쿼리를 날린다고 가정한다.

 

예제소스)

@RunWith(StringJUnit4ClassRunner.class) //스프링컨테이너 생성 및 관리
@ContextConfiguration({"classpath:config/*.xml"})//설정 파일 로딩
public class Test{

 @Autowited
 junitTestService test; //테스트 하고자하는 서비스 DI

 @Test
 public void testSelect(){
   String result = test.selectDate();
   System.out.println("result:"+ result);
 }

}
result: 20220505

 

*스프링 컨테이너 객체 수동 생성

ApplicationContext appContext = new ClassPathXmlApplicationContext("classpath:config/*.xml");

> 요부분을 @Runwith(SpringJUnit4classRunner.class) 와 @contextConfiguration({classpath:config/*.xml}) 어노테이션이 대신 해준다.

 

*서비스 수동 의존주입

testService test = appContext.getBean("testService", testService.class); //DI

> @Autowired 어노테이션이 대신 해준다.

 

 

그렇다면, 어노테이션없이 수동으로 설정해보자.

public class Test{
 @Test
 public void testSelect(){
  
  //스프링 컨테이너 객체 생성 (@RunWith / @ContextConfiguration) 
  ApplicationContext appConxt = new ClassPathXmlApplicationContext("classpath:config/*.xml"); 
  //테스트 서비스 의존 주입 (@Autowired)
  junitTestService test = appConxt.getBean(junitTestService.class);

   String result = test.selectDate();
   System.out.println("result:"+ result);
 }

}
result: 20220505

같은 결과가 나오는 것을 확인 할 수 있다. 

 

 

예제소스에서는 select 메소드이기 때문에 결과값을 찍어볼 수 있지만, insert/update/delete 메소드의 경우 결과값이 count로 리턴되기 때문에 실패 시 0, 1이상 성공으로 체크하였고, 에러가 발생하는 경우 로그가 남기 때문에 어느 부분에서 에러가 발생하는지 확인 할 수 있다. (log4j.xml 설정필요)

확실히 수동방식보다 어노테이션을 사용하면 소스가 확 줄어드는 것을 확인할 수 있다. 이렇게 스프링 어노테이션은 개발자의 일을 덜어준다. 보통은 웹개발을 주로 하면서 거의 controller - view 가 존재 했기 때문에 화면단에서 테스트를 진행하는 경우가 많았는데 모듈 단독 개발을 하면서 jUnit 테스트를 활용해보았다.

스프링 설정에서 조금 헤맸는데 스프링 컨테이너 설정과 주입과정을 명확히 하는데 도움이 많이 된다.

앞으로 웹 서비스 개발에서도 간편하고 유용하게 사용할 수 있을 듯. .

 

반응형