MySQL

时间:2017-06-12 12:51:40

标签: php mysql testing codeception

使用Codeception为我们的Custom(使用Symfony组件和Doctrine)框架编写验收测试。我们有一组实用方法,由我们的Phpunit测试单独使用,用于创建要测试的各种实体。这包括诸如用户和其他相关数据之类的内容。

在我们的Codeception测试的情况下,我们想要使用此功能,允许我们播种自定义数据并在之后进行清理。在我们的单元测试的上下文中,这由事务处理。鉴于Codeception通过HTTP通过Phantomjs向我们的应用程序发出请求,它不能使用事务,因为为测试使用的那个创建了单独的数据库连接(看起来这可能使用Dbh但不支持由MySQL,因为不支持嵌套事务)。结果是验收测试可以对数据进行种子处理,但除非数据是持久的,否则外部请求中不存在此数据。

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

我希望还有其他选择,或者我们可以尝试的其他选择。 感谢。

1 个答案:

答案 0 :(得分:1)

总有其他选择:)。

在我的情况下,使用转储是不可能的,因为我们还有一个非常大的数据库(当剥离到必需品时为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;