PHPUnitManual:B

From 흡혈양파의 번역工房
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Appendix B. 선언 Annotations

선언 Annotations

선언은 메타 데이터를 나타내는 특별한 구문으로, 프로그래밍 언어의 소스 코드에 추가할 수 있습니다. PHP 자체에는 선언에 관한 전용 문법은 존재하지 않지만, 주석 블럭에 "@선언 인수" 와 같은 태그를 작성하여 선언을 표현하는 표기법이 PHP 커뮤니티에서는 일반적입니다. PHP 에서는 Reflection API 의 getDocComment() 메서드를 사용하여, 함수, 클래스, 메서드, 속성 각각의 주석 블럭에 접근할 수 있습니다. PHPUnit 등의 어플리케이션에서는 이 정보를 토대로 실행 시의 동작을 결정합니다.


이 장에서는 PHPUnit 이 서포트하는 모든 선언에 대해 해설합니다.


@author

@author 선언은 @group 선언의 alias 로, 테스트 작성자 별로 필터링할 수 있게 합니다.


@backupGlobals

Test case 클래스의 모든 테스트에 대해서, 글로벌 변수의 백업과 복구 기능을 무효화할 수 있습니다. 사용법은 다음과 같습니다.

/**
 * @backupGlobals disabled
 */
class MyTest extends PHPUnit_Framework_TestCase
{
    // ...
}


@backupGlobals 선언은 테스트 메서드 레벨에서 사용할 수도 있습니다. 이를 통해 백업과 복구 작업을 보다 정밀하게 제어할 수 있습니다.

/**
 * @backupGlobals disabled
 */
class MyTest extends PHPUnit_Framework_TestCase
{
    /**
     * @backupGlobals enabled
     */
    public function testThatInteractsWithGlobalVariables()
    {
        // ...
    }
}


@backupStaticAttributes

Test case 클래스의 모든 테스트에 대해서, 클래스의 정적 속성의 백업과 복구를 무효화 할 수 있습니다. 사용법은 다음과 같습니다.

/**
 * @backupStaticAttributes disabled
 */
class MyTest extends PHPUnit_Framework_TestCase
{
    // ...
}


The @backupStaticAttributes 선언은 테스트 메서드 레벨에서 사용할 수도 있습니다. 이를 통해 백업과 복구 작업을 보다 정밀하게 제어할 수 있습니다.

/**
 * @backupStaticAttributes disabled
 */
class MyTest extends PHPUnit_Framework_TestCase
{
    /**
     * @backupStaticAttributes enabled
     */
    public function testThatInteractsWithStaticAttributes()
    {
        // ...
    }
}


@codeCoverageIgnore*

@codeCoverageIgnore, @codeCoverageIgnoreStart 그리고 @codeCoverageIgnoreEnd 선언을 사용하여, 코드의 특정 행을 coverage 분석 대상에서 제외할 수 있습니다.

사용법은 "Code Blocks의 무시" 를 참조하세요.


@covers

@covers 선언을 테스트 코드에서 사용하여, 해당 테스트 메서드가 어떤 메서드를 테스트하는지를 지정할 수 있습니다.

/**
 * @covers BankAccount::getBalance
 */
public function testBalanceIsInitiallyZero()
{
    $this->assertEquals(0, $this->ba->getBalance());
}


@covers 이 지정된 경우, 지정된 메서드에 대해서만 coverage 정보가 얻어집니다.

표B.1 "테스트가 Cover 하는 메서드를 지정하기 위한 선언" 은 @covers 선언의 구문의 리스트입니다.


@coversNothing

@coversNothing 선언을 테스트 코드에서 사용하여, 해당 test case 에 대해서 code coverage 정보를 기록하지 않도록 설정합니다.


이 기능은 통합 테스트 (integration testing) 를 위해 사용할 수 있습니다. 예14.3 "어떤 메서드도 cover 하지 않도록 지정한 테스트" 를 참조하세요.


이 메서드는 클래스 레벨이나 메서드 레벨에서 사용할 수 있고, 모든 @covers 태그를 무시합니다.


@dataProvider

