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 테스트 방법
- 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 테스트를 활용해보았다.
스프링 설정에서 조금 헤맸는데 스프링 컨테이너 설정과 주입과정을 명확히 하는데 도움이 많이 된다.
앞으로 웹 서비스 개발에서도 간편하고 유용하게 사용할 수 있을 듯. .
'Back-end > JAVA,Spring' 카테고리의 다른 글
Spring DI 스프링 의존성 주입 3가지 방법 (2) | 2022.08.04 |
---|---|
스프링 Service에서 ServiceImpl를 사용하는 이유 ? (0) | 2022.08.03 |
Tomcat Dymanic Web Module 버전 오류 해결 (0) | 2022.04.21 |
Spring boot 스프링 부트란? (4) | 2021.09.20 |
[java build] ANT란? (feat. MAVEN과 차이점? ) (0) | 2021.08.25 |