37
Więcej testów/ /mniej kodu Jak zapewnić/poprawić utrzymywalność testów automatycznych Michał Gaworski

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

  • Upload
    kraqa

  • View
    2.003

  • Download
    1

Embed Size (px)

Citation preview

Page 1: 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

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

Wstęp

Mamy problem?

A tymczasem w kodzie...

Jak organizować testy automatyczne?

Przykład

Podsumowanie

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

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

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

Wstęp

Mamy problem?

A tymczasem w kodzie...

Jak organizować testy automatyczne?

Przykład

Podsumowanie

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

Po czym poznać, że automatyzacja

testów w projekcie dostała zadyszki?

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

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

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

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

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

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)

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

Duplikacja kodu jest wrogiem numer jeden

w walce outrzymywalność kodu

testowego

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

OSOBLIWOŚĆ (testowanie): jest wtedy, gdy 100% czasu zespołu automatyzującego

pochłania samo utrzymanie istniejących testów

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

Wstęp

Mamy problem?

A tymczasem w kodzie...

Jak organizować testy automatyczne?

Przykład

Podsumowanie

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

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)

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

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!

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

Skąd się bierze duplikacja kodu???

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

Ułuda posiadania frameworka

Biblioteki podpięte pod projectto jeszcze nie framework

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

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

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

Testy = skrypty

Proof of Concept, który rozrasta się w niekontrolowany sposób w projekt

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

Brak "czytelnej" treści testów

Zamiast sprawdzić, czy nie należy modyfikować istniejących testów prościej

jest napisac nowe

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

. . .

@Test public void shouldLayeredTransformationReturnInnerNodesOnlyWhenInvokedFromDispatcher()

@Test public void shouldLTransformationReturnInNodesTransformedWhenInvokedFromDispatcherWithTransform()

@Test public void shouldLTransformationReturnInNodesPreTransformedWhenInvokedFromDispatcherWithTransformAndSourceInactive()

. . .

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

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

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

Wstęp

Mamy problem?

A tymczasem w kodzie...

Jak organizować testy automatyczne?

Przykład

Podsumowanie

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

Minimalizujmy ilość kodu, maksymalizując ilość testów!

Zasada “punktu docelowego” (Point of Interest)

Jednoznaczna organizacjaWarstwy: Test -> DSL -> Implementacja

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

“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.

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

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

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

Warstwy: Test + DSL + Implementacja

Test – opis zrozumiały dla człowiekaDSL – model wyrażony językiem domeny

Implementacja – oparta o “Points of Interest”

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

Wstęp

Mamy problem?

A tymczasem w kodzie...

Jak organizować testy automatyczne?

Przykład

Podsumowanie

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

100 testów = 13 sposobów odwołania się do pola

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

Przykład

Page Object pattern

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

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

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

@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

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

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

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

Wstęp

Mamy problem?

A tymczasem w kodzie...

Jak organizować testy automatyczne?

Przykład

Podsumowanie

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

Duplikacja kodu towróg automatyzacji!

Istnieją efektywne sposoby jej minimalizacji!

Nigdy nie jest za późnożeby zacząć!

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

?

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

Dziękuję!