Come testate un software sensibile al tempo?


9

Per tempo sensibile intendo ad esempio uno script che viene eseguito solo una volta al mese o uno script che viene eseguito in modo continuo ma fornisce un determinato output solo una volta al mese. Ovviamente puoi testare l'unità per molti casi, ma ci sono eccezioni (a mio avviso).

Un esempio recente in cui mi sono imbattuto è stato l'impostazione di un processo cron da eseguire dal secondo all'ultimo giorno di ogni mese. Ciò richiedeva l'uso di uno script shell con la scheda cron per ottenere il giorno corretto del mese per cron, qualcosa del tipo:

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

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

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


3
È possibile eseguirlo su una macchina virtuale e impostare l'ora di sistema su una comoda come solo la mezzanotte prima del giorno in cui dovrebbe essere eseguito lo script o qualcosa del genere.
Vitor Py,

2
crontab esegue regolarmente script di shell, potresti semplicemente eseguire lo script manualmente (in una sandbox o vm se hai paura di cosa farà) senza aspettare crontab
crasic

2
La mia risposta è forse eccessiva per il tuo caso specifico: basta eseguire lo script. Ma la domanda più ampia avrebbe bisogno di soluzioni come virtualizzazione e strumentazione.
Macneil,

Risposte:


7

Oltre al test unitario, esistono altre due strategie per impostare test automatici per affrontare un problema specifico del sistema operativo:

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

O:

  • Strumentazione : aggiungere manualmente ifcondizioni speciali al programma per far sì che il programma si comporti in modo diverso. Sotto Unix, questo sarebbe fatto controllando se è impostata una certa variabile d'ambiente, come FOOBAR_TEST_TIME_WITH_T=500. I test automatizzati useranno quindi solo impostazioni diverse delle variabili di ambiente e diverse variabili di ambiente per eseguire ciò di cui hai bisogno.

Puoi anche collegarti a diverse librerie, se le tue interazioni possono essere espresse a livello di libreria, che puoi considerare come una virtualizzazione (se la "libreria" è il kernel del sistema operativo) o come una tecnica di strumentazione. Entrambi i termini possono essere usati, sebbene il termine virtualizzazione usato oggi significhi quasi sempre qualcosa come VMWare. Una libreria specifica per la restituzione di valori predefiniti o la riesecuzione di interazioni specifiche sarebbe un approccio fittizio 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.

Nel complesso, il tuo obiettivo è trovare bug. Per verificare la presenza di casi strani come il file system in eccesso, è più semplice e comunque efficace solo strumentare manualmente il programma, passando alla virtualizzazione o al percorso di configurazione della macchina manuale raramente, se non mai.


penso che la tua "virtualizzazione della biblioteca" sia meglio conosciuta come derisione, o meglio, usando una libreria finta.
Javier,

10

Il più efficace: modifica la data della macchina su cui stai testando. Impostalo per un po 'prima quando deve essere eseguito e verifica quando inizia e che funziona correttamente. Ciò non è sempre possibile, tuttavia, se sono coinvolte più macchine o se sono necessarie risorse su cui la tua azienda non ha alcun controllo. Assicurati di farlo per più mesi e assicurati di cambiare l'anno un paio di volte per testare febbraio.


1
se il software è stato installato con una licenza (n di valutazione) per un periodo di tempo limitato, armeggiare con l'orologio può causare il blocco della loro esecuzione.
Marjan Venema,

In alcune aziende, tutte le workstation collegate alla rete non devono discostarsi dal tempo del "server" di 5 minuti, altrimenti la workstation si bloccherà. Mi è successo :-)
Onesimus Nessun impegno (

1

Non conosco il tuo script, ma provo ad usare una sorta di parametro in cui posso impostare la data. Nel tuo caso, se non viene fornita alcuna data, per impostazione predefinita alla fine del mese. Nel tuo codice, prendi il parametro date ed eseguilo se oggi è due giorni prima. Non solo sarai in grado di testarlo (passare tra una data tra due giorni da adesso), ma anche eseguire il giorno successivo nel caso in cui qualcosa gli impedisse di funzionare in circostanze normali (mancanza di corrente, server spento, ecc.).


1

Da quando hai citato crontab, suppongo che tu stia funzionando in un ambiente nix. In tal caso, penso che varrebbe la pena provare libfaketime:
http://www.code-wizards.com/projects/libfaketime/

Attraverso la magia di LD_PRELOAD, possiamo caricare versioni personalizzate delle funzioni di libreria purché corrispondano all'interfaccia. Ciò che fa libfaketime è caricare versioni delle chiamate del sistema orario che ti consentono di personalizzare il loro comportamento tramite variabili di ambiente. È possibile forzare time () per restituire un valore hardcoded o un offset rispetto all'ora corrente, il tutto senza influire su nessun altro sulla casella.


0

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

Il modo preferito per affrontare questo è "deridere il tempo", usando un trucco di programmazione o un altro per fingere il tempo. Negli script di shell è possibile utilizzare la sintassi $ {: -} per utilizzare una data impostata in una variabile di ambiente e tornare all'ora effettiva se non è stata forzata.

In altre lingue usiamo finte librerie o costruiamo un'astrazione tutto il giorno.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.