JUnit - Использование неверного утверждения
-
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);
Несоответствие комментария, утверждения и контрольного примера может быть более заметным.
И да, я видел, как это произошло.