hautelook / alice-bundle
Symfony 扩展包,用于使用 Alice 和 Faker 管理测试数据。
Requires
- php: ^8.2
- doctrine/data-fixtures: ^1.7
- doctrine/doctrine-bundle: ^2.11.3
- doctrine/orm: ^3.1
- doctrine/persistence: ^3.3.1
- psr/log: ^1.0 || ^2.0 || ^3.0
- symfony/finder: ^6.4 || ^7.0
- symfony/framework-bundle: ^6.4 || ^7.0
- theofidry/alice-data-fixtures: ^1.7
Requires (Dev)
- monolog/monolog: ^3.5
- phpspec/prophecy: ^1.14.0
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: ^9.6.17
- symfony/phpunit-bridge: ^6.4.4 || ^7.0
- dev-master / 2.x-dev
- 2.14.1
- 2.14.0
- 2.13.0
- 2.12.2
- 2.12.1
- 2.12.0
- 2.11.0
- 2.10.0
- 2.9.0
- 2.8.0
- 2.7.3
- 2.7.2
- v2.7.1
- v2.7.0
- v2.6.2
- v2.6.1
- v2.6.0
- v2.5.1
- 2.5.0
- v2.4.1
- v2.4.0
- v2.3.0
- v2.2.0
- v2.1.0
- v2.0.0
- v2.0.0-rc.0
- v2.0.0-beta.6
- v2.0.0-beta.5
- v2.0.0-beta.4
- v2.0.0-beta.3
- v2.0.0-beta.2
- v2.0.0-beta.1
- v2.0.0-beta.0
- v1.4.1
- v1.4.0
- v1.3.1
- v1.3.0
- v1.2.3
- v1.2.2
- v1.2.1
- v1.2.0
- v1.1.1
- v1.1.0
- v1.0.0
- v1.0.0-beta.5
- v1.0.0-beta.4
- v1.0.0-beta.3
- v1.0.0-beta.2
- v1.0.0-beta
- 0.2
- 0.1.5
- 0.1.4
- 0.1.3
- 0.1.2
- 0.1.1
- 0.1
This package is auto-updated.
Last update: 2024-09-05 14:12:41 UTC
README
A Symfony 扩展包,用于使用 nelmio/alice 和 fzaninotto/Faker 管理测试数据。
数据库支持由 FidryAliceDataFixtures 完成。查看此项目以了解支持哪些数据库/ORM。
警告:这是 HautelookAliceBundle 2.0 的文档。如果您想查看 1.x 的文档,请点击 这里。
何时使用此扩展包?
HautelookAliceBundle 改变了很多,最初它只是一个简单的 nelmio/alice 扩展包,后来开始添加一些额外功能以丰富其功能。
HautelookAliceBundle 1.x 是达到一定成熟度的第一个里程碑
- 通过命令轻松加载一组测试数据
- 能够为多个环境定义不同的测试数据集
- 使用自定义 Faker 提供程序自定义数据生成
- 使用处理器自定义加载行为
HautelookAliceBundle 2.x 改变了很多,尽管变化不大。在 1.x 中,由于 nelmio/alice 2.x 的限制,扩展包中引入了很多复杂性,并且最好的解决方案是权宜之计(例如,无法处理循环引用)。其中很多复杂性都推回到了 nelmio/alice 3.x,它具有更灵活的设计。因此
- nelmio/alice 3.x 允许您以优雅的方式轻松创建具有随机数据的 PHP 对象
- FidryAliceDataFixtures 是 nelmio/alice 3.x 的持久化层。如果您需要持久化加载的对象,这是您需要的包。它提供灵活性,可以在每次加载之间清除数据,或者将加载包装在事务中,例如在测试完成后简单地回滚,而不是调用昂贵的清除操作。
- hautelook/alice-bundle 2.x 提供高级功能,包括测试数据发现(查找适当的文件并加载它们)以及数据库测试的辅助工具。如果您只需要为测试加载特定的文件集,FidryAliceDataFixtures 就足够了。
文档
安装
使用 Symfony Flex(推荐)
# If you do not have Doctrine installed yet:
composer require doctrine-orm
composer require --dev hautelook/alice-bundle
您已准备好使用 AliceBundle,可以跳转到下一部分!
如果没有 Flex,您将不得不安装 doctrine/orm
并在 app/AppKernel.php
或您的 Kernel 类所在的任何位置注册相应的扩展包
<?php // app/AppKernel.php public function registerBundles(): iterable { $bundles = [ new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), // ... new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(), ]; if (in_array($this->getEnvironment(), ['dev', 'test'])) { //... $bundles[] = new Nelmio\Alice\Bridge\Symfony\NelmioAliceBundle(); $bundles[] = new Fidry\AliceDataFixtures\Bridge\Symfony\FidryAliceDataFixturesBundle(); $bundles[] = new Hautelook\AliceBundle\HautelookAliceBundle(); } return $bundles; }
根据您的需求配置组件,例如:
# config/packages/dev/hautelook_alice.yaml hautelook_alice: fixtures_path: 'fixtures' # Path to which to look for fixtures relative to the project directory or the bundle path. May be a string or an array of strings. root_dirs: - '%kernel.root_dir%' - '%kernel.project_dir%'
如果您使用的是非flex架构,您可能想使用Resources/fixtures
而不是fixtures
。
基本用法
假设您正在使用Doctrine,请确保已安装doctrine/doctrine-bundle
和doctrine/data-fixtures
包。
然后在以下位置之一创建一个固定文件:
- 如果您使用flex,则使用
fixtures
- 如果您有一个无组件的non-flex Symfony应用程序,则使用
app/Resources/fixtures
src/AppBundle/Resources/fixtures
或您想要放置固定文件的任何组件下
# fixtures/dummy.yaml App\Entity\Dummy: dummy_{1..10}: name: <name()> related_dummy: '@related_dummy*'
# fixtures/related_dummy.yaml App\Entity\RelatedDummy: related_dummy_{1..10}: name: <name()>
然后使用doctrine命令简单地加载您的固定文件:php bin/console hautelook:fixtures:load
。
如果您只想加载组件的固定文件,则使用php bin/console hautelook:fixtures:load -b MyFirstBundle -b MySecondBundle
。
数据库测试
该组件提供了优秀的助手,受Laravel启发,专为数据库测试设计:RefreshDatabaseTrait
、ReloadDatabaseTrait
和RecreateDatabaseTrait
。这些特质允许在每次PHPUnit测试之前轻松地将数据库重置到已知状态:先清除数据库,然后加载固定文件。
为了提高性能,RefreshDatabaseTrait
只填充数据库一次,然后将每个测试包裹在一个事务中,该事务将在其执行结束后回滚(无论成功或失败)。
<?php namespace App\Tests; use Hautelook\AliceBundle\PhpUnit\RefreshDatabaseTrait; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class NewsTest extends WebTestCase { use RefreshDatabaseTrait; public function postCommentTest() { $client = static::createClient(); // The transaction starts just after the boot of the Symfony kernel $crawler = $client->request('GET', '/my-news'); $form = $crawler->filter('#post-comment')->form(['new-comment' => 'Symfony is so cool!']); $client->submit($form); // At the end of this test, the transaction will be rolled back (even if the test fails) } }
有时,将测试包裹在事务中是不可能的。例如,当使用Panther时,数据库更改是由另一个PHP进程进行的,所以它不起作用。在这种情况下,使用ReloadDatabase
特质。它将在每次测试之前清除DB并加载固定文件。
<?php namespace App\Tests; use Hautelook\AliceBundle\PhpUnit\ReloadDatabaseTrait; use Symfony\Component\Panther\PantherTestCase; class NewsTest extends PantherTestCase // Be sure to extends KernelTestCase, WebTestCase or PantherTestCase { use ReloadDatabaseTrait; public function postCommentTest() { $client = static::createPantherClient();// The database will be reset after every boot of the Symfony kernel $crawler = $client->request('GET', '/my-news'); $form = $crawler->filter('#post-comment')->form(['new-comment' => 'Symfony is so cool!']); $client->submit($form); } }
这种策略在Panther中使用不起作用,因为数据库更改是由另一个进程在事务外进行的。
这两个特质提供了多个配置选项,作为受保护的静态属性:
self::$manager
:要使用的Doctrine管理器的名称self::$bundles
:查找固定文件的组件列表self::$append
:追加固定文件而不是清除self::$purgeWithTruncate
:使用TRUNCATE清除self::$connection
:要使用的Doctrine连接的名称
在setUpBeforeClass
方法中使用它们。
<?php namespace App\Tests; use Hautelook\AliceBundle\PhpUnit\RefreshDatabaseTrait; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class NewsTest extends WebTestCase { use RefreshDatabaseTrait; public static function setUpBeforeClass() { self::$append = true; } // ... }
最后,如果您使用内存SQLite进行测试,则使用RecreateDatabaseTrait
来“实时”创建数据库模式。
<?php namespace App\Tests; use Hautelook\AliceBundle\PhpUnit\RecreateDatabaseTrait; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class NewsTest extends WebTestCase { use RecreateDatabaseTrait; // ... }
资源
- Behat扩展:AliceBundleExtension
- 用于直接从Doctrine实体生成AliceBundle兼容固定文件的组件:AliceGeneratorBundle
- 升级指南
- 变更日志
致谢
该组件最初由Baldur RENSCH和HauteLook开发。现在由Théo FIDRY维护。