TDD

배지원·2022년 10월 21일
0

SPRING

목록 보기
1/4

1. TDD

1. 정의

  • Red 단계에서는 실패하는 테스트 코드를 작성
  • Green 단계에서는 테스트 코드를 성공을 위한 실제 코드 작성
  • Blue 단계에서는 중복 코드 제거, 일반화 등 리팩토링 진행

2. 특징

  • 객체 지향적인 코드 개발
  • 설계 수정시간의 단축
  • 유지보수의 용이성
  • 테스트 문서의 대체 가능

2. Junit이란?

  • 특정 소스코드의 모듈이 의도한 대로 검증하는 데스트로 함수 및 메소드에 대한 테스트를 하는 작업
  • Spring에서 단위테스트는 스프링 컨테이너에 올라와 있는 Bean들을 테스트 하는 것이다.

3. 테스트를 위한 준비단계

1. 기본설정

  • build.gradle파일에서 dependencies부분 안에서 alt+insert를 눌러 add dependency를 통해 스프링을 사용하기 위한 설정인 spring-boot-starter-jdbc와 테스트 실행을 위한 spring-boot-startter-test를 추가해 준다.

2. 어노테이션

  • spring을 테스트 하기 위해서는 몇개의 어노테이션을 추가해줘야 한다.

(1) @ExtendWith - 확장 기능 구현하기

  • 단위 테스트간에 공통적으로 사용할 기능을 구현하여 @ExtendWith를 통하여 Spring에서 적용할 수 있는 기능을 제공한다.

(2) @RunWith(SpringJUnit4ClassRunner.class)

  • SpringRunner클래스는 JUnit Test에서 Spring Application Context 에 빈을 등록하고 @Autowired 어노테이션을 지원한다.
  • JUnit4에서 많이 사용했지만 JUnit5으로 넘어오면서 @ExtendWith으로 바꿔서 사용함

(3) @ContextConfiguration(파일 경로)

  • 스프링 빈 설정파일의 위치를 지정하는 어노테이션

(4) @Autowired

  • 필요한 의존 객체의 타입에 해당하는 bean을 찾아 해당 변수에 주입한다.
  • 테스트 오브젝트가 만들어지고 나면 스프링 테스트 컨텍스트에 의해 자동으로 값이 주입된다.
    @ExtendWith(SpringExtension.class)  // spring에서 테스트 하기 위한 설정
    @ContextConfiguration(classes = UserDaoFactory.class)
    class UserDaoTest {
                       // 싱글톤을 위해 Autowired 사용
       @Autowired      // 새로운 객체를 사용하지 않고 이전에 사용했던 객체의 주소를 그대로 사용한다는 설정
                       // new 객체 생성을 한번만 사용함(고정값)
       ApplicationContext context; // Spring ApplicationContext를 사용하기 위해서는
       // @ExtendWith 과 @ContextConfiguration를 추가해줘야 한다.

(5) @Test

  • 메서드에 사용(테스트를 수행하는 메서드라는 의미)
  • JUnit은 각각의 테스트가 서로 영향을 주지않고 독립적으로 실행되는 것을 원칙으로 하기때문에 @Test메소드마다 객체를 별도로 생성한다.

(6) @Before

  • @Before 어노테이션이 선언된 메소드는 @Test 메소드가 실행되기 전 반드시 실행한다.
  • 보통 공통으로 사용되는 set-up 코드를 @Before메소드에 선언한다. @Before은 각 메서드 전에 실행되는데, 같은 환경에서 여러 메소드를 테스트하는 경우 단위테스트 전체 수행 전 @BeforeClass 어노테이션 선언으로 1번만 선언하면 된다

(7) @After

  • @Test 메소드가 실행된 후 반드시 실행

(8) @Ignore

  • 테스트를 Skip한다.

3. 동작 방식

  • Junit이 하나의 테스트 클래스를 가져와 테스트를 수행하는 방식

(1) 테스트 클래스에서 @Test가 붙은 public이며 void형이고 파라미터가 없는 테스트 메서드를 모두 찾는다.

(2) 테스트 클래스의 오브젝트를 하나 만든다.

(3) @BeforeEach가 붙은 메서드가 있으면 실행한다.

(4) @Test가 붙은 메서드를 하나 호출하고 테스트 결과를 저장해둔다.

(5) @After가 붙은 메서드가 있으면 실행한다.

(6) 나머지 테스트 메서드에 대해 2~5번 반복한다.

(7) 모든 테스트의 결과를 종합하여 돌려준다.


4. CODE

@ExtendWith(SpringExtension.class)  // spring에서 테스트 하기 위한 설정
@ContextConfiguration(classes = UserDaoFactory.class)
class UserDaoTest {
                    // 싱글톤을 위해 Autowired 사용
    @Autowired      // 새로운 객체를 사용하지 않고 이전에 사용했던 객체의 주소를 그대로 사용한다는 설정
                    // new 객체 생성을 한번만 사용함(고정값)
    ApplicationContext context; // Spring ApplicationContext를 사용하기 위해서는
    // @ExtendWith 과 @ContextConfiguration를 추가해줘야 한다.

    @Test
    void addAndSelect() throws ClassNotFoundException, SQLException {
        User user1 = new User("1","홍길동","1234");
        User user2 = new User("2","이순신","4567");
        User user3 = new User("3","세종","7896");

        UserDao userDao = context.getBean("awsUserDao", UserDao.class);     // bean 파일에서 awsUserDao 메서드를 가져온다
      //  UserDao userDao1 = context.getBean("awsUserDao",UserDao.class);      userDao와 같은 객체를 사용함
        
        userDao.deleteAll();
        Assertions.assertThat(0).isEqualTo(userDao.getCount());

        String id = "3";
        userDao.add(user1);
        Assertions.assertThat(1).isEqualTo(userDao.getCount());

        User user = userDao.select(id);

        Assertions.assertThat("Spring").isEqualTo(user.getName());
   //     assertEquals("Spring",user.getName());
    }
}

※ 참고 자료
https://reiphiel.tistory.com/entry/junit5-features2
https://cheershennah.tistory.com/220

profile
Web Developer

0개의 댓글