2013-04-10 9 views
25

mam kilka testów tak:Jak zrobić JUnit wydrukować twierdzi i wyniki

@Test 
public void test01() 
{ 
    Position p = getPositionAt('a', 1); 
    assertNotNull("a1 exists", p); 
    assertNotNull("figure exists a1", p.getFigure()); 

    p = getPositionAt('a', 2); 
    assertNotNull("exists a2", p); 
    assertNull("figure exists a2", p.getFigure()); 

    p = getPositionAt('b', 1); 
    assertNotNull("exists b1", p); 
    assertNull("figure exists b1", p.getFigure()); 
} 

Co potrzebne podczas uruchamiania testów jest wydrukować każdą wiadomość wymuszenia na standardowe wyjście, a następnie doprowadzić do tego dochodzić.

To wymaga format z klasy Test:

a1 exists -success 
figure exists a1 -success 
exists a2 -success 
figure exists a2 -succcess 
exists b1 -succcess 
figure exists b1 -failed 

ale jak to zrobić? Jestem całkiem nowy pracując z JUnit i nie mam pojęcia. Czy istnieje sposób używania runners i suites? Lub istnieją jakieś metody assertSuccess(), assertFailed()? Dzięki za podpowiedź.

+0

Nawiasem mówiąc, 'message' parametr ma zastosowanie tylko wtedy, gdy nie powiedzie się twierdzenie, więc' wiadomość assertNotNull' powinny być rzeczywiście „a1 nie istnieje "etc ... – Jonathan

+5

jakiś szczególny powód, dla którego chcesz tego? –

+1

Obie twoje potrzeby mogą być uznane za anty-wzór w świecie testów jednostkowych. Twoje testy powinny potwierdzać tylko jedną rzecz, więc nie powinno być żadnego powodu, dla którego chciałbyś uzyskać niezawinione twierdzenie.Twoje testy powinny być zautomatyzowane, a wszystkie sprawdzenia są wykonywane przez dowody, więc nie powinno być potrzeby drukowania wydruku ręcznego. W praktyce istnieją powody, dla których warto mieć pierwsze, takie jak uruchamianie testów sterowanych tabelą i potrzeba wielokrotnych wywołań wywołania w celu sprawdzenia jednego faktu logicznego. Bądź jednak ostrożny wobec drugiego. Automatyzacja jest jedyną drogą w testach jednostkowych i regresyjnych. – user7610

Odpowiedz

18

pierwsze, masz dwie nie dotyczy jednego. Gdy asercja się nie powiedzie, zgłoszony zostanie wyjątek AssertionError. Zapobiega to sprawdzaniu tego potwierdzenia za tym punktem. Aby rozwiązać ten problem, musisz użyć ErrorCollector.

Po drugie, nie wierzę, że jest jakikolwiek sposób wbudowany w JUnit, aby to zrobić. Jednakże, można realizować swoje własne metody, które zawinąć twierdzenia:

public static void assertNotNull(String description, Object object){ 
    try{ 
      assertNotNull(description, object); 
      System.out.println(description + " - passed"); 
    }catch(AssertionError e){ 
      System.out.println(description + " - failed"); 

     throw e; 
    } 
} 
+2

nie powinien być argumentem assertNotNull w ramach funkcji beCaseCase.assertNotNull? – IHeartAndroid

2

Ostatnią opcją jest powiązanie każdego stwierdzenia z odpowiadającym mu System.out.println, chociaż oczywiście jest to mniej niż idealne. Mimo to rozwiąże problem, jeśli wszystko inne zawiedzie.

10

Wszystkie metody assertXXX mieć formę, która pozwala na wyświetlanie ciąg w przypadku błędu:

assertNotNull("exists a2", p); // prints "exists a2" if p is null

Nie ma szczególną wartość w drukowaniu wiadomość na sukces.

EDIT

Junit zwykle zawiera 2 formy w dochodzić. Do naśladowania przykładu powyżej, można przetestować na wartość null w 1 na 2 sposoby:

assertNotNull(p)

lub

assertNotNull("my message on failure", p)

Ramy drukuje komunikaty o błędach z żadnym innym wysiłku potrzebnego przez ciebie (jest dostarczany przez framework).

Aby przetestować wyjątków należy użyć następującego wzoru:

try{ 
    someCall(); 
catch(Exception e){ 
    fail(): // exception shouldn't happen, use assertTrue(true) if it should 
} 

Ponownie, istnieją wersje tych metod dodawania wiadomość

Sprawdź API

+0

Ok, więc mogę przenieść wiadomość przed asersem, ale jak złapać, jeśli przekazanie zakończyło się lub nie udało się wydrukować wyniku? –

+1

wychwycić wyjątek, jak pokazano w mojej odpowiedzi, ale jeśli to zrobisz, upewnij się, że ponownie wyrzucić wyjątek (lub pułapkę go w kolektorze błędów) w przeciwnym razie otrzymasz fałszywe alarmy –

+0

Wykonuję asertTrue ("some message", asercja); a wiadomość nadal nie jest drukowana. –