unit testing w praktyce... czyli właściwie jak?

47
Unit Testing w praktyce… Czyli właściwie jak? Piotr Raszkowski, 17.02.

Upload: bartlomiej-cymanowski

Post on 31-Jul-2015

3.295 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Unit testing w praktyce... czyli właściwie jak?

Unit Testing w praktyce… Czyli właściwie jak?

Piotr Raszkowski, 17.02.2015

Page 2: Unit testing w praktyce... czyli właściwie jak?

Agenda

1. Moja historia stania się programistą - testerem.

2. Podstawy pisania testów jednostkowych.

3. Dobre praktyki pisania testów jednostkowych.

4. Rezultaty wykorzystania testów jednostkowych.

Page 3: Unit testing w praktyce... czyli właściwie jak?

Dziwne...

Page 4: Unit testing w praktyce... czyli właściwie jak?

Wczoraj to działało...

Page 5: Unit testing w praktyce... czyli właściwie jak?

Jak to możliwe?

Page 6: Unit testing w praktyce... czyli właściwie jak?

Coś jest nie tak w Twoich danych testowych...

Page 7: Unit testing w praktyce... czyli właściwie jak?

Nie zmieniałem tego!

Page 8: Unit testing w praktyce... czyli właściwie jak?

Czy na pewno testowałeś najnowszą wersję?

Page 9: Unit testing w praktyce... czyli właściwie jak?

Nie mogę przetestować wszystkiego!

Page 10: Unit testing w praktyce... czyli właściwie jak?

A już tego nie naprawiłem?

Page 11: Unit testing w praktyce... czyli właściwie jak?

U mnie działa!

Page 12: Unit testing w praktyce... czyli właściwie jak?
Page 13: Unit testing w praktyce... czyli właściwie jak?

Moja historia...

1. Trudne po-studenckie początki...

Page 14: Unit testing w praktyce... czyli właściwie jak?

Moja historia...

1. Trudne po-studenckie początki…2. Twarde lądowanie z powodu nie

testowania swojego kodu...

Page 15: Unit testing w praktyce... czyli właściwie jak?

Moja historia...

1. Trudne po-studenckie początki…2. Twarde lądowanie z powodu nie

testowania swojego kodu…3. Nowa praca - nowe wyzwania.

Page 16: Unit testing w praktyce... czyli właściwie jak?

Moja historia...

1. Trudne po-studenckie początki…2. Twarde lądowanie z powodu nie

testowania swojego kodu…3. Nowa praca - nowe wyzwania.4. Clean Code odmienił moje życie!

Page 17: Unit testing w praktyce... czyli właściwie jak?

Moja historia...

1. Trudne po-studenckie początki…2. Twarde lądowanie z powodu nie

testowania swojego kodu…3. Nowa praca - nowe wyzwania.4. Clean Code odmienił moje życie!5. Testy na pierwszym miejscu!

Page 18: Unit testing w praktyce... czyli właściwie jak?

Nie ma dobrego kodu bez dobrych testów!

Page 19: Unit testing w praktyce... czyli właściwie jak?

Główne błędy

1. Brak świadomości programistów, że każdy popełnia błędy.

2. Brak ustandaryzowanego podejścia do testów.3. Brak jasnych zasad i standardów dbania o kod.4. Brak procesu review.5. Zbyt duża presja na wynik.6. Rozdzielenie testów od developmentu.

Page 20: Unit testing w praktyce... czyli właściwie jak?

Podstawy pisania testów jednostkowych

Page 21: Unit testing w praktyce... czyli właściwie jak?

Czy jest test jednostkowy?

Test jednostkowy (ang. unit test) – 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. Testowany fragment programu poddawany jest testowi, który wykonuje go i porównuje wynik (np. zwrócone wartości, stan obiektu, zgłoszone wyjątki) z oczekiwanymi wynikami – tak pozytywnymi, jak i negatywnymi (niepowodzenie działania kodu w określonych sytuacjach również może podlegać testowaniu).

Źródło: Wikipedia

Page 22: Unit testing w praktyce... czyli właściwie jak?

Test Driven Development

1. Nie można zacząć pisać kodu produkcyjnego do momentu napisania

niespełnianego testu jednostkowego.

2. Nie można napisać więcej testów jednostkowych, które są wystarczające

do niespełnienia testu, a brak kompilacji jest jednoczśnie nieudanym

testem.

3. Nie można pisać większej ilości kodu produkcyjnego, niż wystarczy do

spełnienia obecnie niespełnianego testu.

Źródło: Clean Code

Page 23: Unit testing w praktyce... czyli właściwie jak?

TDD - dlaczego nie działa

● nastawienie na szybkie rezultaty

● bardzo trudne

● wymaga “przemyślenia” wszystkiego na początku

Page 24: Unit testing w praktyce... czyli właściwie jak?

Czystość testów

● Testy powinny być czytelne (klarowne, proste, spójne)!● Brak czytelności prowadzi do niechęci zmian kodu

