2013-07-19 11 views
8

Ho un'app codeign che programma gli eventi per date e ore specifiche in un DB mysql, a volte settimane in anticipo, con un'altra parte che invierà promemoria via email ed eseguirà altre azioni quando si verificano tali date . Come si può avvicinarsi al test basato sul tempo? C'è una suite di test che potrei usare o leggere?Come testare un programma di pianificazione in php

+11

Crea una classe che fornisca tempo al tuo script e deragli. – zerkms

+0

Se non è utile, cambiare la data di sistema sul server. Ma @zerkms ha proposto un modo migliore. –

+0

Oppure puoi ridurre l'intervallo di tempo a minuti. Se funziona con i minuti, funziona con mesi. Mantienilo semplice. – machineaddict

risposta

1

Eseguire un test di unità per verificare che il codice funzioni o testare un ambiente di produzione?

Se si desidera assicurarsi che le attività pianificate siano in esecuzione in produzione ... Quello che ho creato scrive un log ogni volta che completa con successo l'esecuzione.

Quindi testiamo controllando se è stato eseguito (ad esempio: test se le attività "giornaliere" sono state eseguite nelle 36 ore). Se non sono stati eseguiti, avvisiamo un amministratore.

+0

Voglio avere un modo organizzato per cambiare la data e il tempo che l'app vede, in modo da testare gli eventi basati sul tempo e le azioni risultanti dall'app. – user61629

5

Questo è qualcosa che ho riflettuto per un po '- e poi ho capito il mio problema! Mi stavo concentrando sul tempo come se fosse qualcosa che non potevo controllare e misurare. Il tempo è come qualsiasi altro calcolo che si verifica nelle nostre applicazioni. Quindi, i test basati sul tempo sono facili: dobbiamo solo cambiare il modo in cui pensiamo a questo proposito e come costruiamo la nostra applicazione.

Prima di tutto, la prima cosa da fare è separare la sequenza di generazione del tempo corrente in un metodo. In questo modo, possiamo prenderlo in giro in seguito (cioè, generare il nostro metodo che restituisce sempre un "tempo" predeterminato per il test). Questo può essere semplice come qualcosa di simile ...

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

Qual è il vantaggio: nel nostro codice, chiameremo questo per ottenere il tempo corrente per fare calcoli. Tuttavia, nei test, possiamo sempre generare lo stesso tempo.

questo è importante - possiamo sempre generare lo stesso tempo, sempre.

Ora, non sono del tutto sicuro di come metterlo in pratica nella tua particolare applicazione, ma lascia che ti spieghi un'applicazione "falsa" - e vedi se riesci ad adattarla alle tue specifiche.

Ok, prima di tutto, abbiamo questo metodo che inserisce una voce nel nostro database che è un "promemoria" per 3 settimane da oggi.

questo è il vecchio codice

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

Quindi, come possiamo verificare questo? Ovviamente sarà diverso ogni volta?

Beh, lasciamolo. Questo è il nostro nuovo codice ...

nuovo codice

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

Ora, quando si tratta di test ... si può impostare il db di prova. Quindi, prendi in giro il metodo _getCurrentTime() per restituire sempre un numero intero che conosci. Quindi, esegui addReminderToDB() (userà il numero intero che conosci). Infine, interrogare l'origine dati per convalidare la riga inserita ha i valori corretti che ci si aspetterebbe.

So che questo non è esattamente perfetto con quello che stai chiedendo, ma la domanda è abbastanza vaga anche: -/Buona fortuna!

+0

Grazie Aaron. Ho pensato che questa fosse la risposta più completa - Bill – user61629

1

Stai utilizzando Cron Jobs, PHP live Scripts o JavaScript? Esistono molti modi per ottenere un'applicazione temporale pianificata e ogni modo ha i propri metodi di test.

Evidentemente, indipendentemente da quale soluzione si sta utilizzando e come altri hanno menzionato si può semplicemente regolare il tempo. Passare a 1 minuto per confermare che lo script stia svolgendo correttamente le funzioni specificate.

Una volta che si è certi che lo script funzioni correttamente, è possibile eseguire un test finale per un periodo più lungo. Assicurati inoltre di utilizzare una sorta di file di registro. Ciò renderà la vita molto più facile in pista quando cercherò di individuare errori.

A seconda della soluzione che si sta utilizzando, è anche possibile simulare il test del database come altri hanno già menzionato, tuttavia questo dipende da come si raggiunge il proprio obiettivo.

Speranza che aiuta

1

Quello che facciamo qui è che iterare su tutti i tavoli, su tutte le colonne, e se è una delle colonne di data/ora, sottrarre tempo richiesto da esso:

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

Quindi continua a eseguire il test come al solito: ciò che era programmato per accadere in 5 giorni, è ora pianificato.

+0

Idea interessante - Bill – user61629