На роботі один із моїх проектів - це здебільшого питання про отримання даних, переданих від зовнішнього клієнта, та збереження їх у базі даних. Це корпоративне додаток Java, що використовує JPA, і більшість нашої логіки обертається навколо операцій CRUD.
Більшість наших помилок так чи інакше залучають JPA.
- Приклад 1: Якщо двічі натиснути кнопку збереження, JPA може спробувати вставити ту саму сутність у базу даних вдруге, що спричинить порушення первинного ключа.
- Приклад 2: Ви отримуєте об'єкт із бази даних, редагуєте його та намагаєтесь оновити його дані. JPA може спробувати створити новий екземпляр замість оновлення старого.
Часто рішення потребує додавання / видалення / зміни анотації JPA. В інших випадках це стосується зміни логіки DAO.
Я не можу зрозуміти, як довіритись нашому коду, використовуючи одиничні тести та TDD. Я не впевнений, що це через те, що тести на модулі та TDD погано підходять, або якщо я неправильно підходжу до проблеми.
Тести блоку здаються поганими, оскільки я можу виявити ці проблеми лише під час виконання, і мені потрібно розгорнути сервер додатків, щоб відтворити проблеми. Зазвичай потрібно залучати базу даних, що, на мою думку, є поза визначенням одиничного тесту: Це інтеграційні тести.
TDD здається поганим пристосуванням, оскільки цикл зворотного зв’язку розгортання + тест настільки повільний, що робить мене дуже непродуктивним. Цикл зворотного зв’язку розгортання + тест займає 3 хвилини, і це просто, якщо я запускаю тести спеціально щодо коду, який я пишу. Для виконання всіх інтеграційних тестів потрібно 30+ хвилин.
Код є поза цією формою, і я завжди тестую тестування, що коли можу. Але більшість наших помилок і найбільших мийок часу завжди включають JPA або базу даних.
Є ще подібне питання , але якби я дотримувався порад, я би загорнув найстабільнішу частину свого коду (JPA) і протестував би все, крім нього. У контексті мого питання я опинився б у тій же поганій ситуації. Який наступний крок після завершення програми JPA? ІМО, це питання - це (можливо) крок, щоб відповісти на моє запитання, але не відповідь на нього.
unit testing != TDD
)