繁体   English   中英

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

[英]PHPUnit: How do I create a function to be called once for all the tests in a class?

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

oneTimeTearDown()函数的相同问题。

在 PHPUnit 中可以这样做吗?

查看 PHPUnit 文档第 6 节中的setUpBeforeClass()

一次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;
    }
  }

}

最后一个选项可能是测试侦听器

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

如果您像我一样,您的第一个“集成测试”就是清除数据库并运行迁移。 这使您自己处于所有测试的数据库基线。 此时我会不断更改迁移文件,因此设置基线确实是所有测试的一部分。

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

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

所以,我所做的非常简单,但在互联网上并没有很好地解释。 我创建了一个简单的测试来设置数据库。 然后在您的 phpspec.xml 文件中添加一个测试套件....

<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()我最终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 ,因为无法确定上次测试的调用时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM