Unit Test

2020. 3. 27. 13:04코드 품질 관리

UnitTest란

UnitTest의 개념

프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차입니다. 즉, 모든 함수와 메소드에 대한 테스트 케이스를 작성하는 절차를 말합니다. 이를 통해 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단 시간 내에 이를 파악하고 바로잡을 수 있도록 해줍니다.

Unit Test를 만드는 이유

첫 번째는 프로그램이 크고, 메모리가 많이 들고, 다른 리소스(DB 등)이 필요한 경우 로컬 환경에서 쉽게 코드를 실행시켜 보기 어렵기 때문입니다. 그래서 개발자들은 Unit Test를 통해 빠르게 자신의 코드가 정상적으로 작동하는지 확인할 수 있습니다.
두 번째는 dependency가 있는 다른 클래스들에서 버그가 나는 것을 방지하기 위함입니다. 다른 클래스와 dependency가 있는 하나의 클래스를 수정했을 때 다른 클래스에도 문제가 있는지 빠르게 확인할 필요가 있습니다. 이를 확인하기 위해 개발자들은 Unit Test를 통해 빠르게 확인할수 있습니다.

Unit Test의 장점

문제점 발견
Unit Test의 목적은 프로그램의 각 부분을 고립시켜서 각각의 부분이 정확하게 동작하는지 확인하는 것입니다. 즉, 프로그램을 작은 모듈 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사하고 이를 통해 문제 발생 시 정확하게 어느 부분이 잘못되었는지를 빨리 확인할 수 있습니다. 따라서 프로그램의 안정성이 높아집니다. Unit Test는 개발 기간 중 대부분을 차지하는 디버깅 시간을 단축시킴으로써 여유로운 프로그래밍을 가능하게 합니다.

변경이 쉽다
개발자는 언제라도 Unit Test를 믿고 리팩토링을 할 수 있습니다. 리팩토링 후에도 해당 모듈이 의도대로 작동하고 있음을 Unit Test를 통해서 확신할 수 있습니다. 어떻게 코드를 고치더라도 Unit Test를 통해 문제점을 금방 파악할 수 있고 수정된 코드가 정확하게 동작하는지 쉽게 알 수 있습니다.

통합이 간단하다
Unit Test는 모듈 자체의 불확실성을 제거해주기 때문에 상향식(bottom-up) 테스트 방식에서 유용합니다. 먼저 프로그램의 각 부분을 검증하고 그 부분들을 합쳐서 다시 검증하는 Integration Test에서 더욱 더 빛을 발합니다.

Unit Test시 주의사항

하나의 테스트 케이스는 단위 기능 중 하나의 시나리오만 테스트하라.
단위 테스트 작성 시 가장 중요하게 인식할 점은 테스트 단위가 복수의 테스트 시나리오들을 가질 수 있다는 것입니다. 그리고 모든 테스트 시나리오들은 독립적인 테스트 코드로 작성되어야 합니다. 예를 들어 매개 변수를 가지고 처리한 후 값을 돌려주는 함수의 테스트 케이스를 작성한다고 하면 다음과 같은 테스트 시나리오가 가능할 것입니다.

  1. 첫 번째 파라미터가 널 값일 경우 예외 객체를 반환해야 한다.
  2. 두 번째 파라미터가 널 값일 경우 예외 객체를 반환해야 한다.
  3. 두 개의 파라미터 모두가 널 값일 경우 예외 객체를 반환해야 한다.
  4. 파라미터가 정상 범위 안일 경우 작업 실행 후 결과 값을 반환해야 한다.

이렇게 세분화된 테스트 케이스들은 코드를 수정하거나 리팩토링할 때 효과적입니다. 왜냐하면 단위테스트만 수행하면 리팩토링이 코드의 의도된 기능을 망가뜨렸는지 확인할 수 있기 때문입니다. 또한 기능을 수정한다면 최소한의 테스트 코드만 수정하면 되기 때문입니다.

불필요한 검증 구문을 작성하지 마라
단위 테스트는 시스템의 특정 단위가 어떻게 동작하는지에 대한 디자인 스펙이지 단순히 단위 내의 코드가 행하는 모든 것을 관찰하는 것이 아닙니다. 그렇기 때문에 단위 내의 모든 것에 대한 검증 구문을 작성하지 않고 테스트하려는 하나의 시나리오에 집중해야 합니다.

각 테스트는 독립적이어야 한다
다른 테스트에 의존적인 단위 테스트를 작성해서는 안 됩니다. 이러한 테스트들은 테스트의 근본적인 실패 원인을 테스트 결과를 통해 알 수 없습니다. 결국 또 별도의 디버깅 작업을 수행해야합니다. 또한 이러한 상호 의존적인 테스트 코드는 유지 보수도 까다롭습니다. 왜냐하면 하나의 테스트 코드를 수정할 경우 다른 코드도 수정해야 할 경우가 생기기 때문입니다.

테스트를 위한 코드는 제품 코드에서 분리되어야 한다
빌드 스크립트에서 테스트를 위한 코드는 실제 제품 코드와 같이 전달되지 않게 해야합니다.

외부 시스템이나 서비스에 대한 의존성이 가장 낮은 메소드들에 대해 테스트를 먼저 작성하라. 그리고 확장해 가라
예를 들어 Employee 모듈을 테스트한다고 가정합니다. 가장 먼저 Employee 모듈을 생성하는 코드부터 테스트를 작성합니다. 왜냐하면 이 시나리오가 가장 낮은 외부 의존성을 가지기 때문입니다. 이 시나리오가 성공한다면, DB에 접근하는 테스트 코드를 추가합니다.
 DB에 Employee 정보를 가지려면 먼저 Employee 모듈을 생성하는 테스트 시나리오를 통과해야 합니다. 만약 모듈을 생성하는 코드에 버그가 있다면 훨씬 빨리 발견할 수 있습니다.

728x90

'코드 품질 관리' 카테고리의 다른 글

TDD  (0) 2020.04.01
System Test  (0) 2020.03.29
Integration Test  (0) 2020.03.29
Code Coverage  (0) 2020.03.28
PMD / CheckStyle / Findbugs  (0) 2020.03.27