2011-10-09 10 views
7

Jestem programistą internetowym, który zakończył pracę w środowisku Java EE (Richfaces, Seam 2, EJB 3.1, JPA). Do testowania JPA używam hipersonicznego i Mockito. Ale brakuje mi głębszej wiedzy EJB.W TDD, dlaczego OpenEJB i dlaczego Arquillian?

Niektórzy mogą twierdzić, że powinniśmy używać OpenEJB i Arquillian, ale po co? Kiedy należy wykonywać testy zależne od kontenera? Jakie są możliwe scenariusze testowe, w których potrzebuję OpenEJB i Arquillian?

Proszę mnie oświecić :)

Odpowiedz

11

Istnieją dwa aspekty w tej sprawie.

  1. Testy jednostkowe. Te mają być bardzo szybkie (wykonać cały zestaw testów w ciągu kilku sekund). Testują bardzo małe fragmenty kodu - tj. Jedną metodę. Aby osiągnąć ten rodzaj ziarnistości, musisz wyśmiać całe środowisko używając np. Mockito. Nie jesteś zainteresowany:
    • wywoływanie EntityManager i wprowadzenie do bazy danych podmiotów,
    • transakcji testowych
    • dokonywania asynchronicznych wywołań,
    • uderzanie JMS Endpoint itp

Kpisz sobie z całego środowiska i po prostu testujesz każdą metodę osobno. Jednostkowe testy są drobnoziarniste i niesamowicie szybkie. Dzieje się tak dlatego, że możesz je wykonywać za każdym razem, gdy wprowadzasz ważne zmiany w kodzie. Gdyby były bardziej złożone i czasochłonne, deweloper nie uderzyłby tak często, jak powinien, w przycisk "test".

  1. Testy integracyjne. Są wolniejsze, ponieważ chcesz przetestować integrację między modułami. Chcesz sprawdzić, czy oni „rozmawiać” ze sobą w odpowiedni sposób, to znaczy:
    • są transakcje rozmnażane w sposób, można się spodziewać,
    • co się dzieje, jeśli wywołać metodę biznesu bez transakcji w ogóle,
    • czy zmiany wysyłane z klienta WebServices naprawdę trafiają w metodę punktu końcowego i dodaje dane do bazy danych?
    • co zrobić, jeśli mój punkt końcowy JMS rzuci wyjątek ApplicationException - czy poprawnie wycofa wszystkie zmiany?

Jak widać, testy integracyjne są gruboziarnistych i jak są one wykonywane w pojemniku (lub zasadniczo: w środowisku produkcyjnym-like) są znacznie wolniejsze. Testy te zazwyczaj nie są wykonywane przez programistę po każdej zmianie kodu.

Oczywiście można uruchomić kontener EJB w trybie wbudowanym, tak samo jak można wykonać WZP w Java SE. Chodzi o to, że sztuczne środowisko daje ci podstawowe usługi, ale skończysz z jego podkręcaniem i nadal kończysz z mniejszą elastycznością niż w prawdziwym pojemniku.

Arquillian umożliwia tworzenie środowiska produkcyjnego na wybranym pojemniku i po prostu wykonywanie testów w tym środowisku (przy użyciu źródeł danych, miejsc docelowych JMS i wielu innych konfiguracji, które można oczekiwać w środowisku produkcyjnym.)

Mam nadzieję, że to pomaga.

+0

Dziękuję, perf ect odpowiedź. Część JMS jest szczególnie interesująca w moim przypadku. –

+0

Cieszę się, że mogę pomóc :-) –

+2

Dobra wiadomość. Jestem ciekawy, co to jest "Chodzi o to, że sztuczne środowisko daje ci podstawowe usługi, ale skończysz z jego podkręcaniem i nadal kończysz z mniejszą elastycznością niż w rzeczywistym kontenerze". Ideą API EJBContainer jest to, że używasz prawdziwego kontenera EJB. Nie powinno być żadnej różnicy w przestrzeganiu lub zachowaniu. –

0

W tym roku uczestniczyłem w Devoxx i otrzymałem szansę, aby odpowiedzieć na pytanie JBOSS. Niektóre z tych scenariuszy testowych (rzeczy udało mi się mazać dół):

  • konfiguracja pojemnika
  • integracyjne Pojemnik
  • granice przynależności transakcyjne
  • Entity metod zwrotnych
  • Integracja testuje
  • Nagrania Selenium