如何在php中测试调度程序

时间:2013-07-19 12:08:40

标签: php mysql codeigniter

我有一个codeigniter应用程序,可以在mysql数据库中安排特定日期和时间的事件,有时提前几周,另一部分将发送电子邮件提醒并在这些日期发生时执行其他操作。如何进行基于时间的测试?有没有我可以使用或阅读的测试套件?

4 个答案:

答案 0 :(得分:5)

这是我思索了很长一段时间的事情 - 然后我意识到了我的问题!我专注于时间,好像这是我无法控制和测量的东西。时间就像我们的应用程序中发生的任何其他计算一样。因此,基于时间的测试很容易 - 我们只需要改变我们对它的思考方式 - 以及我们如何构建我们的应用程序。

首先,要做的第一件事是将当前时间生成序列分离为方法。这样,我们可以稍后嘲笑它(也就是说,生成我们自己的方法,总是返回预定的'时间'进行测试)。这可以像......那样简单。

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()(它将使用您知道的那个整数)。最后,查询数据源以验证插入的行是否具有您期望的正确值。

我知道这并不是你要问的问题,但问题也很模糊: - /祝你好运!

答案 1 :(得分:1)

您是否要运行单元测试以验证代码是否正常运行,或者是否需要测试生产环境?

如果要确保计划任务在生产中运行...我创建的任务在每次成功完成执行时都会写入日志。

然后我们通过检查它是否已经运行来测试它(例如:测试“每日”任务是否在36小时内运行)。如果他们没有运行,我们会提醒管理员。

答案 2 :(得分:1)

您使用的是Cron Jobs,PHP live Scripts还是JavaScript?有许多方法可以实现预定的时间应用,每种方式都有自己的测试方法。

显然,无论您使用何种解决方案,而且正如其他人所提到的,您只需调整时间即可。将其更改为1分钟以确认您的脚本正确执行指定的功能。

一旦您确信您的脚本工作正常,您就可以进行更长时间的最终测试。还要确保使用某种日志文件。当尝试发现错误时,这将使轨道上的生活变得更加容易。

根据您使用的解决方案,您也可以模拟测试数据库,其他人也提到过,但这取决于您实现目标的方式。

希望有所帮助

答案 3 :(得分:1)

我们在这里做的是迭代所有列,遍历所有列,如果它是日期/时间列之一,则从中减去所需的时间:

    // $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天内完成测试,现在安排。