데브코스 W5D1

코끼릭·2022년 4월 11일
0

TIL

목록 보기
15/36

Testing Level

  • Unit Testing: 프로그램의 기본 단위인 모듈이 정해진 기능을 수행하는지 테스트 하는 것을 의미한다.
  • Integration Testing: 서로 다른 모듈의 상호작용이 잘 이루어는지 테스트 하는 것을 의미한다.
  • Acceptance Testing: 사용자 시나리오에 맞춰 수행하는 테스트로 애자일 개발 방법론 중 하나인 XP에서 사용하는 용어로 누가 어떤 목적으로 무엇을 하는가에 대한 시나리오가
    제대로 수행될 수 있는지 테스트 하는 것을 의미한다.

JUnit

자바에서 사용되는 테스트 프레임워크로 매 단위 테스트시 마다 테스트 클래스의 인스턴스가 생성되어 독립적인 테스트를 가능하게 하고 애노테이션을 통해 테스트 라이프 사이클 관리와 간결한 테스트 코드 작성을 지원한다. Junit 5의 경우 3개의 모듈로 구성이 되어있는데 이 중 Junit Jupiter가 테스트 코드를 발견하고 실행하는 역할을 수행한다.

Unit Test

Junit을 통해 단위 테스트를 실행하면 독립적인 테스트가 모듈 단위로 수행이 되고 Jupiter api의 assert 메소드들을 통해 수행이 가능하다.

Mock(모의 객체)


의존 객체가 사용되는 테스트를 수행할 경우 필요한 의존 객체의 역할을 대신 수행해줄 수 있는 대체 객체를 테스트 대역이라고 한다. 이 테스트 대역은 역할에 따라 세부적으로 나뉘게 되는데 이 중 호출에 대한 기대를 명세하고 내용에 따라 동작하도록 프로그래밍 된 객체를 Mock 객체라고 하고 자바에서는 테스트 프레임워크인 Mockito를 통해 Mock 객체를 사용할 수 있다.

//1. given
VoucherService voucherService = mock(VoucherService.class);
when(voucherService.getVoucher(voucher.getVoucherId())).thenReturn(voucher);

//2. when
voucherService의 메소드가 정상적으로 수행됐는지 테스트하기 위한 동작 코드 

//3. then
//테스트 객체가 주어진 메소드를 수행했는지 확인하는 코드
verify(voucherServiceMock).getVoucher(voucher.getVoucherId());

+ Stub

Mock 오브젝트는 행위 검증(behavior verification)을 사용하고, stub을 포함한 다른 대역들은 상태 검증(state verification)을 사용합니다.

상태 검증 : 메소드가 수행된 후, 객체의 상태를 확인하여 올바르게 동작했는지를 확인하는 검증법입니다.

행위 검증 : 메소드의 리턴 값으로 판단할 수 없는 경우 특정 동작을 수행하는지 확인하는 검증법입니다.

Integration Test

모듈들을 통합하는 단계에서 서로 연동해서 테스트를 수행하게 되는 것을 통합 테스트라고 한다. 단위 테스트와 다르게 모듈들 간의 의존관계를 주입 받아 테스트를 실행하기 때문에 필요한 빈 객체를 주입받아서 테스트를 수행하기 위한 Configuration을 설정해야 한다.

Spring Test

스프링의 구조는 개발과 테스트 환경이 분리되어 있지만 DI를 통해 개발 환경에서 설정한 클래스를 불러와서 빈 객체 간의 의존 관계를 자동으로 주입 받아서 테스트에 필요한 객체를 간편하게 가져올 수 있다. 또한 개발 환경의 빈 객체 설정이 아닌 별도의 Configuration을 불러오는 것 역시 가능해서 편리하게 테스트 환경을 준비할 수 있는 게 가능하다.

//1. 개발 환경의 설정 클래스 사용 예시
@ExtendWith(SpringExtension.class)
@ActiveProfiles("prod")
@ContextConfiguration(classes = {ApplicationConfig.class})
public class AppTest1 {
	@Autowired
    VoucherService voucherService;
}

//2. 개발 환경과 다른 별도의 설정 클래스 사용 예시

//ExtendWith+ContextConfiguration를 통합한 아노테이션
@SpringJUnitConfig(classes = {AppConfig.class}) 
@ActiveProfiles("dev")
public class AppTest2 {
	//별도의 Config 클래스를 설정해놓지 않은 경우에는
	//테스트 클래스의 static한 config 클래스를 사용한다.
    @Configuration
    static class Config {
    	@Bean
        public Voucher voucher() {
        	return new VoucherService();
        }
    }
    
    @Autowired
    VoucherService voucherService;
}
profile
ㅇㅅㅇ

0개의 댓글