JUnit - Использование неверного утверждения

StackOverflow https://stackoverflow.com/questions/1402974

  •  05-07-2019
  •  | 
  •  

Вопрос

Я цитирую этот пост из записи exubero . Я думаю, что эта запись принесет пользу всем, кто проводит модульное тестирование:

Существует множество различных методов, начинающихся с assert, определенных в классе 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 ()?

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Другие советы

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

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

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

Затем копируется и изменяется на

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

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

Если код cut-copy-paste-code был примерно таким:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top