[Spring Framework] 12강 - JUnit4 & Spring-Test

seb Incode·2022년 4월 19일
1

Spring Framework

목록 보기
12/22
post-thumbnail

학습 내용

  • JUnit4 테스팅과 스프링 테스트

학습 목표

  • 스프링에서 테스팅 방식과 패턴을 사용해 테스팅을 수행한다.
  • 스프링 테스트 프레임워크를 사용해서 테스트를 수행할 수 있다.

JUnit을 사용한 DI 클래스 테스트

JUnit의 개요

  • Java에서 독립된 단위테스트(Unit Test)를 지원해주는 프레임워크이다.
  • 단위테스트란?
    - 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차, 즉 모든 함수와 메소드에 대한 테스트 케이스(Test Case)를 작성하는 절차를 말함
    • JUnit은 보이지 않고 숨겨진 단위 테스트를 끌어내어 정형화시켜 단위테스트를 쉽게 해주는 테스트 지원 프레임워크임

Spring에서 테스트한다는 것은, 스프링 컨테이너에 올라와 있는 Bean들을 테스트하는 것입니다.
JUnit을 사용하면 스프링 컨테이너를 띄울 수 있고, 그 위에 올라가 있는 Bean들을 테스팅할 수 있습니다.

JUnit의 특징

  • TDD의 창시자인 Kent Beck과 디자인 패턴 책의 저자인 Erich Gamma가 작성함.
  • 단정(assert) 메서드로 테스트 케이스의 수행 결과를 판별함
    예) assertEquals(예상 값, 실제 값)
  • jUnit4부터는 테스트를 지원하는 어노테이션을 제공함
    @Test @Before @After
  • 각 @Test 메서드가 호출할 때 마다 새로운 인스턴스를 생성하여 독립적인 테스트가 이루어지도록 함

jUnit은 아직까지도 가장 많이 사용되는 단위 테스트 프레임워크입니다.
assert()가 jUnit의 대표적인 기능입니다. 이 메소드를 사용해서 테스트가 정상적인지 아닌지를 식별할 수 있습니다.

@Test 어노테이션을 메소드에 마킹하면, 그 메소드의 단위 테스트가 수행됩니다.
나머지는 밑에 다시 상세히 적어놓았습니다.

jUnit에서 테스트를 지원하는 어노테이션

@Test

  • @Test가 선언된 메소드는 테스트를 수행하는 메소드가 됨
  • jUnit은 각각의 테스트가 서로 영향을 주지 않고 독립적으로 실행됨을 원칙으로 하므로 @Test마다 객체를 생성함

@Ignore

  • @Ignore가 선언된 메소드는 테스트를 실행하지 않게 함

@Before

  • @Before가 선언된 메소드는 @Test 메소드가 실행되기 전에 반드시 실행됨
  • @Test메소드에서 공통으로 사용하는 코드를 @Before 메소드에 선언하여 사용하면 됨.

[ @Test ]
이 어노테이션이 선언된 메소드는 테스트 단위가 됩니다.

[ @Ignore ]
테스트가 이미 끝나서 더이상 테스트가 필요없을 때 선언하는 어노테이션입니다.

[ @Before ]
대부분 set-up 작업할 때 붙이는 어노테이션입니다.

@After

  • @After가 선언된 메소드는 @Test 메소드가 실행된 후 실행됨

@BeforeClass

  • @BeforeClass 어노테이션은 @Test메소드 보다 먼저 한번만 수행되어야 할 경우에 사용하면 됨

@AfterClass

  • @AfterClass 어노테이션은 @Test 메소드보다 나중에 한번만 수행되어야 할 경우에 사용하면 됨.

테스트 관련 어노테이션에 "Class"가 붙으면 딱 한 번만 수행됩니다.

각 테스트 케이스가 수행되기 전에 @Before 메소드가 수행되고, 각 테스트 케이스가 수행되고 난 후에는 @After 메소드가 실행됩니다.

@BeforClass와 @AfterClass는 단위 테스트가 수행 전, 수행 후에 한 번 수행됩니다.

테스트 결과를 확인하는 단정(assert) 메서드

assert 메소드들을 사용해서 테스트가 성공했는지 실패했는지 확인합니다.

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

  • @RunWith는 jUnit 프레임워크의 테스트 실행방법을 확장할 때 사용하는 어노테이션임
  • SpringJUnit4ClassRunner라는 클래스를 지정해주면 jUnit이 테스트를 진행하는 중에 ApplicationContext를 만들고 관리하는 작업을 진행해줌
  • @Runwith 어노테이션은 각각의 테스트 별로 객체가 생성되더라도 싱글톤(singleton)의 ApplicationContext를 보장함

jUnit를 좀 더 쉽게 사용할 수 있도록 Spring에서 제공하는 라이브러리가 있습니다. Spring Test 라이브러리를 사용하면 테스트에서 매번 수행해야하는 컨테이너를 로딩해야하는 작업과, DL 작업을 생략할 수 있습니다.
먼저 @RunWith 어노테이션을 붙여줍니다.

  • 스프링 빈(Bean) 설정 파일의 위치를 지정할 때 사용되는 어노테이션임
  • 스프링DI에서 사용되는 특별한 어노테이션임
  • 해당 변수에 자동으로 빈(Bean)을 매핑해줌
  • 스프링 빈(Bean) 설정 파일을 읽기 위해 굳이 GenericXmlApplicationContext를 사용할 필요가 없음

@ContextConfiguration() 의 파라미터로 스프링 빈 설정 파일을 넣어주면 테스트 케이스를 실행시킬 때 마다 파일을 로딩시켜주는 역할을 합니다.

실습

1. jUnit4 테스트

먼저 jUnit를 사용하기 위해서 pom.xml에 Dependency를 추가해야합니다.

https://mvnrepository.com/ 에서 "junit"를 검색해서 태그를 넣어줍니다.

↑ 우리는 ArticleDAO 클래스의 selectArticleById()를 테스트할 겁니다.

↑ src/test/java에 kr.co.acompp.hello.dao 패키지를 생성합니다.
↑ 만든 패키지 안에 ArticleDAOJUnitTest 클래스를 생성합니다.
↑ 만든 클래스 안에 selectArticleById()를 테스트할 메소드를 작성합니다. 스프링 컨테이너 불러오고, 빈 DL 작업 후, 테스트 할 메소드를 호출한 후, 리턴값을 assert()으로 검사해봅니다.

↑ 테스팅을 돌려봅니다. 우클릭 -> Run as -> JUnit Test를 누릅니다.

↑ 초록색으로 뜨면 테스트 성공입니다.

↑ 이번엔 이 메소드를 테스트 해봅시다.

↑ 테스트 메소드를 작성합니다. 아까 테스트 메소드와 거의 흡사합니다만, insertArticle()은 무언가를 리턴하는 과정이 없어서 사실상 하나마나한 테스팅이긴 하지만.. 빅 픽ㅊ ㅕ를 위해서 일단 테스팅 코드를 작성합니다.

↑ 테스트 결과입니다. 2개의 단위테스트를 했다고 나와 있네요.

↑ 이번에는 @Ignore를 활용해보겠습니다.
↑ 방금 작성했던 테스트 메소드에 @Ignore를 붙이고 다시 돌려보겠습니다.

↑ 두 개의 테스트 중에서 1개를 skip했다고 말해줍니다.

이런식으로 JUnit를 활용해서 테스팅 하시면 됩니다.
그런데... 아까 두 메소드에 겹치는 코드가 너무 많아보입니다ㅜㅜ
스프링 컨테이너를 부르는 행위라던지.. DL작업이라던지..
공통 작업을 묶어볼 수는 없을까요?


↑ 공통 작업 코드들을 setup()에 다시 작성합니다. 그리고 @Before 어노테이션을 붙여줍니다.
↑ 기존 테스트 메소드들엔 공통 작업 코드들을 지워줍니다.

다시 돌려보겠습니다.

↑ 잘 돌아갑니다.

2. Spring-Test

이제 JUnit를 더 간편하게 사용하는 Spring Test 라이브러리를 사용해보겠습니다.

↑ 먼저, 메이븐 프로젝트 설정파일(pom.xml)에 spring test 라이브러리를 추가합니다.
이때, spring framework 버전과 동일하게 해주세요.
안그러면 initailizationError 납니다 ㅠ

↑ ArticleDAOSpringTest 클래스 파일을 새로 생성해서 작성했습니다.
↑ @RunWith(SpringJUnit4ClassRunner.class) 어노테이션으로 "스프링 컨테이너를 생성해줘"를 시전할 수 있습니다.
↑ @ContextConfiguration("빈 설정 파일 경로") 어노테이션으로 빈 설정 파일 경로를 지정해줍니다.
↑ @Autowired 어노테이션을 참조 객체에 붙여줍니다.
↑ 테스트 메소드 2개를 작성합니다. 아까와 내용은 동일합니다. @Test 어노테이션 까먹으면 안됩니다.

↑ 돌려보면 잘 돌아갑니다.

요약

스프링에서 단위 테스트 하기 좋은 프레임워크는 JUnit4이다.
@Test, @Before, @Ignore 등의 어노테이션을 활용해서 작성한다.
Assert의 여러가지 메소드를 사용해서 테스트 성공 여부를 확인한다.

JUnit4를 더 간편하게 사용할 수 있도록 해주는 것이 spring test 라이브러리이다.
@Runwith(), @ContextConfiguration()으로 스프링 컨테이너를 설정할 수 있다.

1개의 댓글

comment-user-thumbnail
2024년 8월 6일

세상에... 진짜 정말 너무너무 감사합니다... initailizationError 에러 나길래 검색해봐도 라이브러리 추가를 안했거나 의존성 주입을 안 했거나 JUnit 버전이 다르거나 경로 설정을 잘못 했거나 어쩌고... 아무튼 그런 내용만 나오길래 머리 쥐어뜯으면서 내내 헤맸는데 다른 건 다 스프링 버전에 맞춰놓고 스프링 테스트만 수정 안 해서 그런 거였어요ㅠㅠㅠㅠ

답글 달기