Upload
kraqa
View
2.003
Download
1
Embed Size (px)
Citation preview
Więcej testów//mniej kodu
Jak zapewnić/poprawić utrzymywalność testów automatycznych
Michał Gaworski
Wstęp
Mamy problem?
A tymczasem w kodzie...
Jak organizować testy automatyczne?
Przykład
Podsumowanie
Michał Gaworski14 lat doświadczenia na stanowiskach związanych z testowaniem oprogramowania i zapewnianiem jakościSpecjalizacja: automatyzacja testówObecnie Senior QA w firmie OpenJaw TechnologiesCertyfikat ISTQB FoundationPoprzedni pracodawcy: Comarch, IBM, Luxoft, OracleLokalizacja: Kraków
Wstęp
Mamy problem?
A tymczasem w kodzie...
Jak organizować testy automatyczne?
Przykład
Podsumowanie
Po czym poznać, że automatyzacja
testów w projekcie dostała zadyszki?
OSOBLIWOŚĆ (astr.) punkt lub linia, gdzie przyspieszenie grawitacyjne lub gęstość materii są nieskończone. Według Ogólnej
teorii względności osobliwości znajdują się w środku czarnych dziur - cała materia
tworząca taki obiekt skupia się w końcu w centralnym punkcie — tzw. osobliwości —
osiągając nieskończone gęstości
OSOBLIWOŚĆ (fiz.) stan układu, w którym przynajmniej jeden z parametrów
określających go przyjmuje wartości nieskończone
Na utrzymanie testów automatycznych trzeba przeznaczyć czas: poprawa błedów w
samych testach, aktualizacja test frameworka, tłumaczenie i interpretacja
wyników, zmiany w samej aplikacji
Im więcej testów, tym więcej czasu należy przeznaczyć na ich utrzymanie, zwłaszcza w
kontekście zmiany w testowanym kodzie
Zależność ilość/czas? nie jest trywialna (i na ogół nie jest liniowa). W sytuacji, gdy prosta
zmiana w aplikacji pociąga za sobą konieczność aktualizacji wielu testów możliwe są następujące scenariusze:
Zmiana punktowa (gdy kod jest wpólny i wiadomo co zmienić)
Zmiany wielokrotne (gdy kod nie jest wspólny ale wiadomo co zmienić)
Bieganie z nożyczkami (gdy nie wiadomo co zmienić w prawdopodobnie wspólnym
kodzie - mamy wahadełko)
Duplikacja kodu jest wrogiem numer jeden
w walce outrzymywalność kodu
testowego
OSOBLIWOŚĆ (testowanie): jest wtedy, gdy 100% czasu zespołu automatyzującego
pochłania samo utrzymanie istniejących testów
Wstęp
Mamy problem?
A tymczasem w kodzie...
Jak organizować testy automatyczne?
Przykład
Podsumowanie
Kod testów automatycznych jest bardziej narażony na duplikację niż przeciętny kod
aplikacji
Podobieństwo testówPoziomy testów (unit, integracja, system)Cel testów (funkcjonalne, wydajnościowe)
Kodu testowego może być dużo
http://www.sqlite.org/testing.html
Wersja 3.8.10 ma ~94 200 linii kodu aplikacji
91 515 500 linii kodu testów!
Skąd się bierze duplikacja kodu???
Ułuda posiadania frameworka
Biblioteki podpięte pod projectto jeszcze nie framework
Framework to:biblioteki + taka organizacja kodu, która
zapewnia, że:
Uwspólnia się tak dużo kodu jak to tylko możliwe
Podobne rzeczy sa robione podobnie Wiadomo, gdzie szukać koduStadaryzuje wyjście z testów
Pozwala zrozumieć test bez jego uruchamiania
Testy = skrypty
Proof of Concept, który rozrasta się w niekontrolowany sposób w projekt
Brak "czytelnej" treści testów
Zamiast sprawdzić, czy nie należy modyfikować istniejących testów prościej
jest napisac nowe
. . .
@Test public void shouldLayeredTransformationReturnInnerNodesOnlyWhenInvokedFromDispatcher()
@Test public void shouldLTransformationReturnInNodesTransformedWhenInvokedFromDispatcherWithTransform()
@Test public void shouldLTransformationReturnInNodesPreTransformedWhenInvokedFromDispatcherWithTransformAndSourceInactive()
. . .
Wielkość suity testowej
Kiedy kodu (nie testów!) jest za dużo, nikt go w końcu nie ogarnia.
Im gorzej jest zorganizowany tym szybciej to nastąpi - jak ktos nie ogarnia kodu to
pisze nowy i problem narasta eksponencjalnie
Wstęp
Mamy problem?
A tymczasem w kodzie...
Jak organizować testy automatyczne?
Przykład
Podsumowanie
Minimalizujmy ilość kodu, maksymalizując ilość testów!
Zasada “punktu docelowego” (Point of Interest)
Jednoznaczna organizacjaWarstwy: Test -> DSL -> Implementacja
“Point of Interest”
Symbol powiązany z zasobem, do którego odwołują się testy (przykład: zmienna, która
trzyma nam Xpath odnoszący się do przycisku).
Nigdy nie wpisujemy “z palca”.Gdy zmieni się zasób, aktualizujemy
definicję symbolu.Nie trzeba zmieniać testów.
Jednoznaczna organizacja
Istnieje jednoznaczna reguła określającagdzie trzymamy kod testujący
daną funkcjonalność
Jeżeli kodu nie ma tam, gdzie powinien być,znaczy to, że nie zaimplementowano testów
Warstwy: Test + DSL + Implementacja
Test – opis zrozumiały dla człowiekaDSL – model wyrażony językiem domeny
Implementacja – oparta o “Points of Interest”
Wstęp
Mamy problem?
A tymczasem w kodzie...
Jak organizować testy automatyczne?
Przykład
Podsumowanie
100 testów = 13 sposobów odwołania się do pola
Przykład
Page Object pattern
Page Object PatternWzorzec projektowy, który powstał z myślą o zwiekszeniu utrzymywalności i redukowaniu
duplikacji testówPage Object to klasa pośrednicząca pomiedzy
testem a interfejsem użytkownikaTesty używają tylko metod klasy (lub klas) „opakowujących” dany kawałek interfejsu
użytkownika (lub API)Wszelkie stałe (takie jak np. selektory css) są
zdefiniowane w tych klasach
@sample01Scenario: Verify login with correct credentials Given I open webpage in browser When I login as default user Then I see application main page
Given(/^I open webpage in browser$/) do visit $TC.urlend
When(/^I login as default user$/) do login_page = LoginPage.new($TC.instance) user = $TC.username pass = $TC.password login_page.login user, passend
Then(/^I do see application main page$/) do landing_page = LandingPage.new($TC.instance) assert landing_page.has_selector?( landing_page.left_menu.type, landing_page.left_menu.value)end
Given /^that I login as a new user$/ do visit $base_url fill_in 'membername', :with => $in_hash['new_user'] $session_user = $in_hash['new_user'] fill_in 'password', :with => 'password' click_on('Enter') Capybara.default_wait_time = 3 begin fill_in 'adminpw', :with => 'password' click_button('Sign In') rescue print "No Admin password requered\n" end Capybara.default_wait_time = 30 $main_browser_handle = page.driver.browser.window_handleend
Wstęp
Mamy problem?
A tymczasem w kodzie...
Jak organizować testy automatyczne?
Przykład
Podsumowanie
Duplikacja kodu towróg automatyzacji!
Istnieją efektywne sposoby jej minimalizacji!
Nigdy nie jest za późnożeby zacząć!
?
Dziękuję!