Nauka testowania jednostkowego w Javie EE - jak sie za to zabrac

Nauka testowania jednostkowego w Javie EE - jak sie za to zabrac
0

Witam,
Od jakiegos czasu pisze w Javie EE. Chce nauczyc sie pisania testow i po malu wchodzic w temat TDD.

Poszukuje na ten temat dobrych materialow, w szczegolnosci jak testowac jednostkowo bazy danych (wlasciwie warstwe DAO), JSF i EJB. Najlepiej przyklad gotowej aplikacji z testami.

Co nieco poczytalem i wiem, ze testy warstwy DAO nie sa oczywiste i bardzo wiele osob popelnia tu mnostwo bledow. Jednak aplikacje bazodanowe mimo to sa tworzenie z uzyciem TDD, a ja bardzo chce zaczac, tylko szukam punktu zaczepienia.

Czy warto czytac ksiazki o testach? Znajac zycie nie, ale moze jest tu jakis pozytywny wyjatek?

Pozdrawiam,

0

Testy jednostkowe nie obejmują działań na plikach, bazach danych, łączeniu z internetem. Obejmują one swoim zasięgiem tylko jedną klasę. Poczytaj o rodzajach testów (np. o integracyjnych). Jak chcesz zabrać się dobrze za testowanie to polecam: http://practicalunittesting.com/ Książka nie jest szczególnie droga, a bardzo dobrze wprowadza w tematykę testowania.

NoZi
  • Rejestracja:około 16 lat
  • Ostatnio:4 dni
0

Zobacz również Arquillian


Hate the sin, love the sinner
0

Wkrote zaczne czytac, jednak wciaz nie rozumiem dlaczego nie testuje sie jednostkowo DAO. Slyszalem, ze nalezy tworzyc apsy tak, aby testy uruchamialy sie do 20s, bo wtedy moga byc zawsze odpalane, a o to chodzi z TDD. Domyslam sie, ze zapytania do baz moga trwac dlugo i to jeden z powodow, dla ktorych bazy sie nie testuje.

Bardzo ciekawi mnie jednak w jaki sposob testuje sie aplikacje, ktore skladaja sie glownie z dwoch rzeczy: DAO i interfejsu.

0

Takie testy, o których piszesz (tzn. gdzie łączysz się z bazą) są jak najbardziej poprawne, ale nie są to testy jednostkowe. Nie stosuje się ich również na początku (ciężko testować integracje pomiędzy warstwami, które nie istnieją). Testy jednostkowe mają być bardzo szybkie (kwestia milisekund/sekund), głównie dlatego, że odpalane są prawie non-stop (jest to jeden z etapów TDD, jeżeli w określonym momencie nie zrobisz wszystkich testów to "stoisz w miejscu"). Poczytaj o mockowaniu (to pozwoli dostarczyć "udawane" odpowiedzi z bazy danych).

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Testować jednostkowo DAO mozesz, ale tylko z mockami. Testowanie np. czy jak wywołasz "save" na jakimś obiekcie encyjnym to się zapisze w bazie to są testy frameworka (np. hibernate) i tobie są one zbędne. Ty zakładasz że framework działa a testujesz tylko SWÓJ kod. Nic nie stoi na przeszkodzie żeby mockować EntityManagera / Session i sobie testować, ale pytanie czy w twoim DAO będzie wtedy co testować. Bo jeśli każda metoda to tylko delegacja wywołania metody na obiekcie z frameworka to nie warto.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
VT
  • Rejestracja:ponad 16 lat
  • Ostatnio:6 miesięcy
  • Postów:167
0

czyli co? Tego czy procedura bazodanowa zwróci nam np określony wynik nie da się opędzić testami jednostkowymi? Jak wobec tego takie rzeczy testować?
Czy w ogóle się da?

btw również jestem kompletnym newbie w zakresie testów-te książki, które polecacie Tomka Kaczanowskiego są obie na tym samym poziomie? bo coś mi się obiło, że autor preferuje testng, a ja jednak wolałbym poczytać o junit.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

@void-tec oczywiście że się da, ale po co chciałbyś to niby testować? o_O To przetestowali już autorzy biblioteki/frameworku i ty nie musisz się tym przejmować. A testujesz czy jak zrobisz Integer(1) to faktycznie będzie miał wartość 1? Albo czy jak dodasz coś do Map<> to czy faktycznie się dodało? Albo czy Set aby na pewno nie przechowuje duplikatów? Wątpię.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
VT
  • Rejestracja:ponad 16 lat
  • Ostatnio:6 miesięcy
  • Postów:167
0

np to, czy procedura składowana na bd nie zmieniła typu i liczby argumentów, których potrzebuje. W mojej aplikacji część logiki jest na bazie danych a ja wołam ją przez hibernate, nie chce więc testować, czy biblioteka to dobrze robi, tylko czy nic od strony bd nie popsuło. W hibernate jak robię callablestatement to o tym, że coś nie działa dowiaduję się zwykle dopiero po uruchomieniu takiego kodu.

