8

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

4

4 回答 4

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

我知道这并不完全符合您的要求,但问题也有点模糊:-/ 祝您好运!

于 2013-07-25T01:23:55.547 回答
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 天内发生的事情,现在已经安排好了。

于 2013-07-26T17:06:06.800 回答
1

您是要运行单元测试来验证您的代码是否正常工作,还是要测试生产环境?

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

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

于 2013-07-19T14:20:55.357 回答
1

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

显然,无论您使用什么解决方案以及正如其他人所提到的,您都可以简单地调整时间。将其更改为 1 分钟以确认您的脚本正确执行指定的功能。

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

根据您使用的解决方案,您还可以像其他人提到的那样模拟测试数据库,但这取决于您如何实现目标。

希望有帮助

于 2013-07-25T03:05:04.110 回答