테스트 메서드에 임의의 인수를 넘길 수 있습니다. 인수는, 데이터 프로바이더 메서드 ( 예4.4 "배열의 배열을 넘기는 데이터 프로바이더의 사용" 의 provider()) 이 넘깁니다. 사용하는 데이터 프로바이더 메서드를 지정하기 위해서는, @dataProvider 선언을 사용합니다.

"Data Providers" 를 참조하세요.


@depends

PHPUnit 에서는 테스트 메서드 간의 의존성을 명시적으로 선언할 수 있습니다.여기서 말하는 의존성이란, 테스트 메서드가 실행되는 순서를 정의하는 것이 아닙니다. 생산자가 테스트 fixture 를 생성하여, fixture 의 인스턴스를 반환하고, 의존하는 소비자가 인스턴스를 받아 이용하는 것을 말합니다. 예4.2 "@depends 선언을 사용한 의존성 표현" 은 @depends 선언을 사용하여 테스트 메서드의 의존성을 표현하는 예입니다.

"테스트 의존성 (Test Dependencies)" 을 참고하세요.


@expectedException

예4.7 "@expectedException 선언의 사용법" 은 테스트하는 코드 내부에서 예외가 throw 되었는지 여부를 @expectedException 선언을 사용하여 조사하는 방법입니다.

"예외의 테스트 (Testing Exceptions)" 를 참고하세요.


@expectedExceptionCode

@expectedExceptionCode 선언을 @expectedException 과 조합하여 사용하면, throw 된 예외의 에러 코드에 대한 검증이 가능해집니다. 이를 통해 예외를 보다 좁은 범위로 좁힐 수 있습니다.

class MyTest extends PHPUnit_Framework_TestCase
{
    /**
     * @expectedException     MyException
     * @expectedExceptionCode 20
     */
    public function testExceptionHasErrorcode20()
    {
        throw new MyException('Some Message', 20);
    }
}


테스트의 실행을 쉽게 하고 중복을 줄이기 위해, 바로가기를 사용하여 클래스 정수를 지정할 수 있습니다. @expectedExceptionCode 에서 "@expectedExceptionCode ClassName::CONST" 구문을 사용합니다.

class MyTest extends PHPUnit_Framework_TestCase
{
    /**
      * @expectedException     MyException
      * @expectedExceptionCode MyClass::ERRORCODE
      */
    public function testExceptionHasErrorcode20()
    {
      throw new MyException('Some Message', 20);
    }
}
class MyClass
{
    const ERRORCODE = 20;
}


@expectedExceptionMessage

@expectedExceptionMessage 선언은 @expectedExceptionCode 와 비슷하게 예외의 에러 메세지에 관해 검증합니다.

class MyTest extends PHPUnit_Framework_TestCase
{
    /**
     * @expectedException        MyException
     * @expectedExceptionMessage Some Message
     */
    public function testExceptionHasRightMessage()
    {
        throw new MyException('Some Message', 20);
    }
}


기대되는 메세지를 예외 메세지의 일부로 삼을 수도 있습니다. 이 기능은 특정 이름이나 인수가 예외에 표시되는지를 확인하고자 하면서도 예외 메세지 전체가 고정되지는 않은 경우에 편리합니다.

class MyTest extends PHPUnit_Framework_TestCase
{
     /**
      * @expectedException        MyException
      * @expectedExceptionMessage broken
      */
     public function testExceptionHasRightMessage()
     {
         $param = "broken";
         throw new MyException('Invalid parameter "'.$param.'".', 20);
     }
}


테스트의 실행을 쉽게 하고 중복을 줄이기 위해, 바로가기를 사용하여 클래스 정수를 지정할 수 있습니다. @expectedExceptionMessage 에서 "@expectedExceptionMessage ClassName::CONST" 구문을 사용합니다. 샘플 코드는 the section called “@expectedExceptionCode” 를 참고하세요.


@group

한 테스트를 하나 혹은 복수의 group 에 포함시킬 수 있습니다. @group 선언은 다음과 같이 사용합니다.

class MyTest extends PHPUnit_Framework_TestCase
{
    /**
     * @group specification
     */
    public function testSomething()
    {
    }

