我有一个 codeigniter 应用程序,可以在 mysql 数据库中安排特定日期和时间的事件,有时会提前几周,另一部分将在这些日期发生时发送电子邮件提醒并执行其他操作。一种方法是如何进行基于时间的测试?是否有我可以使用或阅读的测试套件?
4 回答
这是我思考了很久的事情——然后我意识到了我的问题!我专注于时间,好像它是我无法控制和衡量的。时间就像我们的应用程序中发生的任何其他计算一样。因此,基于时间的测试很容易——我们只需要改变我们思考它的方式——以及我们构建应用程序的方式。
首先,要做的第一件事是将当前的时间生成序列分离到一个方法中。这样,我们可以稍后模拟它(即生成我们自己的方法,该方法总是返回预定的“时间”进行测试)。这可以像...一样简单
protected function _getCurrentTime()
{
return time();
}
有什么好处:在我们的代码中,我们将调用它来获取当前时间来进行计算。但是,在测试中,我们总是可以生成完全相同的时间。
这很重要——我们每次都可以生成完全相同的时间。
现在,我不完全确定如何在您的特定应用程序中将其付诸实践,但让我解释一下“假”应用程序 - 看看您是否可以根据您的规范调整它。
好的,首先,我们有这个方法可以在我们的数据库中放置一个条目,该条目是从现在起 3 周内的“提醒”。
这是旧代码
public function addReminderToDB()
{
$this->_executeSQL('insert into mytable values (1,2,date_add(now(), interval 3 week))');
}
那么,我们如何测试呢?明明每次都不一样?
好吧,让我们分手吧。这是我们的新代码...
新代码
public function addReminderToDB()
{
$currentDate = date('m-d-Y h:i:s', $this->_getCurrentTime());
$sql = "insert into mytable values (1,2,date_add('{$currentDate}', interval 3 week))";
$this->_executeSQL($sql);
}
现在,当涉及到测试......您可以设置您的测试数据库。接下来,模拟 _getCurrentTime() 方法以始终返回您知道的整数。然后,运行 addReminderToDB() (它将使用您知道的整数)。最后,查询数据源以验证插入的行是否具有您期望的正确值。
我知道这并不完全符合您的要求,但问题也有点模糊:-/ 祝您好运!
我们在这里所做的是遍历所有表、所有列,如果它是日期/时间列之一,则从中减去所需时间:
// $con is PDO connection
// $interval can be eg. "5 DAY"
$tables = $con->query('show tables');
foreach($tables->fetchAll(PDO::FETCH_COLUMN) as $table) {
$columns = $con->query(sprintf("show columns from %s where Type in ('date', 'datetime')", $table));
$fields = array();
foreach($columns->fetchAll(PDO::FETCH_ASSOC) as $field) {
$field = $field['Field'];
$fields[] = sprintf('%s = DATE_SUB(%s, INTERVAL %s)', $field, $field, $interval);
}
if ($fields) {
$q = sprintf('UPDATE %s SET %s', $table, implode(', ', $fields));
$con->query($q);
}
}
然后像往常一样继续测试 - 原定在 5 天内发生的事情,现在已经安排好了。
您是要运行单元测试来验证您的代码是否正常工作,还是要测试生产环境?
如果您想确保您的计划任务在生产中运行......我创建的任务每次成功完成执行时都会写入一个日志。
然后我们通过检查它是否已经运行来测试它(例如:测试“每日”任务是否在 36 小时内运行)。如果它们还没有运行,那么我们会提醒管理员。
您使用的是 Cron Jobs、PHP live Scripts 还是 JavaScript?有很多方法可以实现预定时间的应用,每种方法都有自己的测试方法。
显然,无论您使用什么解决方案以及正如其他人所提到的,您都可以简单地调整时间。将其更改为 1 分钟以确认您的脚本正确执行指定的功能。
一旦您确信您的脚本工作正常,您就可以进行更长时间的最终测试。还要确保您使用的是某种日志文件。当尝试发现错误时,这将使生活变得更加轻松。
根据您使用的解决方案,您还可以像其他人提到的那样模拟测试数据库,但这取决于您如何实现目标。
希望有帮助