Slide 1

Slide 1 text

Lukasz Balcerzak automatyzacja testów Sunday 20 October 13

Slide 2

Slide 2 text

★ Łukasz Balcerzak ★ autor django-guardian ★ commity m.in. w: django, nose, tox, boom, vcs, hubot, django-compressor O mnie 2 Sunday 20 October 13

Slide 3

Slide 3 text

★ mam szczerą nadzieję, że przynajmniej część z was zobaczy na tej prezentacji coś nowego po co kolejny talk o testowaniu? 3 Sunday 20 October 13

Slide 4

Slide 4 text

★ Rodzaje testów ★ Proces testowania ★ narzędzia ★ Continous integration Plan Sunday 20 October 13

Slide 5

Slide 5 text

★ Testy jednostkowe ★ Testy integracyjne ★ testy regresyjne Rodzaje testów Sunday 20 October 13

Slide 6

Slide 6 text

★ Najprostsze tesy wejścia/wyjścia Testy jednostkowe 6 Sunday 20 October 13

Slide 7

Slide 7 text

★ testują grupę elementów systemu testy integracyjne 7 Sunday 20 October 13

Slide 8

Slide 8 text

★ zabezpieczenie przed zmianami w przyszłości ★ ... lub po wykryciu błędu ★ Po zgłoszeniu błędu najpierw zastanówmy się jak go zreprodukować i proces ten zapisujemy jako test testy regresyjne 8 Sunday 20 October 13

Slide 9

Slide 9 text

★ test-driven development ★ Documentation-Driven development ★ Behavior-driven development ★ test coverage ★ code review proces testowania Sunday 20 October 13

Slide 10

Slide 10 text

★ Napisz testy ★ napisz kod test-driven development 10 Sunday 20 October 13

Slide 11

Slide 11 text

★ napisz dokumentację ★ napisz testy ★ napisz kod documentation-driven development 11 Sunday 20 October 13

Slide 12

Slide 12 text

★ napisz oczekiwane zachowanie systemu względem użytkownika ★ napisz kod behavior-driven development 12 Sunday 20 October 13

Slide 13

Slide 13 text

★ http://pypi.python.org/pypi/coverage test coverage 13 Sunday 20 October 13

Slide 14

Slide 14 text

★ coś czego nie zautomatyzujemy ... ★ łatwo wyłapuje drobne błędy ★ oraz niejasności w kodzie code review 14 Sunday 20 October 13

Slide 15

Slide 15 text

★ podczas przeglądania kodu pamiętajmy, że jesteśmy delikatnymi duszami code review 15 Sunday 20 October 13

Slide 16

Slide 16 text

★ podczas przeglądania kodu pamiętajmy, że jesteśmy delikatnymi duszami code review 16 Sunday 20 October 13

Slide 17

Slide 17 text

★ dużo testów jednostkowych i mało integracyjnych ★ bez paranoi: TDD ma nam pomagać a nie zabierać czas ★ dbać o to by, testowanie było łatwe ★ ... i szybkie no dobra, to jak testować? 17 Sunday 20 October 13

Slide 18

Slide 18 text

jednostkowe czy integracyjne 18 Sunday 20 October 13

Slide 19

Slide 19 text

jednostkowe czy integracyjne 18 Sunday 20 October 13

Slide 20

Slide 20 text

★ najpierw opiszmy oczekiwane zachowanie systemu ★ Powinniśmy testować wszystkie kombinacje parametrów wejściowych ... ★ a także różne kombinacje w różnych kontekstach, ale ... jednostkowe czy integracyjne 19 Sunday 20 October 13

Slide 21

Slide 21 text

problem? 20 Sunday 20 October 13

Slide 22

Slide 22 text

problem 21 Sunday 20 October 13

Slide 23

Slide 23 text

poprawiony test 22 Sunday 20 October 13

Slide 24

Slide 24 text

poprawiona metoda 23 Sunday 20 October 13

Slide 25

Slide 25 text

★ nie dajmy się zwariować ★ nie chodzi TYLKO o kwestie biznesowe - chodzi o nasz zespół, który bardziej czeka na poprawkę lub funkcjonalność niż test ★ ... ale użytkownik też doceni, jeżeli np. jego poczta znowu zacznie działać i nie będzie musiał czekać, aż programista będzie łaskaw napisać test regresyjny bez paranoi 24 Sunday 20 October 13

Slide 26

Slide 26 text

★ staszek jest świetnym programistą ★ ma 10+ lat doświadczenia, uprawia tdd, pomaga współpracownikom, chłonie wiedzę i dzieli się nią ★ ale staszek raz na jakiś czas spędza 2 dni na napisanie testu ★ do jednej funkcji/poprawki, którą napisał w 15 minut paranoja 25 Sunday 20 October 13

