2015-09-16 35 views
5

Ho scritto la mia funzione sleep e voglio testarla. Segue il mio codice:Come testare una funzione sleep in golang

func TestSleep(t *testing.T) { 
    start := time.Now() 
    mySleepFunction(65) 
    end := time.Now() 
    if (end - start) != 65 { 
     t.Error("Incorrect sleep function") 
    } 
} 

Questo non funziona. Sto cercando di ottenere l'ora di inizio e l'ora di fine e quindi confrontarla con il tempo previsto. Il tempo previsto sarà in secondi. Ho provato end.Sub(start) ma questo mi restituisce qualcosa come 1m30.0909, invece ho bisogno di 90 di conseguenza. Sarebbe bello se qualcuno potesse aiutarmi. Grazie :)

+4

è necessario avere un po di tempo per leggere il reference.there api è un tipo 'durata'. –

+0

È possibile fare confusione con le durate o semplicemente sottrarre i valori int. time.Now() - time.Now() non restituisce un orario.La seconda durata. – jabgibson

+0

Sarebbe interessante sapere se la funzione di sonno supera il test? – LenW

risposta

1

Se si utilizza time.Unix() che fornisce la quantità di secondi dall'epoca (1 ° gennaio 1970 UTC), il test dovrebbe funzionare.

Attualmente, il codice sta sottraendo un tempo. Ora() che non restituisce il risultato desiderato. Il tuo test vuole valori int semplici che rappresentano secondi.

10

Tempo impiegato:

Il modo più semplice per ottenere il tempo trascorso dal momento che un tempo specifico (start) è quello di utilizzare la funzione di time.Since() che restituisce una time.Duration, che ha un metodo Duration.Seconds() che restituisce la durata in secondi come float64 .

Quindi nel tuo caso i secondi trascorsi:

sec := time.Since(start).Seconds() 

Ora a test ...

Durante il test funzioni simile al sonno si dovrebbe prendere in considerazione che dopo il sonno non è garantito che il codice continuerà ad essere eseguito immediatamente. Ad esempio citando la doc di time.Sleep():

sonno sospende il goroutine corrente almeno la durata d.

Così, quando la scrittura di codice di prova per le funzioni simile al sonno, ho iniziato ad esaminare come questo:

  • tempo trascorso dovrebbe essere almeno il specificato,
  • e consentire un certo margine di errore.

Così, per esempio verificare in questo modo:

func TestSleep(t *testing.T) { 
    const secSleep = 65.0 

    start := time.Now() 
    mySleepFunction(int(secSleep)) 
    sec := time.Since(start).Seconds() 

    if sec < secSleep || sec > secSleep*1.05 { 
     t.Error("Incorrect sleep function") 
    } 
} 
+0

Questa è la migliore risposta. Non conoscevo la funzione Since. – jabgibson