【问题标题】:Load fixtures one time before all phpunit test on symfony 3在 symfony 3 上的所有 phpunit 测试之前加载一次固定装置
【发布时间】:2017-09-12 13:21:39
【问题描述】:

我有一个 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);

    }

提前致谢。

【问题讨论】:

    标签: performance symfony doctrine-orm phpunit fixtures


    【解决方案1】:

    你可以实现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(检查文档中列出的所有事件)

    希望有帮助

    【讨论】:

    • 如何在这个监听器中注入服务? ContainerAwareInterface 似乎不起作用
    【解决方案2】:

    您可以使用这样的 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
    

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

    【讨论】:

    • 很好,但我发现是否可以更清洁地执行架构:drop/create/validate。
    猜你喜欢
    • 2019-03-14
    • 2016-03-24
    • 2015-10-02
    • 2010-11-02
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多