유닛테스트와 E2E테스트

louis220·2021년 6월 29일
0

유닛테스트?

유닛테스트는 컴퓨터 프로그래밍에서 소스코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차.
이를 통해 언제든 코드 변경으로 인해 문제가 발생할 경우, 문제원인을 빠르게 파악하고 바로 잡을 수 있게 한다.

F.I.R.S.T 단위 테스트 원칙이 있으며 아래와 같다.

  • Fast — 유닛 테스트는 빨라야 한다.
  • Isolated — 다른 테스트에 종속적인 테스트는 절대로 작성하지 않는다.
  • Repeatable — 테스트는 실행할 때마다 같은 결과를 만들어야 한다.
  • Self-validating — 테스트는 스스로 결과물이 옳은지 그른지 판단할 수 있어야 한다. 특정 상태를 수동으로 미리 만들어야 동작하는 테스트 등은 작성하지 않는다.
  • Timely — 유닛 테스트는 프로덕션 코드가 테스트를 성공하기 직전에 구성되어야 한다. 테스트 주도 개발(TDD) 방법론에 적합한 원칙이지만 실제로 적용되지 않는 경우도 있다.

E2E 테스트는 환경에 의존하는 테스트이지만, 단위 테스트는 실행 중인 환경에 의존하면 안 되고, 빠르게 실행되어야 한다. E2E 테스트에서는 보통 테스트 데이터베이스를 사용하고, 테스트의 신뢰성이 높지만 속도가 느리다는 단점이 있다.

따라서 유닛테스트를 진행할때는 실제DB를 이용하지 않고 mocking해 진행하도록 한다.

Nestjs 상에서는 jest를 이용해 테스트가 진행되는데 nestjs공식문서와 jest사용법을 공부하여 구현한 과정을 적어보고자 한다.

유닛테스트를 진행하기 위해서는 보통 데이터베이스의 연결을 피한다. 테스트케이스가 독립적이여야 하고 테스트의 속도가 빨라야 하기 때문이다. 하지만 classes가 repository에 의존되어 있을 수 있기 때문에 이를 해결하기 위한 방법으로는 mock repositories 가 있다. mockRepository의 사용을 위해서 우리는 custom providers를 설정해야 한다.

	@Module({
    		providers: [
		UsersService,
		{
  		provide: getRepositoryToken(User),
  		useValue: mockRepository,
		},
    	 	],})
       	export class UsersModule {}

이렇게 작성하면 mockRepository는 userRepository처럼 사용될 것이다. 어디서든지 @InjectRepository decorator를 이용하여 userRepository를 요청한다면 Nest는 mockRepository를 사용할 것이다.

from nestjs공식문서
https://docs.nestjs.com/techniques/database#testing

E2E테스트는 실제로 유저가 사용한다는 것을 감안해 실제 사용흐름을 생각하여 짜야한다.
예를 들어 회원가입 -> 로그인 -> 마이페이지 -> 내정보수정 -> 로그아웃

둘 다 처음해보는 것이라 처음에 많이 버벅대고 특히 mocking이라는 개념이 참 어려웠는데 지금은 뭔지 좀 알 것 같다.

profile
기록을 하자

0개의 댓글