인터페이스란? 서로 다른 클래스 또는 모듈이 상호작용하는 시스템
내부구현에 대한 테스트는 캡슐화를 위반하게되며 깨지기 쉬운 테스트가 된다.
잘못된 테스트 코드
올바른 테스트 코드
if('버튼을 누르면 배경이 바뀐다.', () => {
// 유저의 동작과 비슷하게 클릭 이벤트를 발생
user.click(screen.getByRole('button'));
}
100% 커버리지를 위해 모든 것을 테스트 코드로 검증하려하면, 그 값에만 의존해 의미있는 테스트 코드를 놓치게 된다.
커버리지란? 테스트 코드가 프로덕션 코드의 몇 %를 검증하고 있는지 나타낸 지표를 뜻하며, 구문, 분기, 함수, 줄 등을 기준으로 한다.
그러면 100% 커버리지는 좋은거 아님?
그렇진 않다.
100% 커버리지 보다는
의미 있는 테스트인가?
어떤 범위까지 검증해야 효율적인 테스트인가?
를 고민하는 것이 좋다.
테스트는 유지보수가 진행됨에 따라 끊임없이 변하기 때문에 가독성이 좋을수록 변화 파악이 용이해진다.
// ❌
it('리스트에서 항목이 삭제된다', () => {})
// ✅
it('항목들을 체크한 후 삭제 버튼을 누르면 리스트에서 체크된 항목들이 삭제도니다.', () => {})
단일 책임 원칙(SRP, Single Responsibility Principle)
모든 클래스는 하나의 책임을 갖고 그와 관련된 책임을 캡슐화하여 변경에 견고한 코드를 만들어야한다.