testy jednostokowe
TRANSCRIPT
AgendaAgenda
Trochę teoriTrochę teori Co testować?Co testować? Frameworki testowe: PHPUnitFrameworki testowe: PHPUnit Programowanie sterowane testamiProgramowanie sterowane testami Jak zapewnić jakość testówJak zapewnić jakość testów
Testy jednostkowe def.Testy jednostkowe def.
Test jednostkowyTest jednostkowy jest fragmentem jest fragmentem kodu, sprawdzającym inny fragment kodu, sprawdzającym inny fragment kodu. kodu.
Po co pisać testy jednostkowe?Po co pisać testy jednostkowe?
Znajdź błędy nim one znajdą ciebieZnajdź błędy nim one znajdą ciebie Bezproblemowy refactoringBezproblemowy refactoring Praca w grupiePraca w grupie DokumentacjaDokumentacja Redukcja kosztówRedukcja kosztów Wyższa jakość koduWyższa jakość kodu
Znajdź błędy nim one znajdą Znajdź błędy nim one znajdą ciebieciebie
Bezproblemowy refactoringBezproblemowy refactoring
RefaktoryzacjaRefaktoryzacja - proces wprowadzania - proces wprowadzania zmian w programie, w wyniku którego zmian w programie, w wyniku którego nie zmienia się funkcjonalnośćnie zmienia się funkcjonalność
Bezproblemowy refactoringBezproblemowy refactoring
Test: źle Test: dobrze
Napisz test
Napisz kod
Praca w grupiePraca w grupie
DokumentacjaDokumentacja
testBalanceIsInitiallyZero() testBalanceIsInitiallyZero() testBalanceCannotBecomeNegative() testBalanceCannotBecomeNegative()
Redukcja kosztówRedukcja kosztów
FazaFaza KosztKoszt
AnalizaAnaliza 1zł1zł
ProjektProjekt 5zł5zł
KodowanieKodowanie 10zł10zł
Testy jednostkoweTesty jednostkowe 15zł15zł
Testy integracyjneTesty integracyjne 22zł22zł
Testy akceptacyjneTesty akceptacyjne 50zł50zł
Po wdrożeniuPo wdrożeniu >100zł>100zł
Redukcja kosztówRedukcja kosztów
FazaFaza KosztKoszt
AnalizaAnaliza 6 min6 min
ProjektProjekt 0,5 h0,5 h
KodowanieKodowanie 1h1h
Testy jednostkoweTesty jednostkowe 1,5h1,5h
Testy integracyjneTesty integracyjne 2,2 h2,2 h
Testy akceptacyjneTesty akceptacyjne 5 h5 h
Po wdrożeniuPo wdrożeniu > 10 h> 10 h
Wyższa jakość koduWyższa jakość kodu
If it ain't broke, you'reIf it ain't broke, you're not trying hard enough.not trying hard enough.
googletesting.blogspot.com
Co testować?Co testować?
Wartości spodziewane Wartości spodziewane Wartości brzegoweWartości brzegowe Wymusić wystąpienie błęduWymusić wystąpienie błędu
CelCel
Automatyzacja testówAutomatyzacja testów Łatwe uruchomianie pewnego Łatwe uruchomianie pewnego
zakresu testówzakresu testów Porządek w testachPorządek w testach Raporty dotyczące wynikówRaporty dotyczące wyników
CelCel
Automatyzacja testówAutomatyzacja testów Łatwe uruchomianie pewnego Łatwe uruchomianie pewnego
zakresu testówzakresu testów Porządek w testachPorządek w testach Raporty dotyczące wynikówRaporty dotyczące wyników
Rozwiązanie: Framework
PHPUnitPHPUnitFrameworkFramework
Frameworki testowe: PHPUnitFrameworki testowe: PHPUnit
Przypadki testowe (test case)Przypadki testowe (test case) setUp() i tearDown()setUp() i tearDown() Zestawy testów (test suite)Zestawy testów (test suite) Niekompletne i opuszczone testyNiekompletne i opuszczone testy Obiekty współpracująceObiekty współpracujące
Przypadki testowePrzypadki testowe
pobierzSaldo() pobierzSaldo() ustalSaldo($saldo) ustalSaldo($saldo) wplataKwoty($kwota)wplataKwoty($kwota) wyplataKwoty($kwota)wyplataKwoty($kwota)
KontoBankowe
Przypadki testowePrzypadki testowe
Początkowy stan konta musi być Początkowy stan konta musi być zerowyzerowy
Stan konta nigdy nie może być ujemnyStan konta nigdy nie może być ujemny
Warunki
Przypadki testowePrzypadki testowe
Asercje w PHPUnitAsercje w PHPUnit
assertEquals($expected, $actual, $message)assertEquals($expected, $actual, $message)
assertNull($object, $message)assertNull($object, $message) assertTrue($condition, $message)assertTrue($condition, $message) assertFlase($condition, $message)assertFlase($condition, $message) assertContains($needle, $haystack, $message)assertContains($needle, $haystack, $message)
Spodziewany wynikDziałania
Wartość będąca wynikiemrzeczywisty, pozyskanym podczas testu
Przypadki testowePrzypadki testowe
Przypadki testowePrzypadki testowe
Przypadki testowePrzypadki testowe
Przypadki testowePrzypadki testowe
Przypadki testowePrzypadki testowe
setUp() i tearDown()setUp() i tearDown()
setUp() i tearDown()setUp() i tearDown()
Zestawy testów: test suiteZestawy testów: test suite
Niekompletne testyNiekompletne testy
Niekompletne testyNiekompletne testy
Niekompletne testyNiekompletne testy
Test: źleTest: dobrze ??
Niekompletne testyNiekompletne testy
Opuszczone testyOpuszczone testy
Opuszczone testyOpuszczone testy
Obiekty współpracująceObiekty współpracujące
potrzebuję tylko żeby ten obiekt pomocniczy istniał (Dummy)
potrzebuję żeby obiekt pomocniczy coś mi dał (Stub)
potrzebuje sprawdzić czy testowany kod wywołuje odpowiednie metody obiektu pomocniczego (Mock)
Programowanie sterowane testamiProgramowanie sterowane testami
Pochodzenie: XP, AgilePochodzenie: XP, Agile Najpierw test, potem kodNajpierw test, potem kod Każda linia kodu jest wymuszona, przez Każda linia kodu jest wymuszona, przez
niedziałający testniedziałający test Minimalna ilość potrzebnego koduMinimalna ilość potrzebnego kodu 100% pokrycia kodu (code coverage)100% pokrycia kodu (code coverage)
Programowanie sterowane testamiProgramowanie sterowane testami
TEST
CODE
REFACTOR
Programowanie sterowane testamiProgramowanie sterowane testami
Jak zapewnić jakość testówJak zapewnić jakość testów
Proste testyProste testy fundament i absolutne minimumfundament i absolutne minimum
Code coverageCode coverage proste w użyciuproste w użyciu daje niezłe rozeznanie, choć czasem daje niezłe rozeznanie, choć czasem
kłamiekłamie
Code coverageCode coverage
Które fragmentu kodu zostały Które fragmentu kodu zostały wykonane podczas testówwykonane podczas testów
Nie mówi nic o jakości produktu, mówi Nie mówi nic o jakości produktu, mówi o jakości testówo jakości testów
Umożliwia ustalenie minimalnego Umożliwia ustalenie minimalnego wymaganego procentowego pokrycia wymaganego procentowego pokrycia kodukodu
Statements/line coverageStatements/line coverage
które linie kodu zostały wykonaneif (warunek) {...}
Nie ważne, że będziemy mieli test tylko dla warunku == true i tak dostaniemy 100% pokrycia
Code coverage - PHPUnitCode coverage - PHPUnit
Code coverage - PHPUnitCode coverage - PHPUnit