免责声明:我不是神圣实体。我所说的并不是绝对的真理。甚至不要害怕质疑世界,因为它可能是错的,而不是你。
今天对于任何人来说,自动化测试对于保持软件的质量和完整性的重要性都不是秘密,通常我们会谈论很多单元测试,但是今天,我们将更多地关注到 Symfony 框架中的集成测试。
我没有耐心,给我看代码!
好吧好吧!如果你没有耐心阅读这篇文章,我有一个测试项目,在下面的链接中实现了本文。
https://github.com/joubertredrat/symfony-testcontainers
Symfony 框架和集成测试
如今,Symfony 框架是 PHP 领域最成熟、最稳定的框架之一,它拥有各种良好的实施解决方案,例如集成测试。但是,我个人一直认为,虽然集成测试本身很容易,但为测试提供外部依赖项并不总是那么容易,例如数据库。
即使使用像 Docker 这样的解决方案,我仍然意识到有必要以某种方式提供外部依赖项以进行测试,但是,存在一个非常有趣的解决方案,可以使这一步变得更加容易,即 Testcontainers。
测试容器
Testcontainers 是一个开源框架,可让您以简单的方式提供使用 Docker 所需的任何外部依赖项,如数据库、消息代理、缓存系统或容器中的依赖项。
Testcontainers 相对于 Docker compose 或其他容器编排方式的一大优势是您可以对容器的配置进行编码,并且现在已经支持 Golang、Java、.NET、Node.js、Python、Rust 等各种语言其他语言,当然还有 PHP!
我第一次接触 Testcontainers 是在 Golang 的一个项目中,我非常喜欢配置 MongoDB 容器来进行存储库测试的功能,之后,我决定使用 Symfony 框架在我的个人 PHP 项目中做同样的事情。
Symfony + 测试容器 = ❤️
Symfony 最大的优势之一是支持与 PHPUnit 集成进行测试,并使用功能内核来执行测试所需的引导。
虽然 Testcontainers 支持 PHP,但它们的实现是最近才实现的,您可以在 https://github.com/testcontainers/testcontainers-php 查看它。
下面我们有一个MySQL 8.0容器的实现,它是这个项目的外部依赖,以及Symfony内核的启动,数据库和模式的创建。
class IntegrationTestCase extends KernelTestCase { protected static ?MySQLContainer $container = null; public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); if (!static::$container) { static::$container = MySQLContainer::make('8.0', 'password'); static::$container->withPort('19306', '3306'); static::$container->run(); $kernel = self::bootKernel(); $container = $kernel->getContainer(); $application = new Application($kernel); $application->setAutoExit(false); $application->run( new ArrayInput(['command' => 'doctrine:database:create', '--if-not-exists' => true]) ); $entityManager = $container->get('doctrine')->getManager(); $metadata = $entityManager->getMetadataFactory()->getAllMetadata(); $schemaTool = new SchemaTool($entityManager); $schemaTool->dropSchema($metadata); $schemaTool->createSchema($metadata); } } public static function tearDownAfterClass(): void { parent::tearDownAfterClass(); if (static::$container instanceof MySQLContainer) { static::$container->remove(); } }
有了这个,我们就有了将执行测试本身的类的基础类,如下所示。
class UserRepositoryTest extends IntegrationTestCase { public function testSave(): void { $user = new User(); $user->setName('John Doe'); $user->setEmail('john@doe.local'); $repo = $this->getRepository(); $repo->save($user, true); self::assertNotNull($user->getId()); self::assertIsInt($user->getId()); self::assertTrue($user->getId() > 0); } public function testGetByEmail(): void { $user = new User(); $user->setName('John Doe'); $user->setEmail('john2@doe.local'); $repo = $this->getRepository(); $userNotFound = $repo->getByEmail($user->getEmail()); self::assertNull($userNotFound); $repo->save($user, true); $userFound = $repo->getByEmail($user->getEmail()); self::assertEquals($user->getEmail(), $userFound->getEmail()); } protected function tearDown(): void { parent::tearDown(); $connection = $this ->getContainer() ->get('doctrine') ->getManager() ->getConnection() ; $connection->executeStatement('TRUNCATE TABLE users'); } protected function getRepository(): UserRepository { return $this->getContainer()->get(UserRepository::class); } }
运行测试套件时,您可以看到与仅具有模拟行为的测试的单元测试相比,测试执行速度较慢,但这是正常的,因为在此过程中,Testcontainers 正在配置您定义在测试中使用的容器.
最后,有了这个设施,就可以做一些疯狂的事情,比如 100% 的覆盖率。不相信吗?您可以在 https://joubertredrat.github.io/symfony-testcontainers 亲自查看。
就这样,下期见!
以上是Symfony 与 Testcontainers 的集成测试的详细内容。更多信息请关注PHP中文网其他相关文章!

