ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TDD
    자바 2024. 1. 22. 20:57

    TDD (test-driven development)  - 테스트 주도 개발

    소프트웨어 개발 방법론 중의 하나로, 선 개발 후 테스트 방식이 아닌 선 테스트 후 개발 방식의 프로그래밍 방법을 말한다. 다시 말해 먼저 자동화된 테스트 코드를 작성한 후 테스트를 통과하기 위한 코드를 개발하는 방식의 개발 방식을 말한다.

     

    TDD를 이용한 개발방법

    1. 테스트 케이스 작성
      • 만들고 싶은 기능을 점검할 테스트 코드를 작성한다. 이때, 아직 기능 코드를 구현하지 않았으므로 테스트 결과는 실패로 반환된다. 실패하는 테스트를 가장 빠르게 구현하는 방법은 아무 값이나 반환하도록 하는 것이다.
    2. 테스트 케이스를 통과하는 코드 작성
      • 테스트 코드를 만족시킬 수 있는 기능을 구현한다. 테스트 통과를 최우선으로 생각하며 작업한다. 즉 단위 테스트를 통과할 수 있을 정도의 최소한의 코드만 작성한다.
    3. 작성한 코드 리팩토링
      • 기능의 성능이 향상되며, 재사용성이 좋고, 가독성이 좋은 코드로 기능 코드를 개선한다. 테스트 코드를 통해 다시 기능 코드를 점검한다. → 기능 테스트가 완전해질 때까지 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();
            }
        }
    }

    🔎어노테이션 

    1. @SpringBootTest:
      • 스프링 부트 애플리케이션 테스트를 위한 어노테이션입니다. 이 어노테이션을 사용하면 스프링 애플리케이션 컨텍스트를 로드하여 테스트를 수행할 수 있습니다.
    2. @ExtendWith(SpringExtension.class):
      • JUnit5에서 스프링과 통합하여 사용하기 위한 어노테이션입니다. 이 어노테이션을 사용하면 테스트가 실행될 때 스프링의 확장 기능을 사용할 수 있습니다.
    3. @Autowired:
      • 스프링에서 의존성 주입을 수행하는 어노테이션입니다. 이 어노테이션을 통해 CommentService, AccountRepository, BoardRepository 등의 빈(Bean)을 주입받습니다.
    4. @BeforeEach:
      • 각 테스트 메서드가 실행되기 전에 실행되는 메서드입니다. 주로 초기화 작업이나 더미 데이터를 준비하는 용도로 사용됩니다.
    5. @Rollback(value = false):
      • 테스트 메서드 실행 후에 롤백 여부를 설정합니다. @Rollback(false)로 설정하면 실제 데이터베이스에 변경사항이 반영됩니다.
    6. @Test:
      • JUnit에서 테스트 메서드를 선언하기 위한 어노테이션입니다. commentSave 메서드는 CommentService의 writeComment 메서드를 테스트하는 메서드로 예상됩니다.
    7. 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
Designed by Tistory.