如何使用 Doctrine Fixture 加载测试数据库进行 PHP 单元测试?

Posted

技术标签:

【中文标题】如何使用 Doctrine Fixture 加载测试数据库进行 PHP 单元测试?【英文标题】:How to use Doctrine Fixture to load test database for PHP unit testing? 【发布时间】:2020-11-01 06:53:01 【问题描述】:

我正在尝试设置一个数据库环境来测试我的 Doctrine ORM 实体类,而不更改我的真实数据库。

我关注了Symfony's documentation,但是当我运行php bin/console doctrine:fixtures:load 时,我收到了警告:

小心,数据库“图表”将被清除。你想继续吗? (是/否)[否]:

尽管我已经在我的.env.test 文件中设置了一个环境变量:

DATABASE_URL=mysql://testUser:testPassword@127.0.0.1/graph_test

编辑:这是整个.env.test 文件:

# define your env variables for the test env here
KERNEL_CLASS='App\Kernel'
APP_SECRET='$ecretf0rt3st'
SYMFONY_DEPRECATIONS_HELPER=999999
PANTHER_APP_ENV=panther

# Database test
DATABASE_URL=mysql://testUser:testPassword@127.0.0.1/graph_test

我尝试更改我的 test/bootstrap.php 文件,但收到相同的警告。

有没有办法告诉教义从.env.test 文件中获取DATABASE_URL 值?任何帮助将不胜感激。

PS 不需要多个测试 .env 文件。

【问题讨论】:

请提供您的 .env.test 文件(去掉凭据),也许您应该使用.env.local?什么时候在本地调试? 也许我将来会这样做,现在我只进行本地测试。 尝试将 .env.test 重命名为 .env.local 以确保它被使用。正如 symfony 文档指出的那样,如果您想使用自定义(在您的情况下为“测试”环境),则需要额外的步骤。默认使用.env.local。 symfony.com/doc/current/… 试试php bin/console doctrine:fixtures:load --env=test 如果您接受,我会将其作为答案发布。 【参考方案1】:

doctrine 测试包括运行迁移,以便在每次测试运行时在数据库中拥有相同的数据。

从您发布的页面...

Resetting the Database Automatically Before each Test¶

这将导致消息Careful, database ... will be purged. 这是警告,而不是错误。

【讨论】:

但我不希望我的真实数据库和我的测试数据库相同。我希望真实数据库保持不变,但在每次测试之前重置 test 数据库。【参考方案2】:

当您要加载配置时,请确保它在 .env.local 中定义,或者如果您使用的是 test 等自定义环境,请将 --env=test 参数添加到您的命令中

  php bin/console doctrine:fixtures:load --env=test
  php bin/console server:run --env=test

【讨论】:

【参考方案3】:

如果您使用php bin/console doctrine:fixtures:load --env=test,您只会影响您的测试数据库。

【讨论】:

以上是关于如何使用 Doctrine Fixture 加载测试数据库进行 PHP 单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

加载 Doctrine 固定装置时如何在控制台中禁用查询日志记录?

pytest学习和使用6-fixture如何使用?

pytest学习和使用6-fixture如何使用?

Doctrine ODM:如何选择Mongodb数据库

Doctrine ODM:如何选择Mongodb数据库

动态加载与 Doctrine 的深层关系