搜索
首页后端开发php教程快速提示:使用一次性数据库测试Symfony应用程序

Quick Tip: Testing Symfony Apps with a Disposable Database

关键要点

  • 内存数据库仅存在于应用程序内存中,是测试与数据库交互的代码的实用解决方案。它们易于与使用 Doctrine 的 Symfony 应用程序一起设置,并且由于其可丢弃性而非常适合测试。
  • Symfony 的测试环境配置允许创建可丢弃的测试数据库。需要编辑以设置这些数据库的配置文件是 app/config/config_test.php。使用 SQLite3 对内存数据库的支持可以通过向功能数据库发送 SQL 查询来促进测试,从而无需模拟存储库类。
  • 在测试类中使用内存数据库时,必须首先构建模式,这意味着必须为测试套件加载实体的表和任何所需的固定装置。数据库引导程序可以用来完成大部分工作,类似于强制运行 Doctrine 模式更新控制台命令。

测试与数据库交互的代码可能非常痛苦。一些开发人员模拟数据库抽象,因此没有测试实际的查询。其他开发人员为开发环境创建测试数据库,但在持续集成和维护此数据库的状态方面,这也可能很痛苦。Quick Tip: Testing Symfony Apps with a Disposable Database 内存数据库是这些选项的替代方案。由于它们仅存在于应用程序的内存中,因此它们是真正的一次性且非常适合测试的。值得庆幸的是,这些非常易于与使用 Doctrine 的 Symfony 应用程序一起设置。尝试阅读我们关于使用 Symfony 进行功能测试的指南,以了解测试应用程序的端到端行为。

Symfony 环境配置

Symfony 框架最强大的功能之一是能够创建具有自己独特配置的不同环境。Symfony 开发人员可能会忽略此功能,尤其是在此处研究的鲜为人知的测试环境方面。Symfony 关于掌握和创建新环境的指南解释了框架如何处理不同环境的配置,并展示了一些有用的示例。需要编辑以设置可丢弃测试数据库的配置文件是 app/config/config_test.php。当在测试套件中访问应用程序时,内核将使用测试环境加载,并且将处理此配置文件。

使用 Doctrine 的内存数据库

SQLite3 支持内存数据库,非常适合测试。使用这些数据库,可以通过实际向功能数据库发送 SQL 查询来测试应用程序,从而无需费力地模拟具有预定义行为的存储库类。数据库将在测试开始时是新的,并在结束时干净地销毁。要覆盖默认的 Doctrine 连接配置,需要将以下行添加到测试环境配置文件中。如果应用程序中配置了多个 Doctrine 连接,则可能需要稍微调整一下以进行匹配。

# app/config/config_test.yml

doctrine:
    dbal:
        driver:  pdo_sqlite
        memory:  true
        charset: UTF8

在测试类中使用数据库

在测试类中使用这个闪亮的新内存数据库时,必须首先构建模式。这意味着创建实体的表并加载测试套件所需的任何固定装置。下面的类可以用作数据库引导程序,它可以完成大部分工作。它具有与强制运行 Doctrine 模式更新控制台命令相同的效果。

<?php
namespace Tests\AppBundle;

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Tools\SchemaTool;
use Symfony\Component\HttpKernel\KernelInterface;

class DatabasePrimer
{
    public static function prime(KernelInterface $kernel)
    {
        // 确保我们处于测试环境中
        if ('test' !== $kernel->getEnvironment()) {
            throw new \LogicException('Primer must be executed in the test environment');
        }

        // 从服务容器获取实体管理器
        $entityManager = $kernel->getContainer()->get('doctrine.orm.entity_manager');

        // 使用我们的实体元数据运行模式更新工具
        $metadatas = $entityManager->getMetadataFactory()->getAllMetadata();
        $schemaTool = new SchemaTool($entityManager);
        $schemaTool->updateSchema($metadatas);

        // 如果您使用的是 Doctrine Fixtures Bundle,您可以在此处加载它们
    }
}

如果需要实体管理器来测试类,则必须应用引导程序:

<?php
namespace Tests\AppBundle;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Tests\AppBundle\DatabasePrimer;

class FooTest extends KernelTestCase
{
    public function setUp()
    {
        self::bootKernel();

        DatabasePrimer::prime(self::$kernel);
    }

    public function testFoo()
    {
        $fooService = self::$kernel->getContainer()->get('app.foo_service');

        // ...
    }
}

在上面的示例中,容器用于获取正在测试的服务。如果此服务依赖于实体管理器,它将使用在 setUp 方法中引导的相同实体管理器进行构建。如果需要更多控制,例如模拟另一个依赖项,则始终可以从容器中检索实体管理器并将其用于手动实例化需要测试的类。使用 Doctrine Fixtures Bundle 使用测试数据填充数据库也可能是一个好主意,但这取决于您的用例。

(此处应继续翻译剩余的FAQ部分,保持与原文结构一致)

以上是快速提示:使用一次性数据库测试Symfony应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
可以在PHP会话中存储哪些数据?可以在PHP会话中存储哪些数据?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,数字,数组和原始物。

您如何开始PHP会话?您如何开始PHP会话?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考虑使用AttActAcks.s.s.4)

什么是会话再生,如何提高安全性?什么是会话再生,如何提高安全性?May 02, 2025 am 12:15 AM

会话再生是指在用户进行敏感操作时生成新会话ID并使旧ID失效,以防会话固定攻击。实现步骤包括:1.检测敏感操作,2.生成新会话ID,3.销毁旧会话ID,4.更新用户端会话信息。

使用PHP会话时有哪些性能考虑?使用PHP会话时有哪些性能考虑?May 02, 2025 am 12:11 AM

PHP会话对应用性能有显着影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHP会话与Cookie有何不同?PHP会话与Cookie有何不同?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

PHP如何识别用户的会话?PHP如何识别用户的会话?May 01, 2025 am 12:23 AM

phpientifiesauser'ssessionusessessionSessionCookiesAndSessionIds.1)whiwSession_start()被称为,phpgeneratesainiquesesesessionIdStoredInacookInAcookInamedInAcienamedphpsessidontheuser'sbrowser'sbrowser.2)thisIdAllowSphptptpptpptpptpptortoreTessessionDataAfromtheserverMtheserver。

确保PHP会议的一些最佳实践是什么?确保PHP会议的一些最佳实践是什么?May 01, 2025 am 12:22 AM

PHP会话的安全可以通过以下措施实现:1.使用session_regenerate_id()在用户登录或重要操作时重新生成会话ID。2.通过HTTPS协议加密传输会话ID。3.使用session_save_path()指定安全目录存储会话数据,并正确设置权限。

PHP会话文件默认存储在哪里?PHP会话文件默认存储在哪里?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。