Prezentacja wprowadzająca do podstaw programowania urządzeń mobilnych w j2me. Przygotowana i wygłoszona przez Marcina Stachniuka 18.12.2009.
Prezentacja wygłoszona w ramach Warsztatów programowania telefonów komórkowych w j2me przy Studenckim Kole Naukowym Informatyki Systemów Autonomicznych i Adaptacyjnych ISA^2.
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
08 Testy Jednostkowe w j2me
1. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Testy jednostkowe w J2ME
Marcin Stachniuk
mstachniuk@gmail.com
Politechnika Wrocławska
Wydział Elektroniki
Studenckie Koło Naukowe Informatyki Systemów Autonomicznych
i Adaptacyjnych ISA2
18 grudnia 2009
Marcin Stachniuk Testy jednostkowe w J2ME 1/37
2. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Plan prezentacji
1 Wstęp
2 Tworzenie testów JMUnit
3 Przykładowy test
4 Dalsze informacje o testach
5 Podsumowanie
Marcin Stachniuk Testy jednostkowe w J2ME 2/37
3. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Plan prezentacji
1 Wstęp
2 Tworzenie testów JMUnit
3 Przykładowy test
4 Dalsze informacje o testach
5 Podsumowanie
Marcin Stachniuk Testy jednostkowe w J2ME 3/37
4. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Wstęp
Czy są testy jednostkowe?
Definicja (wg. Wikipedii)
Test jednostkowy (ang. unit test, test modułowy) to w
programowaniu metoda testowania tworzonego oprogramowania
poprzez wykonywanie testów weryfikujących poprawność działania
pojedynczych elementów (jednostek) programu - np. metod lub
obiektów w programowaniu obiektowym lub procedur w
programowaniu proceduralnym.
http://pl.wikipedia.org/wiki/Test jednostkowy
Marcin Stachniuk Testy jednostkowe w J2ME 4/37
5. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Czyli...
Czyli...
1 Posiadamy metodę (którą chcemy przetestować)
2 Wywołujemy ją (przekazując pewne argumenty)
3 Zapamiętujemy wynik (zwrócony rezultat)
4 Porównujemy, czy wynik jest zgodny z oczekiwaniem
Marcin Stachniuk Testy jednostkowe w J2ME 5/37
6. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Czyli...
Czyli...
1 Posiadamy metodę (którą chcemy przetestować)
2 Wywołujemy ją (przekazując pewne argumenty)
3 Zapamiętujemy wynik (zwrócony rezultat)
4 Porównujemy, czy wynik jest zgodny z oczekiwaniem
Marcin Stachniuk Testy jednostkowe w J2ME 5/37
7. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Czyli...
Czyli...
1 Posiadamy metodę (którą chcemy przetestować)
2 Wywołujemy ją (przekazując pewne argumenty)
3 Zapamiętujemy wynik (zwrócony rezultat)
4 Porównujemy, czy wynik jest zgodny z oczekiwaniem
Marcin Stachniuk Testy jednostkowe w J2ME 5/37
8. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Czyli...
Czyli...
1 Posiadamy metodę (którą chcemy przetestować)
2 Wywołujemy ją (przekazując pewne argumenty)
3 Zapamiętujemy wynik (zwrócony rezultat)
4 Porównujemy, czy wynik jest zgodny z oczekiwaniem
Marcin Stachniuk Testy jednostkowe w J2ME 5/37
9. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Gdzie...
Gdzie należy umieszczać metody testujące?
w metodzie main() ? NIE!!!
istnieje lepsze rozwiązanie...
Marcin Stachniuk Testy jednostkowe w J2ME 6/37
10. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Gdzie...
Gdzie należy umieszczać metody testujące?
w metodzie main() ? NIE!!!
istnieje lepsze rozwiązanie...
Marcin Stachniuk Testy jednostkowe w J2ME 6/37
11. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Gdzie...
Gdzie należy umieszczać metody testujące?
w metodzie main() ? NIE!!!
istnieje lepsze rozwiązanie...
Marcin Stachniuk Testy jednostkowe w J2ME 6/37
12. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
X-unit frameworks
Z pomocą przychodzą nam:
X-unit frameworks!
Marcin Stachniuk Testy jednostkowe w J2ME 7/37
13. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
X-unit frameworks
X-unit frameworks:
JUnit (Java)
JMUnit (J2ME)
J2MEUnit (J2ME)
NUnit (C#)
CPPUnit (C++)
PyUnit (Python)
SUnit (Smalltalk)
JSUnit (JavaScript)
fUnit (Fortran)
Marcin Stachniuk Testy jednostkowe w J2ME 8/37
14. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Plan prezentacji
1 Wstęp
2 Tworzenie testów JMUnit
3 Przykładowy test
4 Dalsze informacje o testach
5 Podsumowanie
Marcin Stachniuk Testy jednostkowe w J2ME 9/37
15. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Tworzenie testów
Marcin Stachniuk Testy jednostkowe w J2ME 10/37
16. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Tworzenie testów
Marcin Stachniuk Testy jednostkowe w J2ME 11/37
17. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Tworzenie testów
Marcin Stachniuk Testy jednostkowe w J2ME 12/37
18. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Tworzenie testów
Marcin Stachniuk Testy jednostkowe w J2ME 13/37
19. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Klasa TestCase
Klasa TestCase:
TestCase(int totalOfTests, String name) - konstruktor
test(int testNumber) - metoda wywołująca kolejne testy
setUp() - metoda wywoływana przed każdym testem
tearDown() - metoda wywoływana po każdym teście
Marcin Stachniuk Testy jednostkowe w J2ME 14/37
20. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Assercje
Assercje
Służą do porównywania rezultatów z oczekiwaniami.
Wszystkie rzucają AssertionFailedException.
Assercje:
assertEquals(int expected, int actual)
assertEquals(String test, int expected, int actual)
assertNotEquals(int expected, int actual)
assertNotEquals(String test, int expected, int actual)
Marcin Stachniuk Testy jednostkowe w J2ME 15/37
21. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Assercje
Zaawansowane Assercje:
assertNull(Object object)
assertNotNull(Object object)
assertSame(Object expected, Object actual)
assertNotSame(Object expected, Object actual)
assertTrue(boolean expression)
assertFalse(boolean expression)
fail(String test)
własne assercje
Marcin Stachniuk Testy jednostkowe w J2ME 16/37
22. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Co powinno w takim teście być?
Co powinno w takim teście (metodzie testującej) być?
1 // given - przygotowanie obiektów
2 ...
3
4 // when - wykonanie testowanej metody
5 ...
6
7 // then - sprawdzenie wyniku
8 ...
Marcin Stachniuk Testy jednostkowe w J2ME 17/37
23. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Plan prezentacji
1 Wstęp
2 Tworzenie testów JMUnit
3 Przykładowy test
4 Dalsze informacje o testach
5 Podsumowanie
Marcin Stachniuk Testy jednostkowe w J2ME 18/37
24. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Metoda do testowania
Metoda do testowania:
Zwraca sumę liczb podanych jako argument w tablicy.
1 public int sum(int [] tab) {
2 int sum = 0;
3 for (int i = 0; i < tab.length-1; i++) {
4 sum = sum = tab[i];
5 }
6 return sum;
7 }
Marcin Stachniuk Testy jednostkowe w J2ME 19/37
25. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Metoda testująca 1
Metoda testująca 1:
Sprawdza, czy metoda dobrze zsumuje tablicę, w której jest tylko
wartość 0 (zero).
1 public void testSum01() throws AssertionFailedException {
2 System.out.println(’’sum’’);
3
4 // given
5 MyClass instance = new MyClass();
6 int[] tab1 = new int [] {0};
7
8 // when
9 int result1 = instance.sum(tab1);
10
11 // then
12 assertEquals(0, result1);
13 }
Marcin Stachniuk Testy jednostkowe w J2ME 20/37
26. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Metoda testująca 2
Metoda testująca 2:
Sprawdza, czy metoda dobrze zsumuje tablicę, w której są wartości
5 i 0 (zero).
1 public void testSum02() throws AssertionFailedException {
2 System.out.println(’’sum’’);
3
4 // given
5 MyClass instance = new MyClass();
6 int[] tab1 = new int [] {5,0};
7
8 // when
9 int result1 = instance.sum(tab1);
10
11 // then
12 assertEquals(5, result1);
13 }
Marcin Stachniuk Testy jednostkowe w J2ME 21/37
27. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Szkielet testu
1 public class MyClassTest extends TestCase {
2 public MyClassTest() {
3 super(2, ’’MyClassTest’’);
4 }
5
6 public void test(int testNumber) throws Throwable {
7 switch (testNumber) {
8 case 0:
9 testSum01();
10 break;
11 case 1:
12 testSum02();
13 break;
14 }
15 }
16 // ...
17 }
Marcin Stachniuk Testy jednostkowe w J2ME 22/37
28. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Sprawdzamy przykład...
Test01.zip
Marcin Stachniuk Testy jednostkowe w J2ME 23/37
29. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
...dopisujemy kolejne testy...
http://hsc10.com/appEngProgramer.png
Marcin Stachniuk Testy jednostkowe w J2ME 24/37
30. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
... i nie działa!
Test02.zip
Marcin Stachniuk Testy jednostkowe w J2ME 25/37
31. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Dobry test
To znaczy ze test był dobrze napisany :)
http://upload.wikimedia.org/wikipedia/commons/8/80/Symbol OK.svg
Marcin Stachniuk Testy jednostkowe w J2ME 26/37
32. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Testowanie wyjątków
1 public void testException() {
2 try {
3 sortMyList(null);
4 fail(’’Metoda powinna wygenerować wyjątek’’);
5 } catch (RuntimeException e) {
6 assertTrue(true);
7 }
8 }
Marcin Stachniuk Testy jednostkowe w J2ME 27/37
33. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Plan prezentacji
1 Wstęp
2 Tworzenie testów JMUnit
3 Przykładowy test
4 Dalsze informacje o testach
5 Podsumowanie
Marcin Stachniuk Testy jednostkowe w J2ME 28/37
34. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Co testować?
Co testować:
Czy wyniki są poprawne?
Czy warunki brzegowe zostały prawidłowo określone?
Czy można sprawdzić relacje zachodzące w odwrotnym
kierunku?
Czy można sprawdzić wyniki w alternatywny sposób?
Czy można wymusić błędy?
Czy efektywność jest zadowalająca?
Marcin Stachniuk Testy jednostkowe w J2ME 29/37
35. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Kiedy testować?
Kiedy testować:
Po napisaniu nowej metody
Po poprawieniu błędu
Po każdej udanej kompilacji
Po wprowadzeniu kodu do systemu kontroli wersji
Podczas refaktoringu
Marcin Stachniuk Testy jednostkowe w J2ME 30/37
36. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Kiedy pisać testy?
Kiedy pisać testy:
Gdy cały kod jest gotowy?
Równolegle z kodem?
Przed napisaniem kodu?
Marcin Stachniuk Testy jednostkowe w J2ME 31/37
37. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
TDD
TDD Test-driven development - Programowanie sterowane testami
Piszemy test(y)
Implementujemy
Refaktoryzujemy
http://chakkaradeep.files.wordpress.com/2008/01/tdd.png
Marcin Stachniuk Testy jednostkowe w J2ME 32/37
38. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Plan prezentacji
1 Wstęp
2 Tworzenie testów JMUnit
3 Przykładowy test
4 Dalsze informacje o testach
5 Podsumowanie
Marcin Stachniuk Testy jednostkowe w J2ME 33/37
39. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Co dalej?
O czym nie zostało jeszcze tutaj powiedziane:
J2MEUnit - framework podobny do JMUnita
Hammock Mock Objects for Java ME - obiekty zastępcze
Jak pisać ładne testy
Jak pisać testowalny kod
Marcin Stachniuk Testy jednostkowe w J2ME 34/37
40. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Pytania
Pytania?
Marcin Stachniuk Testy jednostkowe w J2ME 35/37
41. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Na koniec cos śmiesznego
http://static.zooomr.com/images/3733898 810f1f2c70.jpg
Marcin Stachniuk Testy jednostkowe w J2ME 36/37
42. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 18 grudnia 2009
Więcej informacji
Kontakt z autorem:
mstachniuk@gmail.com
Strona koła naukowego ISA2
http://autonom.ict.pwr.wroc.pl/
Strona warsztatów:
http://autonom.ict.pwr.wroc.pl/∼mstachniuk
JMUnit
http://jmunit.sourceforge.net/
JMUnit1.2 User guide
http://hammingweight.com/modules/jmunit/userguide.pdf
JMUnit API
http://hammingweight.com/modules/jmunit/api/index.html
Test-driven development
http://pl.wikipedia.org/wiki/Test-driven development
Programowanie poprzez testy z wykorzystaniem JUnit (Politechnika Wrocławska)
http://gromit.ict.pwr.wroc.pl/p inf/w/jUnit.pdf
Bartosz Bańkowski, ”Pitfalls of TDD Adoption”
http://agileee.org/schedule/BB/
Szczepan Faber, ”Java: tools & techniques for TDD”
http://agileee.org/schedule/SF/
JUnit Pragmatyczne testy jednostkowe w Javie - Andrew Hunt, David Thomas, Helion 2006
Marcin Stachniuk Testy jednostkowe w J2ME 37/37