数据库
首页 > 数据库> > php-MySQL上数据库事务内的Codeception验收测试

php-MySQL上数据库事务内的Codeception验收测试

作者:互联网

使用Codeception为我们的Custom(带有Symfony组件和Doctrine)框架编写验收测试.我们有一套实用方法,供我们的Phpunit测试分别使用,用于创建要测试的各种实体.这包括诸如用户和其他相关数据之类的东西.

就我们的Codeception测试而言,我们希望利用此功能,使我们可以播种自定义数据并在之后进行清理.在我们的单元测试中,这是由事务处理的.鉴于Codeception通过Phantomjs通过HTTP向我们的应用程序发出请求,因此它无法利用事务,因为已为测试所用的数据库创建了一个单独的数据库连接(看起来可以使用Dbh来实现,但这不受支持)由MySQL提供,因为不支持嵌套事务.这样的结果是验收测试可以播种数据,但是除非持久化数据,否则该数据在外部请求中不存在.

我能想到的唯一其他解决方案是在测试套件运行之前触发数据库转储.将我们的测试数据保留到数据库中,以便外部请求可以访问它,然后在测试套件完成后还原转储的数据库.但是,我们有一个相当大的数据库,这将增加运行测试套件的大量开销.

我希望还有其他选择,或者我们可以尝试其他方法.
谢谢.

解决方法:

总是有其他选择:).

在我的情况下,使用转储是不可能的,因为我们还有一个非常大的数据库(精简后的容量为1.2 GB,实时大于250GB).
相反,我有一堆.sql文件,它们删除了特定测试插入的所有记录.

我有一个类DbHelper,它具有运行查询的功能:

public function executeOnDatabase($path_to_sql_file)
{
    $sql = file_get_contents($path_to_sql_file);
    $dbh = $this->getModule('Db')->dbh;
    $this->debugSection('Query', $sql);
    $sth = $dbh->prepare($sql);

    return $sth->execute();
}

可以作为一种魅力,而无需再运行测试.

更新:

如果您处理用户及其相关数据,通常很容易将需要删除的所有记录作为目标.用户名和电子邮件很可能是唯一的,您可以使用它们来获取用户的ID(自动递增主键).该ID可能在相关表中使用.
例如这样:

SET @user_id = (SELECT `id` FROM `users` WHERE `username` = 'rgsfdg');
SET @email = 'fdsgds@hgdhf.nl';
DELETE FROM `mail_queue` WHERE `send_to` = @email;
DELETE FROM `user_settings` WHERE `user_id` = @user_id;
DELETE FROM `users` WHERE `id` = @user_id;

标签:codeception,php,mysql,testing
来源: https://codeday.me/bug/20191013/1908811.html