Come testare il software che è sensibile al fattore tempo?

9

Per tempo sensibile intendo per esempio uno script che viene eseguito solo una volta al mese o uno script che viene eseguito continuamente ma fornisce un determinato output solo una volta al mese. Ovviamente è possibile eseguire un test unitario per molti casi, ma esistono delle eccezioni (a mio avviso).

Un recente esempio in cui mi sono imbattuto era la creazione di un cron job da eseguire il penultimo giorno di ogni mese. Ciò ha richiesto l'utilizzo di uno script di shell con la scheda cron per ottenere il giorno corretto del mese per cron, qualcosa come:

1 0 [shell command] * * [my script]

Non avevo familiarità con la sceneggiatura e non avevo familiarità con gli script di shell in generale e quindi non avevo modo di testarlo se non aspettare la fine del mese e vedere se lo script fosse eseguito correttamente (in realtà la mia soluzione era trovare un collaboratore che sapeva molto di più su cron e shell scripting che ho fatto).

Quindi sono curioso di sapere se ci sono utili soluzioni per testare gli script sensibili al tempo.

    
posta DanLeaningphp 07.07.2011 - 01:21
fonte

5 risposte

7

Oltre ai test unitari, ci sono altre due strategie per l'impostazione di test automatici per affrontare un problema specifico del sistema operativo:

  • Virtualizzazione : puoi impostare diverse immagini del sistema operativo (ad esempio, utilizzando VMWare ) con le configurazioni esatte richieste, impostare un modo per estrarre automaticamente il binario da testare (solitamente montando una directory speciale nello spazio della VM), quindi eseguire il test.

o

  • Strumentazione : aggiungi manualmente condizioni speciali di if al tuo programma che renderà il comportamento del programma diverso. Sotto Unix, questo sarebbe fatto controllando se una determinata variabile d'ambiente è impostata, come FOOBAR_TEST_TIME_WITH_T=500 . I test automatici useranno quindi solo impostazioni diverse delle variabili di ambiente e variabili di ambiente diverse, per eseguire ciò che ti serve.

Puoi anche collegarti a librerie diverse, se le tue interazioni possono essere espresse a livello di libreria, che puoi pensare come una virtualizzazione (se la "libreria" è il kernel del sistema operativo) o come tecnica di strumentazione. È possibile utilizzare entrambi i termini, anche se il termine virtualizzazione usato oggi indica quasi sempre qualcosa come VMWare. Una libreria specifica per restituire valori predefiniti o rieseguire interazioni specifiche sarebbe un approccio di simulazione o stub .

Ci sono anche strumenti di strumentazione automatici, che possono riscrivere i tuoi binari per ottenere altri effetti desiderati, come il file system pieno.

In generale, il tuo obiettivo è trovare i bug. Per verificare casi strani come il file system che è troppo pieno, è più semplice e comunque efficace strumentare manualmente il tuo programma, andando raramente, se non mai, alla virtualizzazione o alla configurazione manuale della macchina.

    
risposta data 07.07.2011 - 01:52
fonte
10

La più efficace: cambia la data della macchina su cui stai eseguendo il test. Impostalo per un po 'prima quando deve essere eseguito, e verifica quando inizia e funziona correttamente. Tuttavia, ciò non è sempre possibile se sono coinvolte più macchine o se sono necessarie risorse per le quali la tua azienda non ha alcun controllo. Assicurati però di farlo per più mesi e assicurati di cambiare l'anno un paio di volte per testare febbraio.

    
risposta data 07.07.2011 - 01:40
fonte
1

Non so del tuo script, ma cerco di usare una sorta di parametro in cui posso impostare la data. Nel tuo caso, se non viene data alcuna data, predefinita alla fine del mese. Nel codice, prendi il parametro data ed esegui se oggi è due giorni prima. Non solo sarai in grado di testarlo (passare una data da due giorni a partire da ora), ma anche di eseguire il giorno successivo nel caso in cui qualcosa gli impedisca di funzionare in circostanze normali (interruzione di corrente, server inattivo, ecc.).

    
risposta data 07.07.2011 - 03:21
fonte
1

Dato che hai citato crontab, presumo che tu stia correndo in un ambiente nix. In tal caso, penso che varrebbe la pena di dare un'occhiata a libfaketime:
link

Attraverso la magia di LD_PRELOAD, possiamo caricare versioni personalizzate delle funzioni della libreria purché corrispondano all'interfaccia. Quello che fa libfaketime è caricare le versioni delle chiamate di sistema time che ti permettono di personalizzare il loro comportamento tramite variabili d'ambiente. È possibile forzare time () per restituire un valore hardcoded o un offset dall'ora corrente, il tutto senza influenzare nessun altro sulla casella.

    
risposta data 07.07.2011 - 05:17
fonte
0

Non c'è molto bisogno di testare cron, dato che è stato praticamente testato ("test di produzione") per molte generazioni. Naturalmente, se si sta lavorando con uno script di shell, è possibile impostare data / ora in una macchina virtuale.

Il modo migliore per affrontarlo è "prendere in giro l'orologio", usando uno o più trucchi di programmazione per fingere il tempo. Negli script di shell è possibile utilizzare la sintassi $ {: -} per utilizzare una data impostata in una variabile di ambiente e ricorrere all'ora effettiva se non è stata forzata.

In altre lingue utilizziamo librerie fittizie o costruiamo un'astrazione tutto il giorno.

Il finto orologio è buono perché puoi automatizzarlo invece di dover impostare manualmente il test. Questo è un grande vantaggio quando si tratta di modificare lo script / codice in un secondo momento e si può facilmente capire se funziona ancora o meno.

    
risposta data 10.07.2011 - 02:05
fonte

Leggi altre domande sui tag