testy jednostokowe

Post on 26-May-2015

1.181 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Testy jednostowe

Hubert Marzec (hubert@dzbanyit.pl)

www.dzbanyit.pl

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

Pytania, uwagi ?Pytania, uwagi ?

Hubert Marzec (hubert@dzbanyit.pl)

www.dzbanyit.pl

top related