2013-04-10 1 views
25

У меня есть некоторые тесты, как это:Как сделать JUnit для печати утверждает и результаты

@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()); 
} 

Что мне нужно во время выполнения тестов, чтобы напечатать каждое сообщение Assert на стандартный вывод, а затем привести в утверждают.

Это требует формат из тестового класса:

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

Но как сделать это? Я совсем недавно работаю с JUnit и понятия не имею. Есть ли способ использования runners и suites? Или существуют какие-либо методы assertSuccess(), assertFailed()? Спасибо за любой намек.

+0

К слову, 'message' параметр применим только, когда утверждение не удается, так что ваш' assertNotNull' сообщение должно быть на самом деле «a1 не существует "и т. д. – Jonathan

+5

любая конкретная причина, по которой вы хотели бы этого? –

+1

Обе ваши потребности можно рассматривать как анти-шаблон в мире тестирования устройств. В ваших тестах следует утверждать только одну вещь, поэтому не должно быть никаких оснований для нежелания утверждать.Ваши тесты должны быть автоматизированы, при этом все проверки выполняются с помощью утверждений, поэтому нет необходимости запрашивать распечатку для ручной проверки. На практике есть веские причины для первого, например, запуск тестов, управляемых таблицами, и необходимость множественных вызовов assert для проверки одного логического факта. Будьте осторожны со вторым. Автоматизация - единственный путь вперед в тестировании единиц измерения и регрессии. – user7610

ответ

18

Во-первых, у вас есть два проблем нет. Когда утверждение терпит неудачу, генерируется исключение AssertionError. Это предотвращает проверку любого утверждения, прошедшего после этого. Чтобы решить эту проблему, вам необходимо использовать ErrorCollector.

Во-вторых, я не верю, что в JUnit есть какой-либо способ сделать это. Тем не менее, вы могли бы реализовать свои собственные методы, которые обертывают утверждения:

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

не должен быть assertNotNull в пределах функции TestCase.assertNotNull? – IHeartAndroid

2

Последняя опция - это пара каждого утверждения с соответствующим System.out.println, хотя, очевидно, это меньше, чем идеальный. Тем не менее, это решит проблему, если все остальное не удастся.

10

Все методы assertXXX имеют форму, которая позволяет отображать строку об ошибке:

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

Там нет особого значения в печати сообщение об успехе.

РЕДАКТИРОВАТЬ

Junit обычно обеспечивает 2 формы с утверждают. Для того, чтобы последовать примеру выше, вы можете проверить нулевое значение в 1 из 2 способов:

assertNotNull(p)

или

assertNotNull("my message on failure", p)

рамки будут печатать сообщения об ошибках без других требуемых усилий вами (это предусмотрено каркасом).

Для проверки исключений вы могли бы использовать следующую схему:

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

Опять же, есть варианты этих методов для добавления сообщения

Проверьте API

+0

Хорошо, поэтому я могу перемещать сообщение перед утверждением, но как поймать, если assert передал или не смог распечатать сообщение о результатах? –

+1

поймать исключение, как показано в моем ответе, но если вы это сделаете, обязательно верните исключение (или поймайте его в сборщике ошибок), иначе вы получите ложные срабатывания –

+0

Я делаю assertTrue («некоторое сообщение», утверждение); и сообщение по-прежнему не печатается. –

Смежные вопросы