Drugi przykład (nie wiem czy dobry)-zapisuje obiekt, i chcę sprawdzić, czy obiekt, jaki bd przechowuje jest tym samym, który został zapisany, bo np mogłem zapomnieć anotacji na kolumnie

edytowany 1x, ostatnio: void-tec
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0
  1. To jest test integracyjny a nie test jednostkowy. Możesz co prawda wykorzystać do niego JUnit, ale nie traktuj tego jako testu jednostowego.
  2. Nie rozumiem. Jak obiekt nie jest encyjny to dostaniesz wyjątek już przy próbie jego zapisania.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
0

Poczytaj o mockito. Za pomocą metody mock tworzysz instancję klasy lub interfejsu (szczególnie ważne). Wtedy ustalasz co wywołanie metody ma zwracać na zasadzie when(obiekt.mojaMetoda()).thenReturn("odpowiedz z bazy danych"). Wracając do tego co napisał @Shalom. Jeżeli jest to zwykła metoda wrapper (gdzie praktycznie oprócz przekazywania argumentów nie dzieje się nic innego) to nie ma wielkiego sensu w testowaniu takiej konstrukcji (chociaż fanatyk tdd prawodopobnie by się nie zgodził z tym stwierdzeniem).

O1
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 4 godziny
0

Z tego co przeczytałem zrozumiałem, że taki test jest bezsensowny?

Kopiuj
public class UserDaoTest {

	EntityManagerFactory emf;
	EntityManager em;
	UserDao dao;
	User user;
	
	@Before
	public void setUp() throws Exception {
		emf = Persistence.createEntityManagerFactory("Oracle");
		em = emf.createEntityManager();
		user = new User();
		dao = new UserDao(em);
	}

	@After
	public void tearDown() throws Exception {
		em.close();
		emf.close();
	}

	@Test
	public void testUserObject() {
		
		assertNotNull(user);
		
		user.setName("TEST");
		user.setCity("CITY");
		user.setEmail("EMAIL@EMAIL.COM");
		
		assertEquals(user.getName(), "TEST");
		assertEquals(user.getCity(), "CITY");
		assertEquals(user.getEmail(), "EMAIL@EMAIL.COM");
		
		assertNull(user.getLogin());
		assertNull(user.getCountry());
	}
	
	@Test
	public void testUserDao() {
		
		assertTrue(dao.save(user));
		
	}

}
airborn
  • Rejestracja:ponad 15 lat
  • Ostatnio:prawie 7 lat
  • Postów:274
1

Jako test jednostkowy? Tak. Zresztą samo assertNotNull(user); też nie ma większego sensu w teście, testowanie seterów i geterów też możesz sobie darować.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

@olek1

  1. Jeśli juz to to jest test integracyjny bo tworzysz połączenie do bazy a w teście jednostkowym powinieneś tu mieć mocka! Test jednostkowy testuje jedną klasę i jedną metodę, a ty tutaj wplatasz testowanie połączenia z bazą. Jak się ten test wysypie to skąd będziesz wiedział czy to błąd u ciebie w kodzie czy problem z bazą / dostawcą JPA? Nie będziesz wiedział, wiec to nie test jednostkowy.
  2. Test jest bez sensu bo nie testuje właściwie ani trochę twojego kodu. Setterów / getterów nie liczę. Taki test to by mogli napisać twórcy tego ORMa którego uzywasz żeby sprawdzić czy działa ;]

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Zobacz pozostały 1 komentarz
Shalom
Nie, bo to kłóci się z ideą testu jednostkowego. Jasne że mozesz też pisać i takie testy i możesz je implmentować jako testy jednostkowe, ale technicznie rzecz biorąc nie będą już jednostkowe skoro testują współdziałanie kilku obiektów/metod/mechanizmów.
airborn
W idealnym przypadku powinno być tak jak piszesz oczywiście. W zastanym kodzie możesz jednak trafić na kawałki które trudno mockować (np, final, native, static, anonimowe klasy wewnętrzne) jasne, że przeważnie wynikają one ze złej architektury ale czasem pracujemy z zastanym kodem którego nie możemy pozmieniać dowolnie.
Shalom
Dla javy masz PowerMocka który pozwala mockować prawie wszystko ;) static, final, prywatne metody etc
airborn
Zgadzam się po raz kolejny, ale to były tylko przykłady. Innym przykładem gdy czasami ciężko jest testować pojedyncze klasy może być wzorzec template method.
Shalom
jw. PowerMock może tworzyć "cześciowe mocki", tzn mockujesz całą klasę oprócz jednej metody którą testujesz, więc jesteś niezależny nawet od wywoływania prywatnych metod składowych danej klasy.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)