1

在生产服务器上的每次代码更新之前,我通过在测试数据库中插入行来执行 phpunit 测试。由于测试数据库不反映生产数据库的内容,我想在生产数据库上执行测试。测试完成后,我想在测试期间删除所有创建的行。实现这一目标的最佳方法是什么?我想不出一种非常好的方法,而且没有改变生产数据的风险。

4

2 回答 2

1

我使用 Alexandre Salome 在Symfony2 中的测试隔离中描述的方法,将我的测试与事务隔离并在最后回滚。这种方法非常有效,但很明显,在生产数据库上使用它之前,您需要对其进行彻底的测试!

于 2013-02-01T10:09:56.213 回答
0

我建议您使用 sqlite(默认)进行测试,因为它更快,并且您不必担心它们是否会在生产数据库上搞砸。我所做的是每

EntityTest.php extends TestsHelper.php extends PHPUnit_Framework_TestCase

在 setup() 中,我创建了数据库和固定装置。

我从互联网上获取了代码,它可以工作。你可能会发现它很有用。

 // class TestsHelper

 /**
 * @var Symfony\Component\DependencyInjection\Container
 */
protected $container;

public function setUp()
{
    // Boot the AppKernel in the test environment and with the debug.
    $this->kernel = new \AppKernel('test', true);
    $this->kernel->boot();

    // Store the container and the entity manager in test case properties
    $this->container = $this->kernel->getContainer();
    $this->em = $this->container->get('doctrine')->getEntityManager();

    // Build the schema for sqlite
    $this->generateSchema();

    $this->generateFixtures() ;

    parent::setUp();
}

public function tearDown()
{
    // Shutdown the kernel.
    $this->kernel->shutdown();

    parent::tearDown();
}

protected function generateSchema()
{
    // Get the metadatas of the application to create the schema.
    $metadatas = $this->getMetadatas();

    if ( ! empty($metadatas)) {
        // Create SchemaTool

        /**
        * @var \Doctrine\ORM\Tools\SchemaTool
        */
        $tool = new SchemaTool($this->em);
//            $tool->dropDatabase() ;
        $tool->createSchema($metadatas);
    } else {
        throw new Doctrine\DBAL\Schema\SchemaException('No Metadata Classes to process.');
    }
}
/**
 * Overwrite this method to get specific metadatas.
 *
 * @return Array
 */
protected function getMetadatas()
{
    return $this->em->getMetadataFactory()->getAllMetadata();
}

在 generateFixtures() 中,您将照常创建它们:

$entity = new MyEntity() ;
$this->em->persist($entity) ;
$this->em->flush() ;
于 2013-02-01T15:46:37.753 回答