Home test코드 유의사항
Post
Cancel

test코드 유의사항

🤫 Junit 작성 시 유의사항

1. Junit의 테스트 코드는 순서를 보장하지않는다.

테스트 실행 순서는 정해져 있지 않기때문에 동시다발적으로 테스트가 돌아간다. 순서를 정하고 싶으면 @Order 를 넣어서 순서를 보장한다.

1
2
3
4
5
6
7
8
9
10
11
12
@Test  
@Order(1)  
public void 책등록_test() {
	// 등록 테스트
}

@Test  
@Order(2)  
public void 책수정_test() {
	// 수정 테스트
}

2. 테스트 하나 실행되면 실행 후 종료시, 데이터가 초기화된다.

하지만 Auto_increment의 값인 Pk는 값이 초기화되지 않는다.


@Transactional

메모리 -> 하드디스크 기본적으로 트랜잭션을 걸어서 rollback하면 메모리의 데이터와 하드디스크의 데이터 모두 다시 돌아간다.

하지만 상단에서 이야기했듯이 pk의 값은 롤백되지 않기때문에 pk를 확인하는 테스트 코드를 짜게 되면 테스트 통과가 되지 않는다. (하드디스크에 데이터가 없더라도 pk는 계속해서 증가하기 때문)

이런 경우, sql에서 아예 하드디스크의 테이블을 드랍해서 완전 초기화 해버린다.

1
2
3
4
5
6
7
@Sql("classpath:db/tableInit.sql") // 이 테스트 실행전 resource 폴더안에 sql 문 실행한다.  
@Test  
public void 책삭졔_test() {  
   // id로 값을 삭제하는 로직
   // id(pk)는 롤백해도 값이 계속 증가하기 떄문에 아예 table 을 drop하는 sql을 작성해서 넣어둔다.
}

  • 심화 그렇다면 update 테스트에서 왜 findAll을 했을때, 왜 2개의 객체가 나왔나?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@BeforeEach // 각 테스트 시작 전에 한번씩 실행  
public void 데이터준비() {  
    String title = "junit";  
    String author = "겟인데어";  
    Book book = Book.builder()  
            .title(title)  
            .author(author)  
            .build();  
    bookRepository.save(book);  
}

   @Test  
public void 책수정_test() {  
    // given  
    Long id = 1L;  
    String title = "junit5";  
    String author = "메타코딩";  
    Book book = new Book(id, title, author);  
  
    // when  
    Book bookPS = bookRepository.save(book);  
  
    // then  
    bookRepository.findAll().stream()  
            .forEach(savedBook -> {  
                System.out.println(savedBook.getId());  
                System.out.println(savedBook.getTitle());  
            });

}

2가지가 하나의 @Transactional 로 묶여있기 때문에 이미 객체 하나가 save되고 테스트 코드에서도 다른 객체 하나가 또 save되기때문에 db에 2개가 들어가져 있는 상태이다.

![[/assets/img/스크린샷 2022-11-03 오후 4.07.06.png]]

그렇기때문에 @sql 로 테이블을 drop 해야 내가 원하는 대로 결과값이 나올 수 있다.

1
2
3
4
5
6
7
8
9
10
@BeforeEach   
public void 데이터준비() {  
   // 데이터 만드는 로직
}

@Sql("classpath:db/tableInit.sql") // 추가
@Test  
public void 책수정_test() {  
    // 수정로직
}

pk로 테스트를 하려면 항상 table drop을 해서 pk 값을 초기화해줘야 하며, 실제 서버로 검증해야하는 상황이라면 id를 통한 테스트를 하면 안된다.

출처: 메타코딩, “Junit 강의”, https://youtu.be/wXPyKGGOLas

This post is licensed under CC BY 4.0 by the author.

origin과 master, 그리고 main

test코드를 작성해야하는 이유