PHPUnitManual:14

From 흡혈양파의 번역工房
Jump to: navigation, search
제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

PHPUnit 14.1.png


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

PHPUnit 14.2.png


Notes