PHPUnitManual:2

From 흡혈양파의 번역工房
Jump to navigation Jump to search
제 2 장 PHPUnit 의 목표

PHPUnit 의 목표

1 장을 통해서 기본 요소인 array 의 count() 함수를 테스트하였습니다. PHP 가 제공하는 많은 arrary_*() 함수들을 테스트하기 위해서는 각각의 함수에 관해 테스트를 작성할 필요가 있습니다. 모든 테스트를 처음부터 전부 작성하는 것도 가능은 합니다만, 공통 부분은 한 번만 작성하고 각각의 테스트에서 고유한 부분만을 개별로 작성하는 것이 훨씬 좋은 방법입니다. PHPUnit 은 이를 위한 기반을 제공합니다.


PHPUnit 과 같은 프레임워크가 해결해야만 하는 제약이 있습니다. 그 중의 몇가지는 공존할 수 없는 것들입니다. 테스트는 다음 조건들을 동시에 만족시켜야만 합니다.

  • 작성 방법을 쉽게 익힐 수 있을 것
    • 테스트의 작성 방법을 익히는 것이 어렵다면, 개발자는 익히려고 하지 않을 것입니다.
  • 작성하기 쉬울 것
    • 테스트의 작성이 어렵다면, 개발자는 작성하려고 하지 않을 것입니다.
  • 읽기 쉬울 것
    • 테스트 코드는 외적 요소를 포함하지 않아야 합니다. 외적 요소를 넣는다면 테스트 코드는 노이즈에 묻힐 것입니다.
  • 실행하기 쉬울 것
    • 원클릭으로 테스트를 실행시킬 수 있고, 그 결과가 명료한 형식으로 표시되어야만 합니다.
  • 빠르게 실행될 것
    • 하루에 몇백 몇천번 테스트를 실행할 수 있도록, 테스트의 실행 속도는 빨라야 합니다.
  • 독립되어 있을 것
    • 테스트들은 서로간에 영향을 주지 않아야 합니다. 테스트의 실행 순서를 바꾸어도 테스트의 결과는 변하지 않아야 합니다.
  • 자유롭게 조합 가능 할것
    • 테스트의 수나 조합을 자유롭게 선택할 수 있어야 합니다. 테스트가 독립되어 있다면, 이는 당연한 것입니다.


위의 제약 중에는 공존 불가능한 항목이 2 개 존재합니다.

  • 익히기 쉬운 것 / 작성하기 쉬운 것
    • 일반적으로 테스트는 프로그래밍 언어의 모든 기능을 필요로 하지 않습니다. 많은 테스트 툴은 테스트를 작성하기 위해 최소한의 필수 기능만을 포함한 독자 스크립트 언어를 제공합니다. 그 결과, 테스트 는 읽기 쉽고 또한 작성하기 쉬워집니다. 이는 테스트의 내용과 관련이 없는 노이즈가 없기 때문입니다. 그렇지만, 이는 프로그래밍 언어 나 프로그래밍 툴을 또 하나 배우는 것으로 불편한 일입니다.
  • 독립성 / 빠른 실행속도
    • 하나의 테스트가 다른 테스트의 결과에 영향을 주지 않기 위해서는, 각 테스트를 실행할 때마다 매 번 테스트 환경을 구축하고, 종료한후에 매번 테스트 전의 상태로 되돌릴 필요가 있습니다. 그렇지만, 환경을 구축하는 것 (예: 데이터베이스에 접속하여 특정 상태를 나타내는 데이터를 입력하는 것) 에는 많은 시간이 듭니다.


PHPUnit 는 테스트 언어로서 PHP 를 사용하여 이 충돌을 회피하려고 합니다. 소규모의 단순한 테스트를 위해서는 PHP 의 기능까지는 필요없을지도 모릅니다. 그렇지만 PHP 를 사용하는 것은, 지금까지의 개발 경험이나 개발 툴을 무기로서 사용할 수 있게 합니다. 받아들이려고 하지 않는 테스터를 납득시키기 위해서, 테스트를 시작하는 부담을 가능한 한 줄이는 것이 중요합니다.


PHPUnit 에서는 실행 속도보다도 테스트의 독립성을 중요하게 여깁니다. 독립된 테스트는 보다 고품질의 피드백을 얻을 수 있기 때문에 가치가 있습니다. 일련의 테스트 중 첫 테스트 에서 실패한 영향으로 그 뒤의 모든 테스트가 실패하여 대량의 실패 보고를 받는 일이 없어집니다. 이러한 독립성을 중시하는 방침은 설계의 방향성을 많은 수의 단순한 오브젝트로 만듭니다. 각각의 오브젝트는 독립적으로 빠르게 테스트될 수 있습니다. 결과적으로 더 나은 디자인과 더 빠른 테스트가 가능해집니다.


PHPUnit 는 대부분의 테스트가 성공할 것으로 상정하였기 때문에, 성공한 테스트에 관해 자세히 보고하는 것은 크게 가치있는 일이 아니라고 여깁니다. 테스트가 실패한 경우에는 실패에 대해 구체적으로 보고해야만 합니다. 대부분의 테스트는 성공하는 것이 바람직하고,성공한 경우에는 테스트의 수만을 보고합니다. 이는 PHPUnit 의 코어가 아닌 레포트 클래스에 있는 기능입니다. 테스트의 결과가 표시될 때는 실행한 테스트의 숫자가 표시되지만 자세한 정보가 표시되는 것은 실패한 테스트 뿐입니다.


테스트를 매우 작은 단위로 수행하는 것, 즉 하나의 테스트에서는 하나의 오브젝트의 한 기능에 대한 테스트가 수행될 것이 기대됩니다. 이 때문에 한 테스트가 처음으로 실패했을 때,PHPUnit 는 그 테스트를 중지하고 실패를 보고합니다. 무수한 작은 테스트들이 실행되는 것은 예술적입니다. 매우 작은 단위의 테스트를 통해 시스템 전체의 설계를 보다 좋게 만들 수 있습니다.


PHPUnit 로 오브젝트를 테스트할 때는 그 오브젝트의 public interface 에 관해서만 테스트합니다. public 으로 공개된 기능에 관한 테스트를 통해, 나쁜 디자인이 시스템의 많은 범위에 영향을 주기 전의 빠른 단계에 설계상의 문제를 찾아내고 해결할 수 있게 해 줍니다.