И я прыгать прямо в упрямый воды ...
Я начинаю писать тесты от нижнего слоя и вверх, позволяя верхним слоям называть реальную вещь (пока она хорошо содержится в моем коде и/или легко предсказать правильное поведение нижнего слоя). Хотя это больше похоже на интеграционный тест, он работает для меня.
Для меня важная часть «модульного тестирования» заключается не в том, чтобы иметь правильные модульные тесты для этих определений, а для того, чтобы иметь автоматическое тестирование, которое может выполняться достаточно быстро (как правило, я держу их под 3s на C++, включая компиляцию, на Android + Java У меня огромные проблемы с производительностью, так как целая инструментальная цепочка IDE + безумно медленная, часто приводящая к таким временам, как 5+ секунд, для более крупных проектов, даже попадающих на 20-30 с построением градиента, и я пытаюсь запустить только действительно базовую единицу тесты, далекие от того, что я делаю на C++, где мои тесты ближе к набору QA).
И если они не срабатывают, должно быть легко определить причину отказа. Поскольку я часто вызываю все слои глубоко внутри, отказ в некотором базовом классе часто приводит к многочисленным сбоям, но у меня редко возникает проблема, чтобы определить причину в быстром взгляде, так что это меня не беспокоит.
Когда файлы/базы данных участвуют, все происходит обычно медленнее, поэтому я предпочитаю различать, что такое «единичный тест» и что входит в комплект интеграции/QA. Тем не менее, БД в памяти может делать все хорошо для основных вещей.
Я предпочитаю эти тесты ублюдка, потому что, когда я издеваюсь над слоями под/над тестируемым кодом, это заставляет меня волноваться, что я «испекаю» ожидаемый результат в этом тесте слишком много, без ошибок, когда ошибаюсь. Плюс насмешка что-то часто является дополнительной работой, поэтому, когда время выполнения тестов является низкой ценой, я с радостью обращаюсь к «интеграции», как тесты.
В Android/Java от того, что я видел б/у:
- Мне нравится Mockito много, это как-то подходит, как я думаю о насмешливых красиво.
- Robolectric (Android специфический) тяжелый вес, поэтому я использую его редко, но иногда он чувствует себя лучше, чем насмешка почти во всем.
- Кинжал и другие инъекционные инъекции зависимостей: я не могу им понравиться, обычно они сталкиваются с тем, как я пишу модульные тесты, и я не вижу никакой пользы от их использования, я предпочитаю писать инъекции зависимостей в чистом виде Java, это почти такое же количество строк в источнике, и источник - это то, что я ожидаю, когда читаю его через несколько лет.
- Библиотеки автобусов/событий: это так же сильно меня раздражает, я еще не понял, как тщательно и легко тестировать код, управляемый событиями, мои тесты всегда чувствуют себя слишком много поставленных и полных предположений, плюс это иногда сложно издеваться.
BTW, если возможно, всегда проводит единичный тест при разработке (близко к подходу TDD). Последующие модульные тесты, как правило, гораздо более болезненны, API довольно часто устанавливается (уже используется другими частями/проектами), и когда вы понимаете, что это трудно проверить легко, уже слишком поздно или большой рефакторинг следующий (без тесты, охватывающие исходную версию, поэтому склонность к ошибкам).
Для приложения Java CRUD для Java это звучит так, как будто большинство API могут быть протестированы через все слои без значительного снижения производительности (возможно, DB-mocked/injected/in-memory и другие внешние системы, решаемые аналогичным образом). Но я делаю это на Java только для Android, поэтому у меня нет прямого опыта с таким сценарием.
Добро пожаловать в переполнение стека! Вопросы о том, что является «лучшим», «худшим», «лучшей практикой» и т. Д. - не относятся к теме SO, потому что они, как правило, привлекают упрямые ответы и спам. Пожалуйста, обновите свой вопрос, чтобы на нем было меньше мнения. – Ares