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

标签 php mysql testing codeception

使用 Codeception 为我们的自定义(使用 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;

关于php - MySQL 数据库事务中的 Codeception 验收测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44499975/

相关文章:

php - Zend 框架 "under maintenance"页面

php json_encode mysql 结果以特定方式

mysql - 设置枚举字段的索引

testing - 如何设置PhantomJS的浏览器语言

javascript - 如何将数据添加到模式 PHP、MySQL Ajax

php - 如何在响应中返回数组

php - Laravel Eloquent 将 2 个表连接在一起

MySQL 统计所有重复的记录为一条记录

testing - 前端测试自动化

visual-studio - Visual Studio 测试中输出文件的位置