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
Antwort
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.
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
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!
Danke Aaron. Ich dachte, das wäre die vollständigste Antwort - Bill – user61629
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
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.
Interessante Idee - Bill – user61629
- 1. PHP: Wie man ein Array in ein StdClass-Objekt verwandelt?
- 2. Wie erstellt man ein PHP-Webmail-Skript?
- 3. Wie liest man ein Bild mit PHP?
- 4. Wie man in PHP ein in Java serialisiertes Objekt deserialisiert
- 5. Wie fügt man ein Array zu mongodb mit PHP ein?
- 6. Wie man Zeilen in PHP
- 7. PHP/MySQL: Wie fügt man ein normales Blob-Bild in eine PHP-Seite ein?
- 8. Wie überprüft man, ob in PHP ein String existiert? So
- 9. Wie kann man in PHP direkt ein Echo ausdrucken?
- 10. Wie man ein cc in einem PHP-Kontaktformular hinzufügt?
- 11. Wie man richtig dekodieren und ein JSON-Array in PHP
- 12. Wie fügt man Daten in XML-Datei mit PHP ein?
- 13. Wie erstellt man ein Word-Dokument Header/Footer in PHP
- 14. Wie konvertiert man diesen PHP-Code in ein normales Aussehen?
- 15. Wie erstellt man ein finales Attribut in einer PHP-Klasse?
- 16. Wie konvertiert man ein PHP DateTime-Objekt in ISO-String?
- 17. Wie verwendet man ein Array als SQL-Abfrage in PHP
- 18. PHP: Wie konvertiert man 0777 (ein Oktal) in eine Zeichenfolge?
- 19. Wie konvertiert man ein Array zu einem String in PHP?
- 20. Wie man ein Freund referrred und belohnt System in PHP?
- 21. Wie man richtig ein strukturiertes Menü in PHP implementieren
- 22. Wie durchläuft man ein Array innerhalb von Array in PHP?
- 23. Wie gibt man ein spezifisches Array in PHP aus?
- 24. Wie fügt man mit PHP und AJAX in SQL ein?
- 25. Wie fügt man einfache Anführungszeichen in PHP ein?
- 26. Wie man ein assoziatives Array in PHP-Funktionsparameter umwandelt
- 27. wie man Freunde in php
- 28. Wie stellst du PHP in HTML5 ein
- 29. Wie ein Array in PHP
- 30. , wie ein Array in PHP
Erstellen Sie eine Klasse, die Zeit zu Ihrem Skript liefert und es verspotten. – zerkms
Wenn nichts anderes hilft, ändern Sie das Systemdatum auf Ihrem Server. Aber @zerkms schlug einen besseren Weg vor. –
Oder Sie könnten den Zeitbereich auf Minuten verringern. Wenn es mit Minuten funktioniert, funktioniert es mit Monaten. Halte es einfach. – machineaddict