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