2009-01-23 14 views
5

Jestem nowy w testowaniu jednostkowym i nUnit (2.48). Chciałbym napisać metodę testową, w której przypadek awarii jest taki, że zakleszcza się. czy to możliwe? Oczywiście nUnit domyślnie nie wie, jak długo metoda powinna zostać wykonana, więc czy powinienem napisać kod, aby wykonać pracę w oddzielnym wątku, a następnie przerwać go i wyrzucić i zrobić wyjątek, jeśli zajęłoby to więcej czasu niż zdefiniowałem? Czy jest lepszy sposób to zrobić?Testowanie zakleszczenia z nUnit

Dziękuję

Odpowiedz

5

Jest to możliwe, ale może nie być najlepszym rozwiązaniem. Testy jednostkowe nie są tak naprawdę odpowiednie do testowania zachowania współbieżności, niestety nie ma zbyt wielu metod testowych, które są odpowiednie.

NUnit nie robi nic z wątkami. Można napisać testy, które rozpoczynają kilka wątków, a następnie testują ich interakcję. Ale zaczęłyby one wyglądać bardziej jak testy integracyjne niż testy jednostkowe.

Kolejny problem polega na tym, że zakleszczenie zwykle zależy od zaplanowanych wątków kolejności. W związku z tym trudno byłoby napisać rozstrzygający test, aby przetestować pewien problem z zakleszczeniem, ponieważ nie masz żadnej kontroli nad planowaniem wątków. jest wykonywane przez system operacyjny. Możesz skończyć się testami, które czasami kończą się niepowodzeniem na procesorach wielordzeniowych, ale zawsze odnoszą sukces na procesorach z pojedynczym rdzeniem.

7

Dobrze jej z pewnością możliwe do testowania impasu uruchamiając swój kod w innym wątku i widząc jeśli zwróci się w czasie. Oto niektóre z nich (bardzo podstawowy) przykładowy kod:

[TestFixture] 
public class DeadlockTests 
{ 
    [Test] 
    public void TestForDeadlock() 
    { 
     Thread thread = new Thread(ThreadFunction); 
     thread.Start(); 
     if (!thread.Join(5000)) 
     { 
      Assert.Fail("Deadlock detected"); 
     } 
    } 

    private void ThreadFunction() 
    { 
     // do something that causes a deadlock here 
     Thread.Sleep(10000); 
    } 
} 

Nie chciałbym powiedzieć, że jest to „najlepszy sposób”, ale jest to jeden znalazłem przydatny na okazjach.

+0

http://en.wikipedia.org/wiki/Halting_problem – bl4ckb0l7

+0

Co się stanie, jeśli złączenie nastąpi po 5001 ms? – bl4ckb0l7

+0

nie ma to nic wspólnego z problemem zatrzymania. Klauzula "na czas mody" zapewnia to :-). Jednym z problemów z tym testem jest to, że naprawdę nie testuje zakleszczeń, tylko uruchamia jeden testowy wątek. Zakleszczenia zwykle występują w interakcji między wątkami. – Mendelt

5

Wykrywanie zakleszczeń jest równoważne wykryciu halting problem, a zatem obecnie nie można go rozwiązać w ogólnym przypadku.

Jeśli masz konkretny problem, przed którym możesz się obronić, mogą pojawić się określone luki, aby uzyskać przynajmniej odrobinę bezpieczeństwa. Pamiętaj jednak, że może to być tylko hakowanie, a nigdy 100%. Na przykład taki test zawsze może przejść na maszynie programującej, ale nigdy na maszynie produkcyjnej.

3

Aby przetestować zakleszczenie, należy wykonać wykres stanu i sprawdzić cykle na wykresie aktualnego stanu w teście jednostki. Wykres stanu składa się z zasobów źródłowych jako węzłów i zależności jako krawędzi. Nie mam pojęcia o realizacji takiej rzeczy, ale taka jest teoria.

Testy jednostkowe sprawdzają poprawność wejścia i wyjścia danych (głównie dla późniejszego punktu), a nie poprawności przebiegu realizacji aplikacji.

Idea Marka Heatha wydaje się rozsądna, ale jest błędna pod względem akademickim.