produkcyjnego.● Brak czytelności prowadzi do braku nowych testów.● Brak czytelności prowadzi do wzrostu kosztu

utwrzymania.

● Czytelność zwiększa możliwości!

Page 25: Unit testing w praktyce... czyli właściwie jak?

Jedna asercja VS jedna koncepcja

Page 26: Unit testing w praktyce... czyli właściwie jak?

Zasada F.I.R.S.T.

1. fast (szybkie)2. independent (niezależne)3. repeatable (powtarzalne)4. self - validating (samokontrolujące się)5. timely (o czasie)

Page 27: Unit testing w praktyce... czyli właściwie jak?

Dobre praktyki pisania testów jednostkowych

Page 28: Unit testing w praktyce... czyli właściwie jak?

Testy prawdziwie jednostkowe

● testujemy tylko i wyłącznie jedną klasę - inaczej to testy integracyjne

Page 29: Unit testing w praktyce... czyli właściwie jak?

Testy prawdziwie jednostkowe

● testujemy tylko i wyłącznie jedną klasę - inaczej to testy integracyjne

● testujemy tylko jedną koncepcję na metodę testową

Page 30: Unit testing w praktyce... czyli właściwie jak?
Page 31: Unit testing w praktyce... czyli właściwie jak?

Testy prawdziwie jednostkowe

● testujemy tylko i wyłącznie jedną klasę - inaczej to testy integracyjne

● testujemy tylko jedną koncepcję na metodę testową

● nie testujemy zależności - mock’ujemy

Page 32: Unit testing w praktyce... czyli właściwie jak?
Page 33: Unit testing w praktyce... czyli właściwie jak?

Testy prawdziwie jednostkowe

● testujemy tylko i wyłącznie jedną klasę - inaczej to testy integracyjne

● testujemy tylko jedną koncepcję na metodę testową

● nie testujemy zależności - mock’ujemy● testujemy warunki brzegowe

Page 34: Unit testing w praktyce... czyli właściwie jak?

Używamy dodatkowych bibliotek i narzędzi

● Mockito● PowerMock● EasyMock● Cobertura● EclEmma

Page 35: Unit testing w praktyce... czyli właściwie jak?

Tworzymy testy “integracyjne”

Page 36: Unit testing w praktyce... czyli właściwie jak?

Pokrycie kodu...

… powinno wynosić 100%!

Page 37: Unit testing w praktyce... czyli właściwie jak?

Nie piszemy komentarzy, piszemy testy!

Page 38: Unit testing w praktyce... czyli właściwie jak?

Opisujemy zachowania

● Metody testowe opisują zachowania● Metody testowe opisują warunki wejścia

oraz zakładany rezultat● Gdy za dużo warunków wejściowych →

rozbijamy klasy na mniejsze (SRP)

Page 39: Unit testing w praktyce... czyli właściwie jak?

Jak pracować z testami?

1. Piszemy testy na początku (zbyt idealne).2. Piszemy kod programu (zgrubny szkic).3. Pokrywamy kod testami.4. Prowadzimy refactoring przy ciągłym uruchamianiu

testów.

Page 40: Unit testing w praktyce... czyli właściwie jak?

Zasada Scout’a w testach

1. Po każdej zmianie w kodzie badamy pokrycie.2. Wyszukujemy klasę o niskim pokryciu.3. Ulepszamy!

Page 41: Unit testing w praktyce... czyli właściwie jak?

Tworzymy testowalny kod

● czasami warto zmienić poziom dostępu● unikamy ciężkiej logiki w konstruktorach● unikamy statycznych funkcji● unikamy

anty-wzorca Singleton

Page 42: Unit testing w praktyce... czyli właściwie jak?

Zasada Given-When-Then

● jedna koncepcja na test● każda metoda testowa rozdzielona na bloki:

o given → wejście do naszej metodyo when → zachowanieo then → zakładany rezultat

● Given-When-Then w nazwach metod testowych

Page 43: Unit testing w praktyce... czyli właściwie jak?
Page 44: Unit testing w praktyce... czyli właściwie jak?

Rezultaty stosowania testów

Page 45: Unit testing w praktyce... czyli właściwie jak?

Aplikacja do ekstrakcji danych

● Ilośc linii kodu: 4 138 (4 053 / 85 - 97,9 %)● Ilość klas: 250 (246 / 4 - 98,4 %)● Ilość metod: 1 342 (1296 / 46 - 96,6 %) ● Ilość napisanych testów: 1 077

● Pokrycie kodu (instrukcje): 97,2 %

Page 46: Unit testing w praktyce... czyli właściwie jak?

Rezultaty

● Ilość poważnych błędów: 1● Ilość mniejszych błędów: ~10● Ilość sytuacji w których aplikacja w ogóle

nie zadziałała: 0

● Niezliczona ilość operacji refactoringu i zmian w kodzie.

Page 47: Unit testing w praktyce... czyli właściwie jak?