PHPUnit:如何创建一个为我的所有测试调用一次的函数?

时间:2011-08-23 09:34:06

标签: php phpunit

我有一个PHPUnit测试用例类(由一些测试函数组成)。我想为类中的所有测试编写一个oneTimeSetUp()函数来调用一次(与标准setUp()函数不同,该函数在类中为每个测试调用一次)。换句话说,我正在寻找一个等同于JUnit @BeforeClass annotation的PHPUnit。

oneTimeTearDown()函数相同的问题。

是否可以在PHPUnit中这样做?

5 个答案:

答案 0 :(得分:79)

查看PHPUnit文档的section 6中的setUpBeforeClass()

对于一次tearDown,您应该使用tearDownAfterClass();

这两种方法都应该在你的类中定义为静态方法。

答案 1 :(得分:6)

我带着同样的问题来到这个页面,但是所有课程都接受了接受的答案,而对我来说这不是正确的答案。

如果你像我一样,那么你的第一次"整合测试"是清除数据库,并运行迁移。这使您自己进入所有测试的数据库基线。我此时不断更改迁移文件,因此设置基线确实是所有测试的一部分。

迁移需要一段时间,因此我不希望它在所有测试中运行。

然后我需要建立测试每个部分的数据库。我需要编写一个订单测试,但首先我需要创建一些产品并进行测试,然后我需要测试一个导入功能。

所以,我所做的是SUPER easy,但在互联网上没有得到很好的解释。我创建了一个简单的测试来设置数据库。然后在你的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>

在SystemSetupTest.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产品

最后,它更轻松了。它将允许我正确地建立我的系统。

此外我正在使用laravel 5.当使用setUpBeforeClass()时,我最终遇到了引导问题,我相信我可以解决这个问题,但我上面使用的方法非常有效。

答案 2 :(得分:1)

在这些情况下可以使用bootstrap选项。

您可以从命令行调用它

phpunit --bootstrap myBootstrap.php

或将其放入XML文件中,如下所示:

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

答案 3 :(得分:0)

扩大接受的答案:

<li *ngFor="let page of pager.pages" [ngClass]="{active:pager.currentPage === page}"> <a (click)="setPage(page)">{{page}}</a> </li> setUpBeforeClass()tearDownAfterClass()@beforeClass都不在对象上下文中运行(静态方法)。您可以通过使用静态属性来保护任何@afterClass代码来解决该限制,如下所示:

@before

它不能用于class MyTest extends PHPUnit\Framework\TestCase { private static $ready; /** * @before */ protected function firstSetUp() { if (self::$ready)) return; /* your one time setUp here */ self::$ready = true; } } ,因为无法说出最后一次测试的时间。

答案 4 :(得分:0)

如果所有测试实际上都包含在一个类中,那么

setUpBeforeClass()是执行此操作的方法。

但是,您的问题有点暗示您可能正在将测试类用作多个测试类的基类。在这种情况下,setUpBeforeClass将在每个之前运行。如果只想运行一次,则可以使用静态变量对其进行保护:

abstract class TestBase extends TestCase {

  protected static $initialized = FALSE;

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

}

最后一个选项可能是test listener