Php 如何测试条令迁移?

Php 如何测试条令迁移?,php,symfony,doctrine-orm,doctrine,doctrine-migrations,Php,Symfony,Doctrine Orm,Doctrine,Doctrine Migrations,我正在从事一个在开发环境中没有生产数据库副本的项目 有时我们会遇到数据库迁移的问题-它们传递给dev DB,但在生产/测试中失败 这通常是因为开发环境数据是从使用最新实体的装置加载的——正确填充所有表 有什么简单的方法可以确保条令迁移在生产中通过吗 您是否有/知道编写自动测试的方法,以确保在不下载生产/测试数据库和手动运行迁移的情况下正确迁移数据 我希望避免将生产/测试数据库下载到开发人员的机器上,这样我就可以检查迁移,因为数据库包含私有数据,而且可能非常大。我已经找到了简单的迁移“冒烟测试”

我正在从事一个在开发环境中没有生产数据库副本的项目

有时我们会遇到数据库迁移的问题-它们传递给dev DB,但在生产/测试中失败

这通常是因为开发环境数据是从使用最新实体的装置加载的——正确填充所有表

有什么简单的方法可以确保条令迁移在生产中通过吗

您是否有/知道编写自动测试的方法,以确保在不下载生产/测试数据库和手动运行迁移的情况下正确迁移数据

我希望避免将生产/测试数据库下载到开发人员的机器上,这样我就可以检查迁移,因为数据库包含私有数据,而且可能非常大。

我已经找到了简单的迁移“冒烟测试”

我进行了PHPUnit测试,执行以下步骤:

  • 跌落试验分贝
  • 创建测试数据库
  • 加载迁移(创建架构)
  • 加载夹具(模拟生产数据)
  • 迁移到一些旧版本
  • 迁移回最新版本
这样我可以测试我们最近遇到的主要问题


PHPUnit测试的示例可以在我的博客上找到:

首先,您需要在迁移之前在state中创建一个示例数据库转储。对于MySQL,请使用mysqldump。对于postgres pg_转储,例如:

mysqldump -u root -p mydatabase > dump-2018-02-20.sql
pg_dump -Upostgres --inserts --encoding utf8 -f dump-2018-02-20.sql mydatabase
然后为所有迁移测试创建一个抽象类(我假设您已经在
config_test.yml
中为集成测试配置了一个单独的数据库):

迁移测试示例:

class Version20180222232445_MyMigrationTest extends DatabaseMigrationTestCase {
    /** @before */
    public function prepare() {
        $this->loadDump('2018-02-20');
        $this->migrate('20180222232445');
    }

    public function testMigratedSomeData() {
        $em = $this->container->get(EntityManagerInterface::class);
        $someRow = $em->getConnection()->executeQuery('SELECT * FROM myTable WHERE id = 1')->fetch();
        $this->assertEquals(1, $someRow['id']);
        // check other stuff if it has been migrated correctly
    }
}

如果您正在使用Git,您是否想过返回到上一个prod版本,重新创建您的db、fuxture和迁移,并转到必须最新的版本以运行较新的迁移。然而不幸的是,唯一可靠的测试是prod数据。
class Version20180222232445_MyMigrationTest extends DatabaseMigrationTestCase {
    /** @before */
    public function prepare() {
        $this->loadDump('2018-02-20');
        $this->migrate('20180222232445');
    }

    public function testMigratedSomeData() {
        $em = $this->container->get(EntityManagerInterface::class);
        $someRow = $em->getConnection()->executeQuery('SELECT * FROM myTable WHERE id = 1')->fetch();
        $this->assertEquals(1, $someRow['id']);
        // check other stuff if it has been migrated correctly
    }
}