я так понял, можно замутить это дело для тестов и дебага, и исключения не мутить, я просто исключения воткнул в те места, где явно скрипт не поедет при ошибке, то есть die()
Koenig, Короче, утверждения для того, чтобы просто удостовериться, что условие верно.
Исключения следует выбрасывать в исключительной ситуации, при которой продолжение выполнения невозможно. Например, файл не существует, невалидный аргумент, и всё в таком духе.
reaper, относительно assert'ов, это сложный вопрос. Они пришли из компилируемых языков, таких как С, где они удалялись из программы после компиляции.
В некоторых моих проектах я использовал концепцию защищенного программирования. Согласно ей, надо проверять все входные и выходные данные метода. То есть надо проверять все аргументы методов и функций внутри функции. Я делал это и выбрасывал исключения InvalidArgumantException. В этих же проектах я все тщательно тестировал и иногда сталкивался с ситуацией, когда тест не срабатывал из за выброса этих InvalidArgumentException. Благодаря им, я мог быстро локализовать ошибку (неверные входные данные), что нельзя было сделать с помощью тестов. С другой стороны использовать проверку аргументов и выбрасывать InvalidArgumentException довольно накладное решение на продакшене, гораздо эффективнее было бы использовать assert'ы для этих целей, которые так же помогут быстро локализовать ошибку (в том числе в тестах), а на продакшене их можно легко отключить, дабы не перегружать проект.
Другими словами тесты это хорошо, но с их помощью не всегда легко локализовать ошибку. Не стоит бояться того, что код у вас будет "не красивым", assert'ы прекрасно комментируют код:
function log($type, $message){
assert('array_search($type, ["notice", "warning", "error"]) !== false)');
assert('is_string($message) && !empty($message)');
...
}
В примере сразу становится видно, что:
* $type должен быть строкой notice, warning или error
* $message не должна быть пустой
И не нужны никакие коментарии
# reaper (14.05.2015 / 21:37)
Koenig, Короче, утверждения для того, чтобы просто удостовериться, что условие верно.
Исключения следует выбрасывать в исключительной ситуации, при которой продолжение выполнения невозможно. Наприме
На самом деле не совсем так. Правильнее будет:
* Утверждения надо использовать, чтобы быть увереным, что то что не должно быть в программе в ней не будет. Утверждения позволят найти такие невозможности и быстро их исправить
* Исключения используются там, где есть проблема, но она не критичная и с ней можно жить (на пример не получилось найти какой то файл, и система записала об этом в лог и продолжила работать без этого файла или создала этот файл с нуля)
Другими словами есть:
* основной процесс работы программы - в ней нет ошибок и все входные данные правильные или их можно привести к правильному виду
* альтернативный процесс работы программы - в этом случае выбрасывается исключение, которое потом обрабатывается другой частью программы
* критическая ошибка - программа выполнена быть не может. Это действие нельзя обработать, его нужно просто отловить, узнать из за чего оно происходит (исключения тут не помогут)
# Delphinum (14.05.2015 / 21:31)
reaper, вообще assert имеет прямое отношение к отлову багов.
Да, пожалуй здесь вынужден согласиться. Был не прав.
А вот тут, не думаю
К тестам она имеет опосредственное отношение (однокоренное слово для assertEquals и так далее).
В php я, как и абсолютное большинство, использую PHPUnit, и могу только догадываться, что там происходит за кадром.
А вот в питоне есть такая замечательная библиотека, под названием pytest. Так вот там практически никаких средств для утверждений нет (assertEquals, assertIn, assertMatches и всё в таком духе). Разве что для проверки исключений (assertRaises).
Короче, там предлагается использовать стандартный assert. Я конечно тот ещё мудак и плаваю во всём этом, поэтому однозначно утверждать не могу. Могу сказать только одно, что утверждения в тестах -- обычное дело. Ну и в конце концов, как ещё писать тесты без фреймворка например, если не использовать утверждения?
reaper, конечно в тестах используются утверждения, без них никак, в любом фреймворке и языке. Я говорю о том, что функция assert в PHP используется для отлова неверных ожиданий в коде, а assertEquals и т.д. используются для проверки ожиданий в тестах.
Delphinum, Пожалуй надо бы мне подтянуть себя в этом плане. Может книжку какую посоветуешь?
# Delphinum (14.05.2015 / 21:46)
reaper, конечно в тестах используются утверждения, без них никак, в любом фреймворке и языке. Я говорю о том, что функция assert в PHP используется для отлова неверных ожиданий в коде, а assertEquals
Ну это очевидно. Тащить зависимости из тестировочных фреймворков в реальный код -- идиотская затея.
reaper,
Совершенный код - что касается вопроса - где, как и зачем это использовать?
Экстримальное программирование - что касается вопроса - как тестировать ПО?
Тестирование ОО ПО - что касается тестирования ООП