    /**
     * @group regresssion
     * @group bug2204
     */
    public function testSomethingElse()
    {
    }
}


특정 group 에 포함된 테스트만을 골라서 실행하려는 경우, command-line test runner 에서는 --group 이나 --exclude-group 스위치를 사용합니다. XML 설정 파일에서는, 각각 대응 디렉토리를 설정합니다.


@outputBuffering

@outputBuffering 선언을 사용하여 PHP 의 output buffering 을 다음과 같이 제어할 수 있습니다.

/**
 * @outputBuffering enabled
 */
class MyTest extends PHPUnit_Framework_TestCase
{
    // ...
}


@outputBuffering 선언은 테스트 메서드 레벨에서 사용할 수도 있습니다. 이 기능을 통해 output buffering 을 보다 정밀하게 제어할 수 있습니다.

/**
 * @outputBuffering disabled
 */
class MyTest extends PHPUnit_Framework_TestCase
{
    /**
     * @outputBuffering enabled
     */
    public function testThatPrintsSomething()
    {
        // ...
    }
}


@preserveGlobalState

테스트를 별도 프로세스에서 실행할 때, PHPUnit 은 부모 프로세스의 글로벌 상태 (state) 를 보존하려 합니다. 부모 프로세스의 모든 글로벌 상태를 serialize 하여, 자식 프로세스에서 unserialize 합니다. 부모 프로세스에 serialize 불가능한 상태가 있을 경우 문제가 발생합니다. 이 문제에 대응하기 위해, 글로벌 상태의 보존을 무효화할 수 있습니다. 이를 위해 @preserveGlobalState 선언을 사용합니다.

class MyTest extends PHPUnit_Framework_TestCase
{
    /**
     * @runInSeparateProcess
     * @preserveGlobalState disabled
     */
    public function testInSeparateProcess()
    {
        // ...
    }
}


@requires

@requires 선언을 사용하여 공통된 사전 조건 (예:PHP버젼이나 확장 모듈의 인스톨 상황) 을 만족시키지 않는 경우, 테스트를 패스합니다.


조건으로 지정할 수 있는 내용과 예는 표9.3 "@requires 의 사용예" 를 참고하세요.


@runTestsInSeparateProcesses

테스트 클래스의 모든 test case 를, 개별 PHP 프로세스로 실행하도록 지시합니다.

/**
 * @runTestsInSeparateProcesses
 */
class MyTest extends PHPUnit_Framework_TestCase
{
    // ...
}


"주의사항: 기본 설정으로, PHPUnit 은 부모 프로세스의 글로벌 상태를 보존하려 합니다. 부모 프로세스의 모든 글로벌 상태를 serialize 하여, 자식 프로세스에서 unserialize 합니다. 부모 프로세스에 serialize 불가능한 상태가 있을 경우 문제가 발생합니다. 이 문제에 대응하기 위해, 글로벌 상태의 보존을 무효화할 수 있습니다. “@preserveGlobalState” 를 참조하세요.


@runInSeparateProcess

해당 테스트를 개별 PHP 프로세스로 실행하도록 지시합니다.

class MyTest extends PHPUnit_Framework_TestCase
{
    /**
     * @runInSeparateProcess
     */
    public function testInSeparateProcess()
    {
        // ...
    }
}


주의사항: 기본 설정으로, PHPUnit 은 부모 프로세스의 글로벌 상태를 보존하려 합니다. 부모 프로세스의 모든 글로벌 상태를 serialize 하여, 자식 프로세스에서 unserialize 합니다. 부모 프로세스에 serialize 불가능한 상태가 있을 경우 문제가 발생합니다. 이 문제에 대응하기 위해, 글로벌 상태의 보존을 무효화할 수 있습니다. “@preserveGlobalState” 를 참조하세요.


@test

테스트 메서드의 이름 앞에 test 를 추가하는 대신에, 메서드의 주석 블록에서 @test 선언을 사용하여 해당 메서드가 테스트 메서드임을 지정할 수 있습니다.

/**
 * @test
 */
public function initialBalanceShouldBe0()
{
    $this->assertEquals(0, $this->ba->getBalance());
}


@testdox

내용없음


@ticket

내용없음


Notes