25 maja 2010
TDD przypomnienie testy są fajne testujemy co tylko się da cykl: test code refactor dwa frameworki - unittest i doctest
Asercje assertequal assertraises asserttrue assertalmostequal itd.
Co testować w Django? modele widoki
Testowanie modeli c l a s s P o s t S t r T e s t ( TestCase ) : d e f setup ( s e l f ) : s e l f. p o s t = Post ( ) d e f t e s t W i t h T i t l e ( s e l f ) : s e l f. p o s t. t i t l e = kaka s e l f. a s s e r t E q u a l ( s t r ( s e l f. p o s t ), Post : kaka ) d e f t e s t W i t h o u t T i t l e ( s e l f ) : s e l f. a s s e r t E q u a l ( s t r ( s e l f. p o s t ), Post : u n t i t l e d ) Listing 1: blog/tests.py
Odpalamy maszynerię $ python manage. py t e s t b l o g i oczywiście zaliczamy faila. Po implementacji str asercje przechodzą.
Testowanie widoków c l a s s ViewIndexTest ( TestCase ) : d e f setup ( s e l f ) : s e l f. c l i e n t = C l i e n t ( ) # + post1, post2 d e f t e s t T e m p l a t e ( s e l f ) : r e s p o n s e = s e l f. c l i e n t. get ( / b l o g / ) s e l f. a s s e r t T e m p l a t e U s e d ( r e s p o n s e, b l o g / i n d e x. html ) d e f t e s t P o s t L i s t ( s e l f ) : r e s p o n s e = s e l f. c l i e n t. get ( / b l o g / ) s e l f. a s s e r t E q u a l ( l e n ( r e s p o n s e. c o n t e x t [ p o s t s ] ), 2)
Test Client udaje przeglądarkę ma dostęp do kontekstu ma dostęp do templatu ma dostęp do nagłówków HTTP (zarówno request jak i response) umie się zalogować (django.contrib.auth)
Django asercje assertcontains assertformerror asserttemplateused assertredirects
Testy integracyjne? nieizolowane testy widoków (gdy strona bez JS) Selenium
Warto poznać Sane biblioteka dla testów jednostkowych i integracyjnych banana DSL do pisania testów
Migracje Problem Polecenie syncdb działa tylko raz po utworzeniu modelu. My chcemy być elastyczni i zmieniać schemat bazy danych częściej niż co model. Rozwiązanie Migracje
Standardowe użycie tworzymy aplikację, jej modele i dorzucamy south do appek tworzymy migrację inicjującą: $ python manage. py schemamigration appname i n i t dodajemy pola do modeli tworzymy migrację automatycznie: $ python manage. py schemamigration appname auto migrujemy $ python manage. py m i g r a t e
Ficzery automatycznie generowane migracje niezależne od RDBMS niezależne na poziomie aplikacji odporne na VCS
Thumbnailowanie Problem Uploadujemy obrazki i chcemy mieć ich wersje w różnych rozmiarach. Rozwiązanie sorl-thumbnail
Przykład użycia 1. dodajemy sorl do appek 2. pole image to uploadowany obrazek w modelu 3. dodajemy do templatu: {% l o a d thumbnail %} 4. by wyświetlić obrazek: {% thumbnail o b j. image 250 x250 a u t o c r o p %}
Ficzery cachowanie wbudowane różne filtry można pisać własne filtry chyży
Problem Potrzebujemy wyszukiwarki. Rozwiązanie, Solr albo Xapian. My wybieramy Whoosh.
Przykład użycia cz. 1 dodajemy haystack do appek ustawiamy HAYSTACK SITECONF oraz HAYSTACK SEARCH ENGINE ustawiamy HAYSTACK WHOOSH PATH definiujemy search indexes.py import h a y s t a c k h a y s t a c k. a u t o d i s c o v e r ( )
Przykład użycia cz. 2 Definiujemy search indexes.py dla appki c l a s s P o s t I n d e x ( S e a r c h I n d e x ) : c o n t e n t = C h a r F i e l d ( document=true ) a u t h o r = C h a r F i e l d ( m o d e l a t t r= u s e r ) d e f g e t q u e r y s e t ( s e l f ) : r e t u r n Post. o b j e c t s. a l l ( ) I odpowiedni template do wyszukiwarki w search/search.html
Ficzery wsparcie dla Solr, Xapian i Whoosh możliwość podświetlania znalezionych fraz podobne
Chunks Idea Edytowalne małe fragmenty strony, zarządzane z poziomu admina. Użycie W templacie: {% l o a d chunks %} {% chunk dada %}
Registration Idea Rejestracja i autoryzacja użytkowników na stronie (bez użycia django admin). Użycie dodaj registration do appek syncdb dodaj do urls.py ( r ˆ a c c o u n t s /, i n c l u d e ( r e g i s t r a t i o n. backends. d e f a u l t. u r l s ) ), zdefiniuj templaty
Tagging Idea Tagowanie bytów na stronie. Użycie cz. 1 dodaj tagging do appek syncdb zarejestruj modele w tagging t a g g i n g. r e g i s t e r ( Post )
Tagging Użycie cz. 2 przypisz tagi >>> p o s t. t a g s = kaka, dudu, l a l a >>> p o s t. t a g s [<Tag : kaka >, <Tag : dudu >, <Tag : l a l a >] wypisz obiekty modelu z tagiem >>> TaggedItem. o b j e c t s. g e t b y m o d e l ( Post, kaka ) można wypisać powiązane (tagami) obiekty dostępne templatetagi wspomagające
Problem Ręczny deploy jest strasznie nudny i czasochłonny. Rozwiązanie Fabric albo Capistrano (albo masa innych).
Fabric ficzery działanie na wielu hostach automatyczne wywoływanie komend shellowych dostęp do sudo
Fabric podstawy run() local() sudo() put() get() prompt()
south.aeracode.org code.google.com/p/sorl-thumbnail haystacksearch.org github.com/clintecker/django-chunks www.bitbucket.org/ubernostrum/django-registration code.google.com/p/django-tagging docs.fabfile.org
Dziękuję za uwagę!