PHP是一种服务器端脚本语言,用于动态网页开发和服务器端应用程序。1.PHP是一种解释型语言,无需编译,适合快速开发。2.PHP代码嵌入HTML中,易于网页开发。3.PHP处理服务器端逻辑,生成HTML输出,支持用户交互和数据处理。4.PHP可与数据库交互,处理表单提交,执行服务器端任务。

PHP在过去几十年中塑造了网络,并将继续在Web开发中扮演重要角色。1)PHP起源于1994年,因其易用性和与MySQL的无缝集成成为开发者首选。2)其核心功能包括生成动态内容和与数据库的集成,使得网站能够实时更新和个性化展示。3)PHP的广泛应用和生态系统推动了其长期影响,但也面临版本更新和安全性挑战。4)近年来的性能改进,如PHP7的发布,使其能与现代语言竞争。5)未来,PHP需应对容器化、微服务等新挑战,但其灵活性和活跃社区使其具备适应能力。

PHP的核心优势包括易于学习、强大的web开发支持、丰富的库和框架、高性能和可扩展性、跨平台兼容性以及成本效益高。1)易于学习和使用,适合初学者;2)与web服务器集成好,支持多种数据库;3)拥有如Laravel等强大框架;4)通过优化可实现高性能;5)支持多种操作系统;6)开源,降低开发成本。

PHP没有死。1)PHP社区积极解决性能和安全问题,PHP7.x提升了性能。2)PHP适合现代Web开发,广泛用于大型网站。3)PHP易学且服务器表现出色,但类型系统不如静态语言严格。4)PHP在内容管理和电商领域仍重要,生态系统不断进化。5)通过OPcache和APC等优化性能,使用OOP和设计模式提升代码质量。

PHP和Python各有优劣,选择取决于项目需求。1)PHP适合Web开发,易学,社区资源丰富,但语法不够现代,性能和安全性需注意。2)Python适用于数据科学和机器学习,语法简洁,易学,但执行速度和内存管理有瓶颈。

PHP用于构建动态网站,其核心功能包括:1.生成动态内容,通过与数据库对接实时生成网页;2.处理用户交互和表单提交,验证输入并响应操作;3.管理会话和用户认证,提供个性化体验;4.优化性能和遵循最佳实践,提升网站效率和安全性。

PHP在数据库操作和服务器端逻辑处理中使用MySQLi和PDO扩展进行数据库交互,并通过会话管理等功能处理服务器端逻辑。1)使用MySQLi或PDO连接数据库,执行SQL查询。2)通过会话管理等功能处理HTTP请求和用户状态。3)使用事务确保数据库操作的原子性。4)防止SQL注入,使用异常处理和关闭连接来调试。5)通过索引和缓存优化性能,编写可读性高的代码并进行错误处理。

在PHP中使用预处理语句和PDO可以有效防范SQL注入攻击。1)使用PDO连接数据库并设置错误模式。2)通过prepare方法创建预处理语句,使用占位符和execute方法传递数据。3)处理查询结果并确保代码的安全性和性能。


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3汉化版
中文版,非常好用

Atom编辑器mac版下载
最流行的的开源编辑器