Slide 27

Slide 27 text

★ staszek pracuje nad nowym projektem, w którym zdecydowano użyć nieznanych mu narzędzi i bibliotek ★ narzędzia mają świetną dokumentację jak poprawnie pisać kod i testy (hint: angularjs) ★ ale staszek nie zna jeszcze tych wspaniałości i nie ufa im zbytnio - więc i tak ręcznie testuje swoją aplikację ★ EPIC FAIL paranoja 26 Sunday 20 October 13

Slide 28

Slide 28 text

★ gdy nie jesteśmy pewni jak testować - nie próbujmy się oszukiwać, że mamy testy automatyczne ★ gdy napisanie testu zajmuje nam zbyt długo - dajmy spokój. Test napiszemy, jak wpadniemy jak to zrobić. ★ gdy widzimy, że ktoś wpada w paranoję: obrońmy go przed samym sobą! paranoja 27 Sunday 20 October 13

Slide 29

Slide 29 text

★ tzn. uruchamianie testów dla danego projektu powinno sprowadzać się do uruchomienia jednej komendy ★ ... co często wymusza łatwy “bootstrap” projektu ★ dla paczek: python setup.py test (dba o zależności) łatwe testowanie? 28 Sunday 20 October 13

Slide 30

Slide 30 text

★ jedna z najważniejszych cech dobrych testów szybkie testy - po co? 29 Sunday 20 October 13

Slide 31

Slide 31 text

★ jak często otrzymujemy informację o popsutych testach na serwerze CI? ★ ile maksymalnie mogą trwać testy żebyśmy je uruchamiali po każdej zmianie? 1h? 30m? 10m? 5m? 5s? 2s? ★ feedback, malarz, perspektywa szybkie testy - po co? 30 Sunday 20 October 13

Slide 32

Slide 32 text

perspektywa 31 Sunday 20 October 13

Slide 33

Slide 33 text

perspektywa 32 Sunday 20 October 13

Slide 34

Slide 34 text

perspektywa 33 Sunday 20 October 13

Slide 35

Slide 35 text

★ mało testów integracyjnych ★ dużo mockowania ★ obserwacja najwolniejszych testów ★ sprawdźmy dokumentację (django auth, simpletestcase) ★ setUp vs setUpClass ★ czy naprawdę potrzebujemy tych wszystkich danych dla każdego testu? szybkie testy - jak? 34 Sunday 20 October 13

Slide 36

Slide 36 text

★ jakość kodu (pyflakes/flake8) ★ przykłady w docstringach (doctesty) ★ generowanie dokumentacji ★ command line tools (np. scriptest) co testować poza kodem? 35 Sunday 20 October 13

Slide 37

Slide 37 text

★ setup.py ★ przykładowa implementacja: https://github.com/ lukaszb/django-guardian/blob/master/extras.py jakość kodu 36 Sunday 20 October 13

Slide 38

Slide 38 text

★ podstawowe ★ znane ★ mniej znane ★ specjalistyczne Narzędzia Sunday 20 October 13

Slide 39

Slide 39 text

★ shell ★ przeglądarka ★ psql ★ ipython ★ curl ★ ab/boom podstawowe 38 Sunday 20 October 13

Slide 40

Slide 40 text

★ unittest/doctest ★ nose ★ pytest ★ pyflakes/flake8 znane 39 Sunday 20 October 13

Slide 41

Slide 41 text

★ lettuce (bdd) ★ freshen (bdd, łatwiejsze regexy) ★ splinter (~selenium, ale ma wspólne api dla różnych sterowników) ★ zc.buildout (automatyzuje ustawianie środowiska) mniej znane 40 Sunday 20 October 13

Slide 42

Slide 42 text

★ funkload - testy wydajnościowe pisane jak unit testy ★ porunga - testowanie algorytmów ★ sqlmap - testy aplikacji w poszukiwaniu podatności sql injection ★ tox - testowanie dla różnych wersji Python’a i/lub zależności specjalistyczne 41 Sunday 20 October 13

Slide 43

Slide 43 text

★ sentry - wyjątki aplkikacji webowych ★ travis-ci - continous integration ★ coveralls - pokrycie kodu testami usługi 42 Sunday 20 October 13

Slide 44

Slide 44 text

★ natychmiastowy feedback ★ uruchamianie części testów ★ lokalne testowanie wielu wersji pythona/paczek problemy Sunday 20 October 13

Slide 45

Slide 45 text

natychmiastowy feedback 44 Sunday 20 October 13

Slide 46

Slide 46 text

★ watchdog! natychmiastowy feedback ★ + notyfikacje 45 Sunday 20 October 13

Slide 47

Slide 47 text

natychmiastowy feedback 46 Sunday 20 October 13

Slide 48

