react testig libraray(이하 RTL) 과 jest 는 테스트 코드를 작성할 때 사용하는 테스트 도구이다. RTL 과 jest 함께 사용해야 한다. 테스트 도구 중에 jest 대신 RTL 을 쓴다(또는 그 반대로)라는 개념이 아니라 함께 사용한다는 개념이 맞다. 왜냐하면 둘의 역할은 다르기 때문이다.
RTL 공식 홈페이지에는 다음과 같이 나와있다.
RTL은 Test runner 가 아니다.
Jest 가 Test runner 이다.
RTL 은 Test runner 를 위한 공간(Virtual DOM) 을 제공한다.
다른 말로, 테스트가 필요한 react 컴포넌트를 렌더링 하는 역할을 한다.
example 이라는 컴포넌트에서 버튼을 눌렀을 때 기능이 동작하는지 테스트를 한다고 가정해보면 테스트 하기 위해 example 컴포넌트를 렌더하고, 컴포넌트에서 버튼을 찾는 것이 RTL의 역할이고 버튼이 동작을 테스트하는 것이 jest의 역할이라고 생각하면 될 것 같다.
기본적으로 테스트는 위의 이미지처럼 코드를 작성한다.
'테스트를 설명합니다.' 부분은 개발자가 현재 진행되는 테스트의 목적이 무엇인지, 어떤 테스트인지 알기위해 작성하는 부분이다. 이는 테스트 실패시 터미널에서 볼 수 있다.
'테스트 코드를 작성합니다.' 부분은 실제로 테스트를 진행하는 코드를 작성하는 부분이다.
test 대신 it, describe 를 사용할 수 있는데
test 가 개별 테스트를 진행한다면 describe 는 테스트들을 그룹화합니다.
it 는 test 와 같습니다.
테스트 코드를 작성한다는 것은,
컴포넌트에서 테스트가 필요한 대상을 찾고
그 대상이 예상대로 동작하는지 테스트 해보는 것이다.
컴포넌트 코드
테스트 코드
screen 메서드와 querie 를 함께 사용하여 컴포넌트의 테스트대상을 찾는다.
(예시에서 사용된 getByText 가 쿼리이다.)
Queries are the methods that Testing Library gives you to find elements on the page.
쿼리는 render가 된 페이지에서 element를(테스트 대상) 찾는 것을 도와준다.
쿼리는 다음과 같은 형태이다.
get(쿼리타입)All(타겟의 수)ByRole(찾는방법, 조건)
쿼리타입에는 get, query, find 가 있다.
get과 query 의 경우 조건에 맞는 요소가 없을 경우에 반환하는 값이 다르다. query 를 사용하는 경우는 popover 와 같이 처음엔 보이지 않지만 유저의 액션을 통해 나타나는 경우에 사용할 수 있다.
타겟이 여러개일 경우엔 'all' 을 사용한다.
getAll, queryAll, findAll
주로 byRole 과 byText 을 많이 사용한다.
getByRole(button, {name: 'text'})
getByText('해당 텍스트를 가진 대상을 찾는다.')
테스트 할 대상을 찾았으면 대상이 어떤 동작을 하는지 테스트한다.
expect(대상).matchers('matchers 인자')
expect 는 기대하다라는 테스트 대상을 인자로 받는다.
matchers 는 기대하는 값, 행위라 생각하면 된다.
즉, 대상이 이것을 할 것이다.(matchers) 라고 작성하는 것이며 이게 맞으면 테스트에 통과하고 틀리면 테스트는 실패하게 된다.
render 가 된 Example 컴포넌트에는 test button(getByRole의 name) 이라는 버튼이(getByRole의 button) 있으므로 이 테스트는 통과하게 된다.
위의 테스트에선 render 된 Example 컴포넌트에 존재하지 않는 버튼을 찾아 해당 버튼이 컴포넌트에 없는지를 확인하다.(이런 테스트는 아마 하지 않을 것이다.)
참고
RTL 공홈 : https://testing-library.com/