PHPUnitManual:6.4
- 6.4 Global State
singleton 을 사용하는 코드를 테스트하는 것은 매우 어렵습니다 [1]. 마찬가지로, 글로벌 변수를 사용하는 코드를 테스트하는 것 또한 어렵습니다. 일반적으로 테스트 대상 코드가 글로벌 변수와 강하게 묶여 있는 경우, 글로벌 변수의 값을 제어할 수 없습니다. 또 다른 문제는, 한 테스트에서 글로벌 변수를 변경한 결과로 인해 다른 테스트에서 문제를 일으킬 수도 있다는 것입니다.
PHP 에서 글로벌 변수는 다음과 같이 작용합니다.
- 글로벌 변수 $foo = 'bar'; 는 $GLOBALS['foo'] = 'bar'; 로 저장됩니다.
- $GLOBALS 은 슈퍼 글로벌 변수입니다.
- 슈퍼 글로벌 변수는 모든 영역 (scope) 에서 사용 가능한 built-in 변수입니다.
- 함수나 메소드의 내부에서 글로벌 변수 $foo 에 접근하기 위해서는, 직접 $GLOBALS['foo'] 에 접근하거나, global $foo; 를 사용하여 글로벌 변수를 참조하는 로컬 변수를 만들어야 합니다.
글로벌 변수 이외에도, 클래스의 정적 속성도 global state 를 가집니다.
기본 상태 (defalut )에서, PHPUnit 이 테스트를 실행할 때는 글로벌 변수나 슈퍼 글로벌 변수 ($GLOBALS<, $_ENV, $_POST, $_GET, $_COOKIE, $_SERVER, $_FILES, $_REQUEST) 는 다른 테스트에 영향을 미치지 않습니다. 옵션을 통해 클래스의 정적 속성도 테스트에 영향을 미치지 않게 할 수 있습니다.
- 주의사항
- 클래스의 정적 속성의 백업/복원 을 구현하기 위해서는 PHP 5.3 이상이 필요합니다.
- 글로벌 변수나 클래스의 정적 속성의 백업/복원 을 구현하기 위해서 serialize() 와 unserialize() 를 사용합니다.
- PHP 에서 기본으로 제공하는 클래스의 오브젝트 중에는 serialize 할 수 없는 경우도 있습니다 (예: PDO 오브젝트). 이런 오브젝트가 $GLOBALS 배열에 포함되어 있는 경우, 백업은 실패할 것입니다.
"@backupGlobals" 에서 설명하는 @backupGlobals 선언을 사용할 경우, 글로벌 변수의 백업/복원 을 제어할 수 있습니다. 다른 방법으로는, 블랙리스트를 만들어 백업/복원 대상에서 제외시킬 수도 있습니다.
class MyTest extends PHPUnit_Framework_TestCase
{
protected $backupGlobalsBlacklist = array('globalVariable');
// ...
}
- 주의사항
- $backupGlobalsBlacklist 속성을 setUp() 메소드 등에서 설정해도 효과가 없습니다.
@backupStaticAttributes 에서 설명하는 $backupGlobalsBlacklist 선언을 사용하여, 정적 속성의 백업/복원 을 제어할 수 있습니다. 또, 정적 속성의 블랙리스트를 통해 백업/복원 대상에서 제외시킬 수 있습니다. 블랙리스트의 지정 방법은 다음과 같습니다.
class MyTest extends PHPUnit_Framework_TestCase
{
protected $backupStaticAttributesBlacklist = array(
'className' => array('attributeName')
);
// ...
}
- 주의사항
- "$backupStaticAttributesBlacklist 속성을 setUp() 메소드 등에서 설정해도 효과가 없습니다.