Недогруженные утверждения Java

66
задан Dónal 20 February 2019 в 16:07
поделиться

8 ответов

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

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

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

Ваша точка о них прибывающий "поздно" в Java является также причиной, почему они более широко не замечены.

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

61
ответ дан Gili 24 November 2019 в 14:52
поделиться

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

, Если тот метод является закрытым методом в одном из Ваших классов, утверждение прекрасно, потому что Вы просто пытаетесь удостовериться, что Вы случайно не передаете его нулевой аргумент. Вы тестируете с утверждениями на, и когда Вы протестировали все пути через и не инициировали утверждение, можно выключить их так, чтобы Вы не тратили впустую ресурсы на них. Они также полезны так же, как комментарии. assert в начале метода хорошая документация специалистам по обслуживанию, что они должны следовать за определенными предварительными условиями, и assert в конце с постусловием документы, что должен делать метод. Они могут быть столь же полезными как комментарии; moreso, потому что с утверждениями на, они на самом деле ТЕСТИРУЮТ то, что они документируют.

Утверждения для тестирования/отладки, не проверки ошибок, которая является, почему они прочь по умолчанию: отговаривать людей использовать утверждения для проверки ввода данных пользователем.

56
ответ дан Adam Jaskiewicz 24 November 2019 в 14:52
поделиться

От Программирование с Утверждениями

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

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

18
ответ дан Bill the Lizard 24 November 2019 в 14:52
поделиться

В "Эффективном Java", предложенный Joshua Bloch (в "Параметрах проверки для законности" тема), что (вид подобных простое правило принять), для открытых методов, мы проверим аргументы и выдадим необходимое исключение, если найдено недопустимое, и для непубличных методов (которые не представлены и Вы как, пользователь их должен гарантировать их законность), мы можем использовать утверждение вместо этого.

yc

18
ответ дан yclian 24 November 2019 в 14:52
поделиться

@Don, Вы расстроены, что утверждение выключено по умолчанию. Я был также и таким образом записал этот небольшой javac плагин, который встраивает их (т.е. испускает байт-код для if (!expr) throw Ex, а не это глупое утверждает байт-код.

, Если Вы включаете fa.jar в свой путь к классу при компиляции кода Java, он сделает свое волшебство и затем скажет

Note: %n assertions inlined.

@see http://smallwiki.unibe.ch/adriankuhn/javacompiler/forceassertions и альтернативно на github https://github.com/akuhn/javac

9
ответ дан Gimby 24 November 2019 в 14:52
поделиться

Утверждения очень ограничены: можно только протестировать булевы условия, и необходимо записать код для полезного сообщения об ошибке каждый раз. Сравните это с assertEquals JUNIT (), который позволяет генерировать полезное сообщение об ошибке от исходных данных и даже показывать два исходных данные рядом в IDE в бегуне JUnit.

кроме того, Вы не можете искать утверждения ни в каком IDE, который я видел до сих пор, но каждый IDE может искать вызовы метода.

1
ответ дан Aaron Digulla 24 November 2019 в 14:52
поделиться

На самом деле они прибыли в Java 1.4

, я думаю, что основная проблема состоит в том, что, когда Вы кодируете в среде, где Вы не управляете непосредственно jvm опциями собой как в затмении или серверах J2EE (в обоих случаях возможно изменить jvm опции, но необходимо глубоко искать для нахождения, где это может быть сделано), это легче (я подразумеваю, что требуется меньше усилия) использовать если и исключения (или хуже для не использования чего-либо).

0
ответ дан Denis R. 24 November 2019 в 14:52
поделиться

Я не уверен, зачем вам писать asserts, а затем заменить их стандартным условным оператором if then, почему бы просто не записать условия, как если бы в первую очередь?

Утверждения предназначены только для тестирования и имеют два побочных эффекта:

2
ответ дан 24 November 2019 в 14:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: