개발하다보면 내가 잘 했나? 하는 의구심이 항상 든다.
그래서 개발 단계마다 테스트를 거치곤 하는데, 이때 내가 제대로 개발했는지, 기능이 정상적으로 작동되는지 확인한다.
1. 테스트를 진행할 패키지 생성
먼저, 테스트만 따로 진행할 패키지를 만들어 준다. 이렇게 하면 테스트 케이스만 따로 작성하여 분류할 수 있고 여러 테스트를 한번에 실행할 수도 있다.
보통 src/test/java 하위 폴더에 생성하고, 테스트임을 알아보기 쉽게 클래스명 뒤에 Test를 붙여주면 좋다.
또한, 테스트가 실행될 클래스가 포함된 패키지를 따로 생성해주면 패키지별로 테스트를 수행하기 편하다.
예를 들어, src/main의 repository 패키지의 MemoryMemberRepository에 대한 테스트를 진행하고자 하면 아래와 같이 생성하면 된다.
2. @Test
테스트 클래스를 생성했다면, 테스트 클래스 안에 테스트를 진행할 함수에 @Test 어노테이션을 붙여주면 된다.
HelloSpringApplicationTests.java
public class MemoryMemberRepositoryTest {
MemoryMemberRepository repository = new MemoryMemberRepository();
@Test
public void save() {
Member member = new Member();
member.setName("test");
repository.save(member);
Member result = repository.findById(member.getId()).get();
System.out.println("result = " + (result==member));
}
}
위의 save()함수는 회원가입을 테스트하는 함수이다.
Member 객체는 회원정보(회원번호, 회원이름)으로 구성되어 있으며,
MemoryMemberRepository 객체는 회원정보를 조작(추가, 수정, 삭제, 확인 등) 하는 함수로 이루어져 있다.
즉, save() 함수는 member 인스턴스로 생성한 회원이름을 repository 인스턴스에 저장하고 저장이 잘 되었는지 확인하는 함수이다.
테스트가 성공적으로 완료되면(회원가입이 성공하면) System.out.println을 통해 결과를 확인할 수 있다.
3. 테스트 결과 확인 방법
위에서는 System.out.println을 통해 결과를 확인했지만, 다른 방법으로도 결과 확인이 가능하다.
(1) assertEquals
@Test
public void save() {
...
...
Assertions.assertEquals(member, result);
}
Assertions는 Junit에서 제공하는 테스트 라이브러리이다.
Junit Assertions 공식문서 ▼
https://www.baeldung.com/junit-assertions
Assertions in JUnit 4 and JUnit 5 | Baeldung
A look at assertions in both JUnit 4 and 5.
www.baeldung.com
assertEquals는 두 객체가 같은지 확인해준다.
(2) assertThat
테스트 성공을 확인하기 위해 아래와 같은 메소드를 사용할 수도 있다.
@Test
public void save() {
...
...
assertThat(member).isEqualTo(result);
}
4. 테스트의 의존관계
테스트를 진행하다보면 여러가지 테스트를 한 클래스에서 진행해야 할 때도 있다.
아래와 같이 회원가입, 원하는회원찾기, 모든회원찾기 3가지 테스트 메소드가 있다고 하자.
public class MemoryMemberRepositoryTest {
MemoryMemberRepository repository = new MemoryMemberRepository();
@Test
public void save() {
Member member = new Member();
member.setName("test1");
repository.save(member);
Member result = repository.findById(member.getId()).get();
assertThat(member).isEqualTo(result);
}
@Test
public void findByName() {
Member member1 = new Member();
member1.setName("test1");
repository.save(member1);
Member member2 = new Member();
member2.setName("test2");
repository.save(member2);
Member result = repository.findByName("spring1").get();
assertThat(result).isEqualTo(member1);
}
@Test
public void findAll() {
Member member1 = new Member();
member1.setName("test1");
repository.save(member1);
Member member2 = new Member();
member2.setName("test2");
repository.save(member2);
List<Member> result = repository.findAll();
assertThat(result.size()).isEqualTo(2);
}
}
각각의 테스트를 진행하면 성공하지만 클래스 전체를 테스트하면 아래와 같은 결과가 나온다.
테스트는 서로 의존적으로 작성하면 안된다. 다른 함수로 인해 테스트 대상 함수가 영향을 받지 않게 독립적으로 작성해야 한다는 것이다.
이를 해결하기 위해서는 테스트를 진행할때 마다 @AfterEach를 통해 이전 테스트를 초기화 시켜주어야 한다.
@AfterEach는 @Test가 끝날때마다 실행된다.
public class MemoryMemberRepositoryTest {
@AfterEach
public void afterEach() {
repository.clearStore();
}
MemoryMemberRepository repository = new MemoryMemberRepository();
@Test
public void save() {
Member member = new Member();
member.setName("spring");
repository.save(member);
Member result = repository.findById(member.getId()).get();
assertThat(member).isEqualTo(result);
}
@Test
public void findByName() {
...
}
@Test
public void findAll() {
...
}
}
위의 코드를 보면 각 테스트가 끝날때마다 @AfterEach를 통해 회원정보를 초기화 시켜주고 있다.
위를 활용하여 메모리/DB에 있는 데이터를 삭제하여 초기화 시켜줄 수 있다.
테스트는 각각 독립적으로 실행되어야 하며, 의존관계의 테스트는 좋은 테스트가 아니다.
'개발' 카테고리의 다른 글
[Spring Boot] java error: release version 17 not supported (0) | 2023.07.06 |
---|---|
[Spring Boot] 동적 웹 페이지 개발 - API (0) | 2023.06.27 |
[Spring Boot] 동적 웹 페이지 개발 - MVC 패턴 (0) | 2023.06.27 |
[Spring Boot] 정적 웹 페이지 개발 (0) | 2023.06.27 |
[Spring Boot] Gradle 설정과 라이브러리 (0) | 2023.06.27 |