hautelook/alice-bundle

Symfony 扩展包,用于使用 Alice 和 Faker 管理测试数据。

安装次数: 15,659,603

依赖者: 42

建议者: 4

安全: 0

星标: 163

关注者: 6

分支: 260

开放问题: 5

类型:symfony-bundle

2.14.1 2024-07-05 13:48 UTC

README

A Symfony 扩展包,用于使用 nelmio/alicefzaninotto/Faker 管理测试数据。

数据库支持由 FidryAliceDataFixtures 完成。查看此项目以了解支持哪些数据库/ORM。

警告:这是 HautelookAliceBundle 2.0 的文档。如果您想查看 1.x 的文档,请点击 这里

Package version Build Status SensioLabsInsight Dependency Status Scrutinizer Code Quality Code Coverage Slack

何时使用此扩展包?

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 就足够了。

文档

  1. 安装
  2. 基本用法
  3. 数据库测试
  4. 高级用法
    1. 启用数据库
    2. 环境特定测试数据
    3. 测试数据参数
      1. Alice 参数
      2. 应用程序参数
    4. 使用服务工厂
    5. 按特定顺序加载测试数据
      1. 按特定顺序加载测试数据
      2. 按特定顺序持久化类
    6. 验证
  5. 自定义 Faker 提供程序
  6. 自定义 Alice 处理器
  7. 资源

安装

使用 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-bundledoctrine/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启发,专为数据库测试设计:RefreshDatabaseTraitReloadDatabaseTraitRecreateDatabaseTrait。这些特质允许在每次PHPUnit测试之前轻松地将数据库重置到已知状态:先清除数据库,然后加载固定文件。

它们在编写功能测试和使用Panther时非常有帮助。

为了提高性能,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;

    // ...
}

资源

致谢

该组件最初由Baldur RENSCHHauteLook开发。现在由Théo FIDRY维护。

其他贡献者.

许可证

license