개발을 하며 코드가 잘 동작하는지, 버그는 없는지 파악하는 것이 테스트 하는 과정을 중요하다.
그에 따른 테스트 방법을 범위에 따라 분류하면 유닛, 통합, 기능 테스트 3가지로 나누어 볼 수 있다
유닛 테스트는 단위 테스트라고도하며 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다.
모듈 -> 애플리케이션에서 작동하는 하나의 기능 또는 메소드
통합 테스트는 모듈을 통합하는 과정에서 모듈간의 호환성을 확인하기 위해 수행되는 테스트이다.
기능 테스트는 E2E 테스트 또는 브라우저 테스트라고 불리기도 하며, 어떤 어플리케이션이 제대로 동작하는지 완전한 기능을 테스트하는 것을 의미한다.
실무에서 테스트 코드를 작성한다고 하면 거의 단위테스트를 의미한다고 한다.
단위 테스트는 독립적으로 테스트하기 때문에 어떤 코드를 리팩토링하여도 빠르게 문제의 여부를 확인할 수 있기에 단위 테스트를 선호한다.
단위 테스트는 해당 모듈에 대한 독립적인 테스트이기 때문에 다른 객체와 메세지를 주고 받을 때 문제가 발생하기 마련이다.
그렇기 때문에 다른 객체 대신에 더미 객체를 주입하여 결과를 반환하라고 정해진 답변을 준비시키는 것이 stub이다.
-> 예를 들어 데이터베이스에 새로운 데이터를 추가하는 코드를 테스트한다하면 가짜 데이터베이스에 insert하여 반드시 1을 반환하도록 해주는 것이 stub이다.
Fast : 테스트는 빠르게 동작하여 자주 돌릴 수 있어야한다.
Independent : 각각의 테스트는 독립적이며, 서로 의존해서는 안된다.
Repeatable : 어느 환경에서도 반복 가능해야 한다.
Self-Validating : 테스트는 성공 또는 실패로 bool 값으로 결과를 내어 자체적으로 검증되어야 한다.
Timely : 테스트하려는 실제 코드를 구현하기 직전에 구현해야 한다.