-
TDD (test-driven development) - 테스트 주도 개발
소프트웨어 개발 방법론 중의 하나로, 선 개발 후 테스트 방식이 아닌 선 테스트 후 개발 방식의 프로그래밍 방법을 말한다. 다시 말해 먼저 자동화된 테스트 코드를 작성한 후 테스트를 통과하기 위한 코드를 개발하는 방식의 개발 방식을 말한다.
TDD를 이용한 개발방법
- 테스트 케이스 작성
- 만들고 싶은 기능을 점검할 테스트 코드를 작성한다. 이때, 아직 기능 코드를 구현하지 않았으므로 테스트 결과는 실패로 반환된다. 실패하는 테스트를 가장 빠르게 구현하는 방법은 아무 값이나 반환하도록 하는 것이다.
- 테스트 케이스를 통과하는 코드 작성
- 테스트 코드를 만족시킬 수 있는 기능을 구현한다. 테스트 통과를 최우선으로 생각하며 작업한다. 즉 단위 테스트를 통과할 수 있을 정도의 최소한의 코드만 작성한다.
- 작성한 코드 리팩토링
- 기능의 성능이 향상되며, 재사용성이 좋고, 가독성이 좋은 코드로 기능 코드를 개선한다. 테스트 코드를 통해 다시 기능 코드를 점검한다. → 기능 테스트가 완전해질 때까지 2, 3의 과정을 반복한다.
각 진영마다 TDD를 담당하는 기술이 있다. Java는 대표적으로 JUnit을 사용한다.
📌JUnit이란?
JUnit이란 자바 프로그램의 단위 테스트를 위한 대표적인 프레임 워크이다.
🔎JUnit 특징
- "@Test"메소드가 호출될 때마다 새로운 인스턴스를 생성하여 독립적 테스트를 수행한다.
- assertXXXX 메소드로 테스트 케이스의 수행 결과를 판단한다.
- 어노테이션을 제공하여 매우 쉽고 간결하게 테스트 코드를 작성하여 실행 가능하다.
- 현재 가장 최신버전은 JUnit 5 이다.
🔎예제 코드
@SpringBootTest @ExtendWith(SpringExtension.class) public class CommentServiceTest { //의존성을 주입 스프링은 객체를 모두 빈으로 관리해서 사용자가 필요할 때마다 //가져와서 사용할 수 있게 만들어줌. -> 의존성 주입 이건 면접에서도 나오는 질문이니 가지고 가자. @Autowired CommentService commentService; @Autowired AccountRepository accountRepository; @Autowired BoardRepository boardRepository; @BeforeEach @Rollback(value = false) //이걸 하면 데이터가 롤백이 된다. public void accountSave() { //회원 생성 Account account = Account.builder() .accountId(1L) /* 이 부분은 스프링 시큐리티 컨텍스트 홀더에서 가져올 수 있을까요? */ .loginId("onionhaseyo") .pwd("nonghyupeunhang") .name("김어진") .belong("우리FISA") .gender(true) .imageUrl("사진URL입니다.-> AWS에 올라간 사진도 전부 String입니다.") .stack("난 스택이 싫어") .portfolio("깃허브url입니다.") .job("백수") .build(); accountRepository.save(account); //게시판 생성 Board board = Board.builder() .boardId(1L) .title("안녕하세요 게시판") .content("이것은 내용입니다.") .build(); boardRepository.save(board); } @Test public void commentSave() { Optional<Account> account = accountRepository.findById(1L); Optional<Board> board = boardRepository.findById(1L); commentService.writeComment(board.get().getBoardId(), account.get().getLoginId()); try { commentService.writeComment(board.get().getBoardId(), account.get().getLoginId()); } catch (RuntimeException e) { e.printStackTrace(); } } }
🔎어노테이션
- @SpringBootTest:
- 스프링 부트 애플리케이션 테스트를 위한 어노테이션입니다. 이 어노테이션을 사용하면 스프링 애플리케이션 컨텍스트를 로드하여 테스트를 수행할 수 있습니다.
- @ExtendWith(SpringExtension.class):
- JUnit5에서 스프링과 통합하여 사용하기 위한 어노테이션입니다. 이 어노테이션을 사용하면 테스트가 실행될 때 스프링의 확장 기능을 사용할 수 있습니다.
- @Autowired:
- 스프링에서 의존성 주입을 수행하는 어노테이션입니다. 이 어노테이션을 통해 CommentService, AccountRepository, BoardRepository 등의 빈(Bean)을 주입받습니다.
- @BeforeEach:
- 각 테스트 메서드가 실행되기 전에 실행되는 메서드입니다. 주로 초기화 작업이나 더미 데이터를 준비하는 용도로 사용됩니다.
- @Rollback(value = false):
- 테스트 메서드 실행 후에 롤백 여부를 설정합니다. @Rollback(false)로 설정하면 실제 데이터베이스에 변경사항이 반영됩니다.
- @Test:
- JUnit에서 테스트 메서드를 선언하기 위한 어노테이션입니다. commentSave 메서드는 CommentService의 writeComment 메서드를 테스트하는 메서드로 예상됩니다.
- commentSave 메서드 내용:
- accountRepository와 boardRepository에서 각각 하나의 더미 데이터를 저장합니다.
- 그 후 commentService.writeComment 메서드를 호출합니다.
'자바' 카테고리의 다른 글
Builder 디자인 패턴 (1) 2024.02.13 전략 디자인 패턴 (0) 2024.02.06 Spring boot3에서 Swagger Springdoc 사용하기 - maven (0) 2024.01.09 java 예외처리 throws와 try ~ catch 차이점 (0) 2023.12.13 stream API + 람다식 (1) 2023.12.12 - 테스트 케이스 작성