Недавно я, должно было так выйтись, видел, что набор тестов ни с кем утверждает. Те тесты должны были быть тестами точности.
Я думаю единственная вещь, которая может быть протестирована с такими тестами, должен проверить, не повышен ли ни один исключения во время потока выполнения. Но так или иначе я действительно не понимаю, как мы можем проверить точность кода без утверждения тестов - даже методы, которые делают ничто не может пройти такие тесты.
Таким образом, я задаюсь вопросом, какова может быть цель таких тестов и что еще может быть протестировано с этим?
Я бы позволил им иметь право на существование, если они будут тестировать какой-то «устаревший код» - код, которым никто не владеет. Нет, если они там, чтобы устроить шоу «высокого покрытия кода».
Это первый шаг к уверенности в коде. Невидимая проверка: «исключения не выбрасываются». Однако после того, как вы завершили приложение в некоторых подобных дымовых тестах, следующим шагом будет превращение неявной проверки в явную - наденьте свой разумный предел и внесите наблюдаемые изменения, которые вы можете утверждать на основе своих тестов.
Вы можете использовать такие инструменты, как TestLint, чтобы отловить подобные тесты.
Вот пример (C #, NUnit):
[Test]
public void StartUpShutDownDoesntThrow() {
var aService = new Service();
aService.StartUp();
aService.ShutDown();
}
Если этот тест пройден, он гарантирует следующее:
Все три элемента ценны, может быть, даже эпичны. Вы будете удивлены, сколько коммерческих приложений даже не имеют чего-то столь же простого, как это, в рамках их процесса контроля качества.
Итак, да, тесты без утверждений тоже могут иметь свою ценность.
Иногда интересно знать, что часть кода вообще может выполняться.
Я делаю это, например, для кода (Python), который производит графический вывод. Я достаточно счастлив, что графика вообще создается. Когда тест не проходит, я знаю, что что-то сломалось.
Хм, нет!
Тест без Assert явно является запахом дизайна. Это потому, что хороший тест должен точно сообщать в коде, ЧТО он тестирует, и он также должен быть надежным.
Тест вида
[Test]
public void DoSomethingDoesNotThrow()
{
var aService = new Service();
aService.DoSomething();
}
бессмыслен, даже потенциально вреден, потому что он пройдет независимо от того, что делает aService.DoSomething()`. Но самая большая проблема в том, что он ничего не тестирует. (И кстати: как это может проверить "точность"?)
Лучше бы вместо этого протестировать какую-нибудь функциональность aService.DoSomething()
! Если такой тест пройдет, вы будете знать, что исключения не происходит, так зачем тогда вообще нужен такой "тест", как приведенный выше?
В общем: Всегда проверяйте факты, никогда - отсутствие этих фактов.
Только потому, что это часто делается в реальном мире, не делает это хорошей практикой...
Thomas
Это могут быть дымовые тесты, предназначенные для доказательства того, что что-то не генерирует исключение или что-то другое выполняет работу (например, имитирующий объект).
Какова бы ни была причина, я думаю, вам следует переименовать тесты, как если бы люди не знали, почему они существуют или что они тестируют, как их можно исправить, если они действительно ломаются.
IMHO, тесты должны проверять поведение, а не его отсутствие. Если вы хотите проверить исключения, проверьте исключения. Прочтите эту запись в блоге . Возможно, эти тесты - тесты, чтобы заставить течь тестовые соки, но они не должны длиться долго.
Да, как @ Джон и @Olivier отмечают, что иногда полезно просто знать, что какой-то код выполняется без исключения исключений (и, я думаю, само собой разумеется, без ошибок компиляции). Но это редкие случаи, и я ни при каких обстоятельствах не рассматриваю их тесты на «точность».