PHPUnitManual:14
- 제14장. Code Coverage 분석
- The beauty of testing is found not in the effort but in the effiency.
- 테스트의 미학은 들인 노력이 아니라 얼마나 효율적인가 이다.
- 무엇이 테스트되어야 할지를 아는 것, 무엇이 테스트되고 있는지를 아는 것. 중요한 것은 이것이다.
- --Murali Nandigama
이 장에서는 PHPUnit 의 code coverage 기능에 대해 학습할 것입니다. 이 기능은 테스트를 실행할 때, 코드의 어떤 부분이 실행되었는지를 조사하는 기능입니다. 다음과 같은 질문에 대한 답을 제공할 수 있을 것입니다.
- 테스트되지 않은 코드를 발견하는 방법은 무엇인가? 다시 말하자면 아직 테스트가 만들어지지 (covered) 않은 부분을 발견하기 위한 방법은 무었인가?
- 테스트의 완전성을 확인하는 방법은 무엇인가?
Code coverage 통계의 의미를 예를 들어서 설명하자면, 100줄의 코드로 구성된 메소드가 있는 경우, 테스트에서 실제로 사용된 것이 그 중의 75줄이라면, 해당 메소드의 Code coverage 를 75퍼센트인 것으로 간주하는 것입니다.
PHPUnit 의 Code coverage 분석에서는 PHP_CodeCoverage[1] 컴포넌트를 사용합니다. 이 컴포넌트는 Xdebug[2] 확장 모듈이 제공하는 statement coverage 기능을 이용합니다.
예12.3 의 BankAccount 클래스에 대한 Code coverage 레포트를 작성해 봅시다.
phpunit --coverage-html ./report BankAccountTest
PHPUnit 3.7.0 by Sebastian Bergmann.
...
Time: 0 seconds
OK (3 tests, 3 assertions)
Generating report, this may take a moment.
Figure 14.1 "setBalance() 의 Code coverage" 는 Code coverage 레포트의 일부를 발췌한 것입니다. 테스트 시에 실행된 행은 녹색으로 강조되어 있습니다. 실행 가능하지만 실행되지 않은 행은 빨간색으로 강조되어 있습니다. 그리고, 회색으로 표시된 행은 "무의미한 코드"입니다. 왼쪽의 숫자는 그 행을 테스트하는 테스트의 숫자입니다.
Figure 14.1. setBalance() 의 Code coverage
BankAccount 의 Code coverage 레포트에서 알 수 있는 것은, setBalance(), depositMoney() 를 호출하는 테스트가 아직 존재하지 않는 것과 withdrawMoney() 를 적절한 인수를 넘기는 테스트가 존재하지 않는 것입니다. BankAccountTest 클래스에 추가할 테스트가 예14.1 "완전한 Code coverage 를 달성하기 위한 추가 테스트" 입니다. 이 테스트를 추가하는 것에 의해, BankAccountTest 클래스의 test case 를 완전히 망라할 수 있게 됩니다.
예14.1 완전한 Code coverage 를 달성하기 위한 추가 테스트
<?php
require_once 'BankAccount.php';
class BankAccountTest extends PHPUnit_Framework_TestCase
{
// ...
public function testDepositWithdrawMoney()
{
$this->assertEquals(0, $this->ba->getBalance());
$this->ba->depositMoney(1);
$this->assertEquals(1, $this->ba->getBalance());
$this->ba->withdrawMoney(1);
$this->assertEquals(0, $this->ba->getBalance());
}
}
?>
Figure 14.2 ?setBalance() 메소드에 테스트를 추가한 뒤의 Code coverage" 는 테스트를 추가한 뒤의 setBalance() 의 Code coverage 입니다.
Figure 14.2 setBalance() 메소드에 테스트를 추가한 뒤의 Code coverage