На работе один из моих проектов в основном связан с передачей данных от внешнего клиента и сохранением их в базе данных. Это корпоративное Java-приложение, использующее JPA, и большая часть нашей логики вращается вокруг операций CRUD.
Большинство наших ошибок так или иначе связаны с JPA.
- Пример 1. Если вы дважды нажмете кнопку сохранения, JPA может попытаться вставить один и тот же объект в базу данных еще раз, что приведет к нарушению первичного ключа.
- Пример 2. Вы извлекаете объект из базы данных, редактируете его и пытаетесь обновить его данные. JPA может попытаться создать новый экземпляр вместо обновления старого.
Часто решение нуждается в добавлении / удалении / изменении аннотации JPA. В других случаях это связано с изменением логики DAO.
Я не могу понять, как получить уверенность в нашем коде, используя модульные тесты и TDD. Я не уверен, что это потому, что юнит-тесты и TDD плохо подходят, или я неправильно подхожу к проблеме.
Модульные тесты кажутся неподходящими, потому что я могу обнаружить эти проблемы только во время выполнения, и мне нужно развернуть их на сервере приложений, чтобы воспроизвести проблемы. Обычно необходимо задействовать базу данных, которая, как я считаю, выходит за рамки определения модульного теста: это интеграционные тесты.
TDD кажется неподходящим, потому что цикл обратной связи deploy + test настолько медленный, что делает меня очень непродуктивным. Цикл обратной связи deploy + test занимает более 3 минут, и это только в том случае, если я запускаю тесты специально для кода, который пишу. Для запуска всех интеграционных тестов требуется более 30 минут.
За пределами этой формы есть код, и я всегда тестирую его по мере возможности. Но большинство наших ошибок и самые большие временные погрешности всегда связаны с JPA или базой данных.
Есть еще один похожий вопрос , но если бы я следовал совету, я бы обернул самую нестабильную часть своего кода (JPA) и протестировал все, кроме него. В контексте моего вопроса я был бы в такой же плохой ситуации. Какой следующий шаг после упаковки JPA? ИМО этот вопрос (возможно) является шагом к ответу на мой вопрос, но не является ответом на него.
unit testing != TDD
)