2009-09-10 6 views
1

Я цитирую этот пост от exubero's. Я думаю, что эта запись принесет пользу всем, кто делает единичный тест:JUnit - Использование неправильной заявки

Существует множество различных методов, начинающихся с утверждения, определенного в классе Assert Junit. Каждый из этих методов имеет несколько разные аргументы и семантику о том, что они утверждают.

Ниже приведены некоторые нерегулярные использования assertTrue:

assertTrue("Objects must be the same", expected == actual); 
assertTrue("Objects must be equal", expected.equals(actual)); 
assertTrue("Object must be null", actual == null); 
assertTrue("Object must not be null", actual != null); 

Некоторые эксперты модульного тестирования указывали на то, что приведенный выше код может быть лучше записать в виде:

assertSame("Objects must be the same", expected, actual); 
assertEquals("Objects must be equal", expected, actual); 
assertNull("Object must be null", actual); 
assertNotNull("Object must not be null", actual); 

Одним из преимуществ использования Соответствующий 'assertXXX()' увеличивает читаемость модульного теста. Может ли кто-нибудь указать, какую еще выгоду использовать соответствующий «assertXXX()»?

+0

Это не блог. Пожалуйста, не размещайте rants здесь, а затем придерживайтесь незначительного вопроса в конце. – JoshJordan

+0

Отмечено на этом. справедливо. Я редактировал формулировки в сообщении. Я никогда не рассматривал этот вопрос как «напыщенный». Мое наблюдение представляет собой интересную дискуссию, которая может помочь каждому лучше написать единичный тест. Поэтому я просто хотел бы посмотреть, что другие думают об этом. – zfranciscus

+0

Это не дебаты, не так ли? Вы должны использовать 'assertTrue' только для конкретного случая тестирования логического метода. В чем проблема? Вы встречали кого-то, кого смутило assertTrue? –

ответ

8

Я не разработчик Java, и я не знаю, что JUnit выводит, когда утверждение терпит неудачу. Множество модулей тестирования модулей, которые я использовал, выводят более эффективную информацию об ошибках при использовании чего-то типа assertEquals.

Позволь мне показать вам пример того, что я говорю:

assertTrue("Objects must be equal", "One" == "Two"); 
assertEquals("Objects must be equal", "One", "Two"); 

В первом случае вы можете иметь выход ошибки, как это:

Ошибка: Ожидаемый истинный фактический был ложным.

Выход для второго случая:

Ошибка: Exected "Один" фактический был "Two".

Как вы можете видеть, второй случай дает лучшую более содержательную информацию.

+0

Эй, спасибо за то, что вы указали это. Вы совершенно правы. Использование assertEquals() даст лучший результат при сравнении ошибок с assertTrue(). – zfranciscus

0

В дополнение к тому, что приведенный выше @Vadim, использование правильного утверждения может защищать от ошибок, созданных путем вырезания-вставки тестов.

В качестве примера

assertTrue("Objects must not be the same", expected != actual); 

копируется и модифицирован для

assertTrue("Objects must not be the same", newobject == actual); 

Когда изменения кода и этот тест не пройден, и комментарий дурачит следующий разработчик «исправить» кода в способ, который вводит новую ошибку.

Если вырезать-копировать-вставить код было что-то вроде этого:

assertFalse("Objects must be the same", newobject == actual); 

ДИС-конгруэнтность комментария, утверждение и тест может быть более заметным.

И да, я видел, как это произошло.

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