[정리] Jest를 이용한 Restful API 테스트

2021. 2. 1. 12:24프로그래밍-Web/Jest(TDD)

Restful API는 Create, Read, Update, Delete 명령을 수행한다

각 행위에 대해 기본적으로 테스트 해야 할 기능이 정해져 있으면, 그에 따른 루틴이 있다.

또한 모든 행위는 기능을 위한 유닛 테스트 -> 라이브러리, DB접근 등 실제 사용 환경을 포함한 통합테스트 과정을 거친다.

 

1)  시작전

 

이 포스팅에서 RestAPI의 기본기능 예시는 한번의 쿼리를 기준으로 한다.

 

예컨데 Id로 한개의 데이터를 find하는 API의 경우, 모델을 대상으로 데이터 하나를 찾는 로직만 작성하여 테스트한다

 

또한 Restful API는 전달객체 req, res와 미들웨어 next를 args로 갖는다.

그리고 특정 DB 모델을 대상으로 한다.

따라서 해당 객체들에 위와 같은 Mocking이 필요하다.

Mocking된 함수와 객체들을 대상으로 route로직만 이용하여 테스트하는 것이다. 

또한 하나의 describe구문 또는 it 구문에서 필요한 데이터들은 req와 res객체에 적절히 설정해둔다

예시의 경우에는 beforeEach구문을 이용하여 describe구문전체의 req.body에 데이터를 심어두었다

 

 

2) 유닛테스트

 

기본적인 유닛테스트 시나리오는

 

- controller의 함수 반환 여부

- 모델 호출 여부

- 쿼리 전달 여부

- 성공시 Return value

- 성공시 Return code

- 실패시 Return value

- 실패시 Return code

- 에러시 메세지 전달

 

함수반환모델호출의 경우 다음과 같이 테스트할 수 있다.

특정 컨트롤러는 비동기처리로 소환될때까지 기다리고, 그 다음에 테스트 로직을 실행되도록 한다.

 

성공시 value와 code는 다음과 같이 확인한다.

value확인의 경우엔 mockReturnvalue를 통해 성공시 리턴할 value를 만들어주어야 한다.

return값을 가상으로 set하지 않으면 제대로 value가 받아지는지에 대한 테스트는 할 수 없다

실제로 쿼리가 날라가는것이 아니기 때문이다.

 

findbyId나 findAndUpdate의 경우는 조금 더 복잡하다

일단 테스트 데이터들을 설정해준다.

find()나 create()은 req객체가 따로 필요하지 않았지만, id를 통해 쿼리를 처리하는 경우는 req객체에 id설정이 필요하다.

값의 정확한 확인을 위해 toBeTruthy와 toStrictEqual이라는 matcher함수를 사용한다

 

쿼리 전달 여부는 return값의 설정이 필요하지 않다

이 경우 toHaveBeenCalledWith로 모델 객체에 해당 쿼리가 제대로 날라갔는지를 확인한다.

 

실패시 value와 code는 return 값을 적당히 설정해주면 된다.

 

에러 메세지는 에러 객체를 만들어주고 return value로 설정해주어야 한다.

 

이렇게 하면 기본적인 Restful API에 대한 유닛테스트는 끝난다.

 

 

3) 통합테스트

 

통합테스트는 환경 구축이 선행되어야 한다.

따라서 decribe구문 안에는 beforeAll로 동일하게 db 접근을 해준다.

 

통합테스트는 supertest 라이브러리를 이용해 api에 call을 보낸다.

find의 경우 get 요청만보내면 모든 요청이 담긴다.

편의상 0번째 배열만 확인하였고, find한 모든 데이터가 담겨오는지는 전체 데이터를 확인하면 된다. 

또한 다음 테스트를 위해 productIdVariable을 만들어 findbyid요청을 테스트해보겠다.

 

역시 get요청을 보내는데, find에서 가져온 id를 넣어서 요청해보았다.

이 경우 response의 body에 담긴 데이터들이 find에서 예시로 가져온 데이터들과 같아야 한다.

 

update의 경우 update된 데이터를 받아야 한다.

이때 find와 달리 update할 데이터를 전송해야 하므로, 이를 send 에 담아 보낸다.

리턴된 value는 send에 담긴 value와 같아야 한다.

 

실패 테스트의 경우도 같다. value를 임의로 만들어 return 한다