在symfony 3上的所有phpunit测试之前加载灯具一次

时间:2017-09-12 13:21:39

标签: performance symfony doctrine-orm phpunit fixtures

我有一个SF3应用程序和许多功能测试。 在每次测试之前,我们加载并清除所有夹具。 所有测试的时间都很长。 我想在最后一次测试后加载灯具一次并截断。

这是提高功能测试速度的好方法吗?

在phpunit中是否有一个php方法,它在所有测试之前只启动一次? (因为setUpBeforeClass在每次测试之前执行)

我的测试类中setUpBeforeClass方法的例子。

class SearchRegisterControllerTest extends WebTestCase
{
    /** @var Client $client */
    private $client;

    protected static $application;

    public static function setUpBeforeClass()
    {
        $kernel = static::createKernel();
        $kernel->boot();

        $em = $kernel->getContainer()->get('doctrine.orm.entity_manager');
        $schemaTool = new SchemaTool($em);
        $metadata = $em->getMetadataFactory()->getAllMetadata();

        $schemaTool->dropSchema($metadata);
        $schemaTool->createSchema($metadata);

        /** @var Client $client */
        $client = static::createClient();
        $em = $client->getContainer()->get('doctrine.orm.entity_manager');

        $loader = new Loader();

        $loader->loadFromDirectory('src/MyNameSpace/AppBundle/DataFixtures/ORM');

        $purger = new ORMPurger();
        $executor = new ORMExecutor($em, $purger);
        $executor->execute($loader->getFixtures(), true);

    }

提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以实施a test listener

测试/ StartTestSuiteListener.php

namespace App\Tests;



class StartTestSuite extends \PHPUnit_Framework_BaseTestListener
{
    public function startTestSuite(\PHPUnit_Framework_TestSuite $suite)
    {
      // do initial stuff
    }

}

然后在phpunit.xml配置中启用enable the test listener

phpunit.xml

<phpunit
 ...
>
    <listeners>
        <listener class="App\Tests\StartTestSuiteListener">
        </listener>
    </listeners>
[...]
</phpunit>

以同样的方式实现endTestSuite(检查文档中列出的所有事件)

希望这个帮助

答案 1 :(得分:1)

您可以使用这样的bash脚本在所有测试之前加载一次灯具。

php bin/console doctrine:database:create --env=test --if-not-exists
php bin/console doctrine:schema:update --force --env=test --complete
php bin/console doctrine:fixtures:load --fixtures=tests/fixtures/api --env=test --no-interaction
php vendor/bin/phpunit tests/Functional

请记住,您的测试不会在具有新数据的隔离环境中执行,因此会相互干扰。