W pracy jeden z moich projektów polega głównie na pobieraniu danych przekazywanych od klienta zewnętrznego i utrwalaniu ich w bazie danych. Jest to aplikacja Java dla przedsiębiorstw korzystająca z JPA i większość naszej logiki dotyczy operacji CRUD.
Większość naszych błędów dotyczy JPA w taki czy inny sposób.
- Przykład 1: Jeśli klikniesz przycisk Zapisz dwa razy, JPA może spróbować wstawić ten sam byt do bazy danych po raz drugi, powodując naruszenie klucza podstawowego.
- Przykład 2: pobierasz jednostkę z bazy danych, edytujesz ją i próbujesz zaktualizować jej dane. JPA może próbować utworzyć nową instancję zamiast aktualizować starą.
Często rozwiązanie wymaga dodania / usunięcia / zmiany adnotacji JPA. Innym razem ma to związek z modyfikacją logiki DAO.
Nie mogę wymyślić, jak uzyskać zaufanie do naszego kodu za pomocą testów jednostkowych i TDD. Nie jestem pewien, czy to dlatego, że testy jednostkowe i TDD są źle dopasowane, czy też źle podchodzę do problemu.
Testy jednostkowe wydają się źle dopasowane, ponieważ mogę wykryć te problemy tylko w czasie wykonywania i muszę wdrożyć na serwerze aplikacji, aby odtworzyć problemy. Zwykle baza danych musi być zaangażowana, co uważam za niezgodne z definicją testu jednostkowego: są to testy integracyjne.
TDD wydaje się źle dopasowane, ponieważ pętla testowa wdrażania + testowania jest tak wolna, że czyni mnie bardzo nieproduktywnym. Pętla opinii wdrożeniowych + testowych zajmuje ponad 3 minuty, i to tylko wtedy, gdy przeprowadzam testy specjalnie na temat kodu, który piszę. Uruchomienie wszystkich testów integracyjnych zajmuje ponad 30 minut.
Poza tą formą jest kod i zawsze testuję to urządzenie, kiedy tylko mogę. Ale większość naszych błędów i największe pochłanianie czasu zawsze dotyczy JPA lub bazy danych.
Jest inne pytanie, które jest podobne , ale jeśli zastosuję się do porady, skończę z najbardziej niestabilną częścią mojego kodu (JPA) i przetestuję wszystko oprócz tego. W kontekście mojego pytania byłbym w tej samej złej sytuacji. Jaki jest następny krok po pakowaniu JPA? IMO to pytanie jest (być może) krokiem do odpowiedzi na moje pytanie, ale nie jest odpowiedzią na to pytanie.
unit testing != TDD
)