【问题标题】:symfony2 phpunit : how to drop and copy database before running tests?symfony2 phpunit:如何在运行测试之前删除和复制数据库?
【发布时间】:2015-10-23 15:57:52
【问题描述】:

在我的 symfony2 应用程序中,我使用 phpunit 来验证每个路由的响应是否有代码 200。

在我运行测试之前,我想删除测试数据库并将我的生产数据库复制到名称 test 下(即我想重新启动我的测试数据库)。

我了解了public static function setUpBeforeClass(),但不知道如何删除和复制数据库。

我该怎么做?

到目前为止我的课:

<?php

namespace AppBundle\Tests\Controller;

use AppBundle\FoodMeUpParameters;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

require_once __DIR__.'/../../../../app/AppKernel.php';


class ApplicationAvailabilityFunctionalTest extends WebTestCase
{

    public static function setUpBeforeClass()
    {

    }

    /**
     * @dataProvider routeProvider
     * @param $route
     */
    public function testAllRoutesAreLoaded($route)
    {
        $listedRoutes = $this->getListedRoutes();

        $this->assertArrayHasKey($route, $listedRoutes);
    }
}

【问题讨论】:

  • 查看 Doctrine 的数据装置
  • 是的,我对固定装置有所了解,我正在使用它,但我不知道如何在这里删除整个数据库...
  • 加载数据夹具时,可以选择截断整个数据库,然后加载新数据。
  • 好吧,$executor->execute($loader->getFixtures(), false);将清空数据库但不会删除它,对吗?然后我想复制另一个名为 test 的现有数据库。
  • 哦,好的,您想从现有数据库中复制数据吗?这不是固定装置的工作方式,但这很好。最简单的方法是在旧数据库上使用 mysql 转储,然后使用该 .sql 文件导入 mysql。

标签: php unit-testing symfony testing phpunit


【解决方案1】:

我的 5c。通常你不需要使用setUpBeforeClass,因为它会为整个套件填充数据库,因此会产生测试依赖的风险,而单元测试必须是独立的。请改用setUptearDown 方法。现在切入正题:您说您只想测试代码 200 的响应。当您可以简单地模拟模型的预期响应时,为什么要首先为此填充整个数据库?

【讨论】:

  • 好吧,测试每条路线是否得到响应 200 比为所有模型定义预期答案要快得多。这是第一次基本检查
  • 不,不是因为数据库操作的开销很大。还可以想象您正在测试的其中一条路线更新数据库。您如何确定以下测试不会给您误报?
  • 好吧,我知道我在做什么,而且路线是有序的,不会发生坏事。我可以做一些完美的事情,但在这里我想做一些快速而且很好的事情。让它完美需要更多时间,我正在一点一点地努力
【解决方案2】:

这是一些用于备份 MySQL 数据库的 PHP 代码。 --routines 包括您的视图、函数、存储过程等。

<?php
$schemaFile = "schema.sql";
$mysqlArgs  = "-u {$dbUser} -h {$dbHost} {$dbName}";

//if you don't have a pass and still pass in arg -p it will interrupt and prompt
if (isset($dbPassword) && strlen(trim($dbPassword)) > 0) { 
    $mysqlArgs .= " -p{$dbPassword}";
}

$mysqlDumpCommand = "mysqldump {$mysqlArgs} --routines";
$schemaDump       = "{$mysqlDumpCommand} > {$schemaFile}";
system($schemaDump);

然后导入它的代码假设与上面相同的$mysqlArgs 代码。

$mysqlImportCommand = "mysql {$mysqlArgs}";
$import             = "{$mysqlImportCommand} < {$schemaFile}";
system($import);

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 2013-04-25
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2012-04-03
    • 1970-01-01
    • 2018-08-09
    相关资源
    最近更新 更多