Slide 48 text

natychmiastowy feedback 47 Sunday 20 October 13

Slide 49

Slide 49 text

natychmiastowy feedback 48 Sunday 20 October 13

Slide 50

Slide 50 text

★ żeby pozwolić sobie na uruchamianie testów po każdej zmianie pliku nasze testy muszą być bardzo szybkie ★ możemy też po prostu uruchamiać tylko te testy, które dotyczą zmienianej przez nas funkcjonalności natychmiastowy feedback 49 Sunday 20 October 13

Slide 51

Slide 51 text

★ py.test pozwala na “oznaczanie” testów natychmiastowy feedback 50 Sunday 20 October 13

Slide 52

Slide 52 text

natychmiastowy feedback 51 Sunday 20 October 13

Slide 53

Slide 53 text

natychmiastowy feedback 52 Sunday 20 October 13

Slide 54

Slide 54 text

★ pozwala na łatwe definiowanie środowisk testowych ★ korzysta z virtualenv i distribute ★ możemy uruchomić testy dla różnych wersji python’a ★ umożliwia uruchamianie dowolnej komendy, więc możemy na przykład sprawdzać generowanie dokumentacji tox 53 Sunday 20 October 13

Slide 55

Slide 55 text

★ instalacja tox 54 Sunday 20 October 13

Slide 56

Slide 56 text

★ plik tox.ini tox 55 Sunday 20 October 13

Slide 57

Slide 57 text

★ uruchamiamy dla wszystkich środowisk: ★ Albo tylko jednego: tox 56 Sunday 20 October 13

Slide 58

Slide 58 text

★ testowanie różnych wersji pakietów tox 57 Sunday 20 October 13

Slide 59

Slide 59 text

★ testowanie generowania dokumentacji tox 58 Sunday 20 October 13

Slide 60

Slide 60 text

★ “dziedziczenie” konfiguracji tox 59 Sunday 20 October 13

Slide 61

Slide 61 text

★ wymaga setup.py ★ generalnie niepotrzebny, jeśli nie planujemy zapewniać wsparcia wielu wersji python’a tox - wady 60 Sunday 20 October 13

Slide 62

Slide 62 text

★ jenkins ★ buildbot ★ travis-ci ★ zeus-ci continous integration Sunday 20 October 13

Slide 63

Slide 63 text

★ ponad 10 lat rozwoju ★ architektura master/slave ★ działa na wszystkich popularnych platformach ★ łatwo przechowuje się konfigurację w repozytorium ★ python! buildbot 62 Sunday 20 October 13

Slide 64

Slide 64 text

buildbot - platformy 63 Sunday 20 October 13

Slide 65

Slide 65 text

buildbot - steps 64 Sunday 20 October 13

Slide 66

Slide 66 text

★ tak naprawdę jest to framework, nie gotowy produkt ★ czasami gubi logi ★ czasami slave’y tracą połączenie z master’em ★ siermiężny interfejs buildbot - wady 65 Sunday 20 October 13

Slide 67

Slide 67 text

★ wystarczy zalogować się na https://travis-ci.org ★ ... zarejestrować swój projekt ★ ... oraz dodać plik .travis.yml travis ci 66 Sunday 20 October 13

Slide 68

Slide 68 text

travis ci - .travis.yml 67 Sunday 20 October 13

Slide 69

Slide 69 text

★ niby open source, ale ... - zależy od zewnętrznych usług (np. websocket’y) - separacja codebase’u (backend/frontend) utrudnia deployment ★ limit czasowy (50min lub 10min jeśli nie ma logów) travis ci - problem? 68 Sunday 20 October 13

Slide 70

Slide 70 text

zeus-ci 69 Sunday 20 October 13

Slide 71

Slide 71 text

★ User experience ★ różne platformy ★ produkt i framework ★ build matrix ★ skalowanie slave’ów ★ łatwość wdrożenia ★ api ★ rozszerzalność ★ github PR support ★ rozpoznaje tox’a zeus ci - cele 70 Sunday 20 October 13

Slide 72

Slide 72 text

★ python 2.6/2.7/3.3+ (choć celujemy w 3.3+) ★ django ★ django-rest-framework ★ celery ★ angular.js zeus ci - technologie 71 Sunday 20 October 13

Slide 73

Slide 73 text

★ https://github.com/lukaszb/zeusci zeus ci 72 Sunday 20 October 13

Slide 74

Slide 74 text

★ https://github.com/lukaszb/zeusci ★ http://pypi.python.org/pypi/tox ★ http://pypi.python.org/pypi/pytest ★ http://pypi.python.org/pypi/nose ★ http://pypi.python.org/pypi/nose-alert ★ http://pypi.python.org/pypi/nose-watch Pytania? 73 Sunday 20 October 13