2016-05-20 14 views
5

Mam test komunikacji przez gniazdo TCP, w którym oczekuję, że serwer nie odpowie w określonym przedziale czasu, kiedy wyślę określoną wiadomość.JUnit test na spodziewany limit czasu

Zachowanie serwerów to nic, co mogę kontrolować.

Wiem, że nie można ukończyć testu, jeśli nie ukończyło go w określonym przedziale czasowym. Ale jak mogę postąpić odwrotnie, sprawić, by nie zakończyło się to w ramach czasowych?

Mogę użyć @Test (timeout=1000), aby wykonać test, jeśli nie zakończy się on w ciągu sekundy.

Ale przy użyciu Junit 4, czy istnieje funkcja do sprawdzenia, czy przewidywany czas oczekiwania jest dodatni? To znaczy. Test zakończy się niepowodzeniem, jeśli zostanie zakończony w określonym przedziale czasowym, a jeśli nie zostanie zaliczony?

+0

Czy Timeout wyjątek? Jeśli tak, możesz przetestować wyjątek dotyczący limitu czasu. – Compass

+0

Uważaj na to, nie sądzę, że możesz "oczekiwać" wyjątku wyrzuconego przez 'timeout'. Możesz użyć timera lub po prostu sprawdzić czas operacji, a następnie, jeśli przekroczył on pożądany czas, wyrzuć wyjątek, którego się spodziewasz. Nie wydaje się jednak bardzo efektywny. – Zircon

+2

Co dokładnie jest celem testu? Jeśli wychodzi poza zasięg twojego kodu w dół do serwera, nie jestem pewien, jak korzystne jest testowanie na twoim końcu. Jeśli spodziewasz się, że twój kod poradzi sobie z przekroczeniem limitu czasu, powinieneś po prostu kpić z gniazda i zrzucić wyjątek. – Compass

Odpowiedz

4

Dobre pytanie. W rzeczywistości możesz to zrobić, używając tylko narzędzi junit. Moim zamysłem jest odwrócenie zachowania reguły Timeout + użycie atrybutu expected z adnotacją Test. Jedynym ograniczeniem: trzeba umieścić test w oddzielnej klasie, bo Rule dotyczy wszystkich testów wewnątrz niego:

public class Q37355035 { 

    private static final int MIN_TIMEOUT = 100; 

    @Rule 
    public Timeout timeout = new Timeout(MIN_TIMEOUT) { 
     public Statement apply(Statement base, Description description) { 
      return new FailOnTimeout(base, MIN_TIMEOUT) { 
       @Override 
       public void evaluate() throws Throwable { 
        try { 
         super.evaluate(); 
         throw new TimeoutException(); 
        } catch (Exception e) {} 
       } 
      }; 
     } 
    }; 

    @Test(expected = TimeoutException.class) 
    public void givesTimeout() throws InterruptedException { 
     Thread.sleep(1000); 
    } 
}