2013-07-19 7 views
8

0 Ich habe eine codeigniter App, die Ereignisse für bestimmte Daten und Zeiten in einer MySQL-Datenbank, manchmal Wochen im Voraus, mit einem anderen Teil, das E-Mail-Erinnerungen sendet und andere Aktionen, wenn diese Termine auftreten . Wie würde man sich dem zeitbasierten Testen nähern? Gibt es eine Testsuite, die ich benutzen oder lesen könnte?Wie man ein Scheduling-Programm in PHP

+11

Erstellen Sie eine Klasse, die Zeit zu Ihrem Skript liefert und es verspotten. – zerkms

+0

Wenn nichts anderes hilft, ändern Sie das Systemdatum auf Ihrem Server. Aber @zerkms schlug einen besseren Weg vor. –

+0

Oder Sie könnten den Zeitbereich auf Minuten verringern. Wenn es mit Minuten funktioniert, funktioniert es mit Monaten. Halte es einfach. – machineaddict

Antwort

1

Möchten Sie einen Komponententest ausführen, um zu überprüfen, ob der Code funktioniert, oder eine Produktionsumgebung testen?

Wenn Sie sicherstellen möchten, dass Ihre geplanten Aufgaben in der Produktion ausgeführt werden ... Die von mir erstellte Aufgabe schreibt jedes Mal ein Protokoll, wenn die Ausführung erfolgreich abgeschlossen wurde.

Dann testen wir es, indem wir prüfen, ob es gelaufen ist (zB: Test, ob "tägliche" Aufgaben in den 36 Stunden ausgeführt wurden). Wenn sie nicht ausgeführt wurden, warnen wir einen Administrator.

+0

ich eine organisierte Art und Weise das Datum zu ändern haben will, um zu interagieren und Zeit, die die App sieht, um zeitbasierte Ereignisse und resultierende Aktionen der App zu testen. – user61629

5

Das habe ich lange überlegt - und dann habe ich mein Problem erkannt! Ich konzentrierte mich auf die Zeit, als wäre es etwas, das ich nicht kontrollieren und messen konnte. Die Zeit ist wie jede andere Berechnung in unseren Anwendungen. Zeitbasiertes Testen ist also einfach - wir müssen nur die Art und Weise ändern, wie wir darüber nachdenken - und wie wir unsere Anwendung aufbauen.

Zunächst ist die Nummer eins, die zu tun ist, die aktuelle Zeitgenerierungssequenz zu einer Methode zu trennen. Auf diese Art und Weise können wir dies später ausspionieren (das heißt, erzeugen wir unsere eigene Methode, die immer eine vorbestimmte "Zeit" zum Testen zurückgibt). Dies kann so einfach sein, wie so etwas wie ...

protected function _getCurrentTime() 
{ 
    return time(); 
} 

Was ist der Nutzen: in unserem Code, wir nennen dies die aktuelle Zeit, um Berechnungen zu tun. Beim Testen können wir immer genau die gleiche Zeit generieren.

das ist wichtig - wir können immer genau die gleiche Zeit, jedes Mal generieren.

Nun bin ich mir nicht ganz sicher, wie ich das in Ihrer speziellen Anwendung umsetzen kann, aber lassen Sie mich eine "gefälschte" Anwendung erklären - und sehen Sie, ob Sie sie an Ihre Spezifikationen anpassen können.

Ok, zuerst haben wir diese Methode, die einen Eintrag in unsere Datenbank setzt, der eine "Erinnerung" für 3 Wochen von jetzt an ist.

das ist der alte Code

public function addReminderToDB() 
{ 
    $this->_executeSQL('insert into mytable values (1,2,date_add(now(), interval 3 week))'); 
} 

Also, wie Sie dies testen wir? Es wird offensichtlich jedes Mal anders sein?

Nun, lassen Sie uns es aufteilen. Dies ist unser neuer Code ...

neuen Code

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); 
} 

Nun, wenn es um die Prüfung kommt ... Sie können Ihren Test db einrichten. Provozieren Sie als Nächstes die Methode _getCurrentTime(), um immer eine Ganzzahl zurückzugeben, die Sie kennen. Führen Sie dann das addReminderToDB() aus (es wird die Integer-Zahl verwenden, die Sie kennen). Abschließend fragen Sie die Datenquelle ab, um zu bestätigen, dass die eingefügte Zeile die richtigen Werte aufweist, die Sie erwarten würden.

Ich weiß, das ist nicht genau richtig mit dem, was Sie fragen, aber die Frage ist auch irgendwie vage: -/Viel Glück!

+0

Danke Aaron. Ich dachte, das wäre die vollständigste Antwort - Bill – user61629

1

Verwenden Sie Cron Jobs, PHP Live-Scripts oder JavaScript? Es gibt viele Möglichkeiten, eine geplante Zeitanwendung zu erreichen, und jeder Weg hat seine eigenen Testmethoden.

Offensichtlich unabhängig davon, welche Lösung Sie verwenden, und wie andere erwähnt haben, können Sie einfach die Zeit einstellen. Ändern Sie den Wert in 1 Minute, um zu bestätigen, dass das Skript die angegebenen Funktionen korrekt ausführt.

Sobald Sie sicher sind, dass Ihr Skript funktioniert richtig, als Sie einen letzten Test für eine längere Zeit zu tun. Stellen Sie außerdem sicher, dass Sie eine Art Protokolldatei verwenden. Dies wird das Leben auf der Strecke viel einfacher machen, wenn Sie versuchen, Fehler zu erkennen.

Je welche Lösung Sie verwenden, können Sie auch Mock Test die Datenbank als auch andere jedoch erwähnt haben dies ist davon abhängig, wie Sie Ihr Ziel erzielen.

Hoffnung, die

1

hilft Was wir hier tun, ist, dass wir alle Tabellen iterieren über alle Spalten, und wenn es eine der Datum/Zeit-Spalten ist, subtrahieren erforderliche Zeit davon:

// $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); 
      } 
    } 

Dann teste wie gewohnt weiter - was in 5 Tagen geplant war, ist jetzt geplant.

+0

Interessante Idee - Bill – user61629

Verwandte Themen