我需要测试帐户中的功能。但是为此需要注册一个帐户。如果该功能无法正常运行并且测试失败,如何从数据库中自动删除一个帐户(在测试过程中创建的帐户)?
答案 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']);
如果可能,应使用数据库模块创建帐户并再次清理。上面的这种方法非常危险,取决于您所使用的系统。