sourcecode

PHPUnit:클래스의 모든 테스트에 대해 한 번 호출되는 함수를 만들려면 어떻게 해야 합니까?

copyscript 2022. 9. 12. 11:44
반응형

PHPUnit:클래스의 모든 테스트에 대해 한 번 호출되는 함수를 만들려면 어떻게 해야 합니까?

PHPUnit 테스트 케이스 클래스(일부 테스트 기능으로 구성)가 있습니다.'A' 싶다oneTimeSetUp()내 한 번 )setUp()클래스 내의 각 테스트에 대해 한 번 호출되는 함수).즉, JUnit 주석과 동등한 PHPUnit을 찾고 있습니다.

입니다.oneTimeTearDown()★★★★★★ 。

PHPUnit에서 그렇게 할 수 있나요?

, 그럼 ㄴㄴㄴ데를 한 번 보세요.setUpBeforeClass()PHPUnit 문서의 섹션 6을 참조하십시오.

에서는 tearDown을 사용해야 .tearDownAfterClass();.

이 두 메서드는 모두 클래스에서 정적 메서드로 정의해야 합니다.

setUpBeforeClass()모든 테스트가 문자 그대로 단일 클래스에 포함되어 있는 경우 이 방법을 사용합니다.

그러나 질문은 테스트 클래스를 여러 테스트 클래스의 기본 클래스로 사용할 수 있음을 암시합니다.이 경우 setUpBeforeClass가 각 클래스보다 먼저 실행됩니다.정적 변수를 사용하여 보호할 수 있는 경우에만 실행할 경우 다음 절차를 수행합니다.

abstract class TestBase extends TestCase {

  protected static $initialized = FALSE;
  
  public function setUp() {
    
    parent::setUp();

    if (!self::$initialized) {
      // Do something once here for _all_ test subclasses.
      self::$initialized = TRUE;
    }
  }

}

마지막 옵션은 테스트청취자가 될 수 있습니다.

저는 같은 질문을 가지고 이 페이지를 방문했지만, 모든 수업에서 승인된 답변이 실행되고 있고, 저에게 정답은 아니었습니다.

저와 같은 경우 첫 번째 "통합 테스트"는 DB를 삭제하고 마이그레이션을 실행하는 것입니다.그러면 모든 테스트의 데이터베이스 기준선에 도달합니다.이 시점에서는 이행 파일을 계속 변경하고 있기 때문에 베이스라인을 설정하는 것은 모든 테스트의 일부입니다.

이행에 시간이 걸리기 때문에 모든 테스트에서 이행을 실행하지 않도록 합니다.

그리고 각 부품을 테스트하는 데이터베이스를 구축해야 했습니다.주문 테스트를 작성해야 하는데, 먼저 몇 가지 제품을 만들어 테스트하고 나서 Import 기능을 테스트해야 합니다.

그래서 제가 한 일은 굉장히 쉬운데 인터넷에서는 잘 설명되지 않았습니다.데이터베이스를 설정하기 위한 간단한 테스트를 만들었습니다.그런 다음 phpspec.xml 파일에 testsuite를 추가합니다.

<testsuite name="Products">
    <file>tests/in/SystemSetupTest.php</file>
    <file>tests/in/ProductTest.php</file>
    <file>tests/in/ProductImportTest.php</file>
</testsuite>

System Setup Test.php 。

class SystemSetupTest extends ApiTester
{

    /** @test */
    function system_init()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        self::createEM(); //this has all the code to init the system...
    }
}

그런 다음 다음과 같이 실행합니다.

phpunit --testsuite 제품

결국엔 훨씬 쉬울 거야그러면 시스템을 올바르게 구축할 수 있습니다.

추가로 저는 라라벨5를 사용하고 있습니다.사용시setUpBeforeClass()부트스트랩의 문제가 발생하게 됩니다.이 문제는 해결할 수 있다고 확신하지만, 위의 방법은 완벽하게 동작합니다.

bootstrap이러한 경우 옵션을 사용할 수 있습니다.

명령줄에서 호출할 수 있습니다.

phpunit --bootstrap myBootstrap.php

또는 다음과 같이 XML 파일에 저장합니다.

<phpunit bootstrap="myBootstrap.php">
...
</phpunit>

수락된 답변에 대한 확장:

어느 것도 아니다setUpBeforeClass(),tearDownAfterClass(),@beforeClass,@afterClass는 오브젝트 컨텍스트(스태틱메서드)에서 실행됩니다.이 제한을 회피할 수 있습니다.@before대신 다음과 같이 정적 속성을 가진 코드:

class MyTest extends PHPUnit\Framework\TestCase
{
    private static $ready = false;

    /**
     * @before
     */
    protected function firstSetUp()
    {
        if (static::$ready))
            return;

        /* your one time setUp here */

        static::$ready = true;
    }
}

에 사용할 수 없습니다.@after하지만, 마지막 시험이 언제 소집되었는지 말할 방법이 없기 때문이다.

언급URL : https://stackoverflow.com/questions/7158930/phpunit-how-do-i-create-a-function-to-be-called-once-for-all-the-tests-in-a-cla

반응형