如果测试失败,如何在代码接收中使回滚数据库?

时间:2019-02-07 21:09:59

标签: codeception

我需要测试帐户中的功能。但是为此需要注册一个帐户。如果该功能无法正常运行并且测试失败,如何从数据库中自动删除一个帐户(在测试过程中创建的帐户)?

2 个答案:

答案 0 :(得分:1)

我认为您有几种选择。

您可以在Cest类的_before或_after方法中进行清理(例如,如果使用框架,则可以使用ORM删除所有帐户)。

Codeception的Db模块(请参阅https://codeception.com/docs/modules/Db)还具有一个清除标志,当该标志为true时,它将在每次测试之前加载用户定义的数据库转储(您可以创建没有帐户的转储)。

可能还有其他选择。例如,如果您使用Yii2,则用于Codeception的Yii2模块具有清除标志,如果为true,该标志将在测试中包装测试(请参见https://codeception.com/for/yii)。

答案 1 :(得分:0)

我们也面临着这样的问题。如果您使用codception的DB模块插入帐户,则可以使用cleanup标志,它将在每次运行后自动清除数据库。

如果您是通过测试创建帐户的,并且想要在开始测试之前确定该帐户不存在,则可以通过删除功能扩展数据库模块(必须谨慎使用,我们仅允许在测试环境中)。

<?php

namespace Helper\Shared;

class DbHelper extends \Codeception\Module {

    public function deleteFromDatabase($table, $criteria)
    {
        $dbh = $this->getModule('Db')->_getDbh();
        $query = "delete from `%s` where %s";
        $params = [];
        foreach ($criteria as $x => $y) {
            $params[] = "`$x` = '$y'";
        }
        $params = implode(' AND ', $params);
        $query = sprintf($query, $table, $params);
        codecept_debug($query);
        $this->debugSection('Query', $query, json_encode($criteria));
        $sth = $dbh->prepare($query);
        return $sth->execute(array_values($criteria));
    }
}

这可以与...一起用于测试代码中

$I->deleteFromDatabase('account', ['id' => '123456']);

如果可能,应使用数据库模块创建帐户并再次清理。上面的这种方法非常危险,取决于您所使用的系统。