Więcej testów/mniej kodu - Michał Gaworski, kraQA 13

Post on 15-Jan-2017

2.003 views 1 download

Transcript of Więcej testów/mniej kodu - Michał Gaworski, kraQA 13

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ę!