효율적인 테스트2

언젠간·2022년 8월 27일
0

토비의스프링

목록 보기
13/16

좋은 테스트 만들기

  • 모든 테스트는 실행 순서와 상관없이 독립적으로 항상 동일한 결과를 낼 수 있어야 함(일관성).
  • 부정적인 케이스를 먼저 만드는 습관을 길러야 함.
  • 테스트 주도 개발(=테스트 우선 개발 TDD). 만들고자 하는 기능의 내용을 담고 있으면서, 만들어진 코드도 검증해 줄 수 있도록 테스트 코드를 먼저 만들고, 테스트를 성공하게 해주는 코드를 작성.
  • 테스트 코드도 리팩토링 하기
  • 중복되는 코드 제거
    • @Before : @Test 메소드가 실행되기 전에 먼저 실행돼야 하는 메소드 정의
    • @After : @Test 메소드가 실행된 후에 실행돼야 하는 메소드 정의
	private UserDao dao; //인스턴스 변수
    
	@Before //-> 메소드 호출 필요 없이 알아서 실행됨
	public void setUp() {
		ApplicationContext ac = new GenericXmlApplicationContext("applicationContext.xml");
		this.dao = ac.getBean("userDao", UserDao.class);
	}
  • 픽스처 : 텍스트를 수행하는데 필요한 정보나 오브젝트. @before에서 생성하면 좋음.
	private UserDao dao;
	private User user1;
	private User user2;
	private User user3;
	
	@Before
	public void setUp() {
		ApplicationContext ac = new GenericXmlApplicationContext("applicationContext.xml");
		this.dao = ac.getBean("userDao", UserDao.class);
		
		this.user1 = new User("gyumee", "박성철", "springno1");
		this.user2 = new User("leegw700", "이길원", "springno2");
		this.user3 = new User("bumjin", "박범진", "springno3");
	}
  • @BeforeClass 스태틱 메소드 활용. 테스트 클래스 전체에 걸쳐 딱 한번만 실행됨.
    - 의존성 및 어노테이션 추가
    • @SpringJunit4ClassRunner라는 JUnit용 테스트 컨텍스트 프레임워크 확장 클래스를 지정해주면 JUnit이 테스트를 진행하는 중에 테스트가 사용할 애플리케이션 컨텍스트를 만들고 관리해 줌
    • 여러 개의 테스트 클래스가 있는데 모두 같은 설정파일을 가진 애플리케이션 컨텍스트를 사용하면, 모두 같은 애플리케이션 컨텍스트를 공유함
    • @Autowired : 테스트 컨텍스트 프레임워크는 변수 타입(ex. UserDao dao;)과 일치하는 컨텍스트 내의 빈을 찾고, 일치하는 빈이 있으면 인스턴스 변수에 주입해 줌(수정자, 생성자 같은 메소드 없어도 됨)
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-test</artifactId>
	</dependency>
  	@RunWith(SpringJUnit4ClassRunner.class)
  	@ContextConfiguration(locations="/applicationContext.xml")
  	public class UserDaoTest {
    	@Autowired 
		private ApplicationContext ac;
        
        @Autowired
		UserDao dao; //UserDao 타입 빈을 직접 DI받음
  		...
  	}
  • @DirtiesContext : 해당 클래스의 테스트에서 애플리케이션 컨텍스트의 상태를 변경한다는 것을 알려주며, 이 애노테이션이 붙은 테스트 클래스에는 애플리케이션 컨텍스트를 공유 하지 않음

  • 테스트를 위한 별도의 DB 설정 구성

정리

  • DI를 위해 반드시 컨테이너가 필요한 것은 아님. 직접 DI 해줘도 됨. 하지만 우선적으로 스프링 컨테이너 없이 테스트 할 수 있는 방법을 고려해야 함. 수행 속도가 가장 빠르고 간결하기 때문.
	dao = new UserDao();
    DataSource dataSource = new SingleConnectionDataSource("jdbc://mysql://localhost/test", "test", "test", true)
    dao.setDataSource(datasource);
  • 하지만 복잡한 의존관계를 가지고 있다면, 스프링의 설정을 이용한 DI 방식의 테스트가 유리
  • 예외적인 의존관계를 강제로 구성해야 한다면, 컨텍스트에서 DI받은 오브젝트에 다시 테스트 코드로 수동 DI해서 테스트 하면 됨. 테스트 메소드나 클래스에 @DirtiesContext 사용.
profile
코딩왕이될사나이

0개의 댓글