2015-09-16 30 views
5

Napisałem własną funkcję spania i chcę ją przetestować. Oto mój kod:Jak przetestować funkcję spania w golang

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

To nie działa. Próbuję uzyskać czas rozpoczęcia i czas zakończenia, a następnie porównać go z oczekiwanym czasem. Oczekiwany czas będzie w sekundach. Próbowałem end.Sub(start), ale to zwraca mi coś w rodzaju 1m30.0909, w zamian potrzebuję 90 jako wynik. Byłoby wspaniale, gdyby ktoś mógł mi pomóc. Dzięki :)

+4

trzeba mieć trochę czasu, aby przeczytać reference.there api jest typu 'Duration'. –

+0

Możesz zadzwonić z duracjami lub po prostu odjąć wartości int. time.Now() - time.Now() nie zwraca czasu. Długość trwania. – jabgibson

+0

Byłoby interesujące wiedzieć, czy funkcja snu przejdzie test? – LenW

Odpowiedz

1

Jeśli używasz time.Unix(), który daje liczbę sekund od epoki (1 stycznia 1970 UTC.), Wtedy twój test powinien zadziałać.

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

Obecnie twój kod odejmuje czas.Now(), który nie zwraca wyniku, który zamierzasz. Twój test wymaga prostych wartości int reprezentujących sekundy.

10

upływający czas:

Najłatwiej dostać się czas, jaki upłynął od określonego czasu (start) jest skorzystanie z funkcji time.Since() która zwraca time.Duration który ma Duration.Seconds() metodę, która zwraca czas w sekundach, jak float64 .

Więc w twoim przypadku Upływający sekund:

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

Teraz do testowania ...

Podczas testowania funkcji Sleep-jak należy wziąć pod uwagę, że po snu nie jest gwarantuje, że kod będzie nadal działać natychmiast. Na przykład podając od DOC time.Sleep():

uśpienia wstrzymanie bieżącego goroutine dla przynajmniej trwania d.

Więc pisząc kod testowy dla funkcji snu podobny, chciałbym przetestować tak:

  • upływający czas powinien wynosić co najmniej określony,
  • i umożliwić pewien margines błędu.

Tak na przykład przetestować go tak:

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

To jest najlepsza odpowiedź. Nie wiedziałem o funkcji Since. – jabgibson