SlideShare a Scribd company logo
TESTY JEDNOSTKOWE WPROWADZENIE
mkawczynski@astek.pl
2
Index
co na dziś
● idea, definicja
● przykłady
● środowiska uruchomieniowe
● benefity, czym testy nie są
● test doubles
● co i jak testować
● tdd
● rzeczywistość
3
● ojciec, mąż, programista
● full stack, team leader
● zarządzanie dokumentacją medyczną,
integrację, BPM, obiegi dokumentów,
energetyka, innowacje
● javascript, java
Kim jestem?
Marek Kawczyński mkawczynski@astek.pl
4
Idea
Po co nam to?
The idea behind unit tests is simple: it is to make sure the
class(/function, files) you are working on right now works
correctly – to make sure it does its job. This concerns
whether, given certain input data, it will respond with a
certain expected output, or whether, fed with nonsense
data, it will throw an appropriate exception, and so on. The
idea, then, is to write tests that will verify this expected
behaviour.
“Practical Unit Testing with TestNG and Mockito” Tomek Kaczanowski
5
Definicja
Test jednostkowy
Test jednostkowy (ang. unit test) – metoda testowania
tworzonego oprogramowania poprzez wykonywanie
testów weryfikujących poprawność działania
pojedynczych elementów (jednostek) programu – np.
metod lub obiektów w programowaniu obiektowym lub
procedur w programowaniu proceduralnym.
WIKI
6
● skupiają się na pojedynczej klasie, funkcji
● w pełni kontrolują środowisko w jakim
nasz funkcja lub klasa jest testowana
● nie interesuje ich użytkownik końcowy
systemu, warstwy systemu czy też zasoby
- są niezależne
● wykonują się bardzo szybko, i są
uruchamiane często
● Istnieją po to aby zweryfikować czy nasz
kod działa
Definicja
istnienie, lokalizacja
7
Innymi słowy
Piszemy kod do testowania naszego kodu. :)
8
9
Przykład
Test jednostkowy
import expect from 'expect';
import Optional from '../../../src/share/utils/Optional' ;
describe('#Optional', () => {
it('isPresent should return true if value is present' , () => {
expect(Optional(1).isPresent()).toEqual(true);
});
});
10
● Oszczędność czasu podczas programowania
Benefity
$$
11
● Oszczędność czasu podczas programowania
● Głębsze zrozumienie aktualnego problemu
Benefity
$$
12
● Oszczędność czasu podczas programowania
● Głębsze zrozumienie aktualnego problemu
● Bezpieczna refaktoryzacja
Benefity
$$
13
● Oszczędność czasu podczas programowania
● Głębsze zrozumienie aktualnego problemu
● Bezpieczna refaktoryzacja
● Bycie lepszym człowiekiem :)
Benefity
$$
14
● Zabezpieczeniem przed bugami
Czym nie są testy jednostkowe
W mojej prywatnej opinii
15
● Zabezpieczeniem przed bugami
● Religią
Czym nie są testy jednostkowe
W mojej prywatnej opinii
16
● Zabezpieczeniem przed bugami
● Religią
● Dokumentacją
Czym nie są testy jednostkowe
W mojej prywatnej opinii
17
Środowisko uruchomieniowe
Jak zacząć? Co wybrać? Jak uruchamiać?
WIKI
18
19
Metody/obiekty symulujące
rzeczywiste zachowanie
metod/obiektów, w
kontrolowany sposób.
Test doubles
Co to jest?
20
Używamy gdy
chcemy zastąpić
funkcję/obiekt
jakąś “lekką”
implementacją.
Fake object
Co to jest?
const store = {
storage: {},
get: function () {
return this.storage[name]
},
set: function (name, value) {
this.storage[name] = value
}
}
21
Używamy gdy
chcemy sprawdzić
czy nasza
zależność została
“wykorzystana”.
Spies
Co to jest?
const onChangeSpy = sinon.spy();
<DateInput onChange={onChangeSpy} />
assertTrue(onChangeSpy.called);
assertTrue(onChangeSpy.calledOnce);
assertTrue(onChangeSpy
.getCall(0)
.args[0]
.value instanceof Date);
22
Używamy gdy
chcemy mieć
pewność do tego
co nasza zależność
zwraca.
Stubs
Co to jest?
onTypeChange(){
const {loadItems, type} = this.props;
loadItems(type);
}
const props = {
loadItems: sinon.stub()
}
props.loadItems.withArgs(0).returns([]);
props.loadItems.withArgs(1).returns([
{name: 'item 1'}, {name: 'item 2'}
]);
23
Stub + Spy
Mocks
Co to jest?
const service = {
getAll: () => [],
process: item => { }
};
const mock = sinon.mock(service);
mock.expects('getAll').once().returns([
{ item: 1 }, { item: 2 }
]);
mock.expects('process').twice().withArgs(1, 2);
<EventPanel service={mock} />
mock.verify();
24
● Proste funkcje
Co i jak testować?
W mojej prywatnej opinii
function Optional(value) {
return {
or: orValue => isDefined(value) ? value :
orValue,
isPresent: () => isDefined(value)
};
}
25
● Proste funkcje
● Publiczne funkcje, api
Co i jak testować?
W mojej prywatnej opinii
/*utils.js*/
export function addToCurrentMonth (amount) {
return amount + getCurrentMonth ();
}
function getCurrentMonth () {
return new Date().getMonth();
}
26
● Proste funkcje
● Publiczne funkcje, api
● To co uważam za słuszne!
Co i jak testować?
W mojej prywatnej opinii
27
● Proste funkcje
● Publiczne funkcje, api
● To co uważam za słuszne!
● Wyjście, zachowanie
Co i jak testować?
W mojej prywatnej opinii
28
● Proste funkcje
● Publiczne funkcje, api
● To co uważam za słuszne!
● Wartości brzegowe
Co i jak testować?
W mojej prywatnej opinii
29
● Proste funkcje
● Publiczne funkcje, api
● To co uważam za słuszne!
● Wartości brzegowe
● Wartości problematyczne
Co i jak testować?
W mojej prywatnej opinii
it('isPresent should return false if value
is undefined' , () => {
expect(Optional(void 0).isPresent())
.toEqual(false);
});
it('isPresent should return false if value
is null', () => {
expect(Optional(null).isPresent())
.toEqual(false);
});
30
● Proste funkcje
● Publiczne funkcje, api
● To co uważam za słuszne!
● Wartości brzegowe
● Wartości problematyczne
● Nie przepisuj testowanego
kodu!
Co i jak testować?
W mojej prywatnej opinii
export function toDate(date) {
return moment(date, 'YYYY-MM-DD', true);
}
it('should parse date' , () => {
const actual = toDate('2011-01-01');
const expected = moment('2011-01-01',
'YYYY-MM-DD',
true
);
assert(actual).toEqual(expected);
});
31
● Proste funkcje
● Publiczne funkcje, api
● To co uważam za słuszne!
● Wartości brzegowe
● Wartości problematyczne
● Nie przepisuj testowanego
kodu!
● Pisz testowalny kod
Co i jak testować?
W mojej prywatnej opinii
export function toDate() {
const $input = $('input.date');
return moment($input.val(),
'YYYY-MM-DD',
true
);
}
32
TDD
Po co nam to?
Technika tworzenia oprogramowania, zaliczana do metodyk zwinnych.
Pierwotnie była częścią programowania ekstremalnego (ang. extreme
programming), lecz obecnie stanowi samodzielną technikę. Polega na
wielokrotnym powtarzaniu kilku kroków:
● Najpierw programista pisze automatyczny test sprawdzający dodawaną
funkcjonalność. Test w tym momencie nie powinien się udać.
● Później następuje implementacja funkcjonalności. W tym momencie
wcześniej napisany test powinien się udać.
● W ostatnim kroku programista dokonuje refaktoryzacji napisanego kodu,
żeby spełniał on oczekiwane standardy.
WIKI
33
TDD
Po co nam to?
34
TDD
Plusy
● nastawienie się na dobry design api naszych klas/metod
● 100% pokrycia testami
● wzrasta pewność zespołu
● brak strachu przed refaktoryzacją
● przyśpieszenie developmentu
WIKI
35
TDD
Minusy
● Wymagana dobra znajomość dziedzinowa
● Łatwo utknąć w martwy punkcie
● Pisanie testów do rzeczy, które są na etapie refaktoryzacji usuwane
WIKI
36
TDD
Kiedy idea się nie sprawdzi?
function compareTo(firstTeam, secondTeam) {
if (firstTeam.getGamesWon() > secondTeam.getGamesWon()) {
return 1;
}
else if (firstTeam.getGamesWon() < secondTeam.getGamesWon()) {
return -1;
}
return 0;
}
37
● Test coverage
Rzeczywistość
Jak to jest w prawdziwym życiu
38
● Test coverage
● Dobre praktyki: nowy bug = nowy test
Rzeczywistość
Jak to jest w prawdziwym życiu
39
● Test coverage
● Dobre praktyki: nowy bug = nowy test
● Testujemy tylko proste rzeczy
Rzeczywistość
Jak to jest w prawdziwym życiu
40
● Test coverage
● Dobre praktyki - nowy bug = nowy test
● Testujemy tylko proste rzeczy
● Testujemy po fakcie kod innych
developerów
Rzeczywistość
Jak to jest w prawdziwym życiu
41
● Test coverage
● Dobre praktyki - nowy bug = nowy test
● Testujemy tylko proste rzeczy
● Testujemy po fakcie kod innych
developerów
● wszystko jest mockiem :)
Rzeczywistość
Jak to jest w prawdziwym życiu
42
● Test coverage
● Dobre praktyki - nowy bug = nowy test
● Testujemy tylko proste rzeczy
● Testujemy po fakcie kod innych
developerów
● wszystko jest mockiem :)
● Piszemy nie testowalny kod
Rzeczywistość
Jak to jest w prawdziwym życiu
Dziękujemy :)
mkawczynski@astek.pl

More Related Content

Similar to 4Developers 2018: Unit testing - introduction (Marek Kawczyński)

Confitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ AllegroConfitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ Allegro
allegro.tech
 
SkładQA 2018 - Daniel Dec
SkładQA 2018 - Daniel DecSkładQA 2018 - Daniel Dec
SkładQA 2018 - Daniel Dec
kraqa
 
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
Future Processing
 
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
kraqa
 
Agile LEGO Game
Agile LEGO GameAgile LEGO Game
Agile LEGO Game
Marcin Niebudek
 
Girls in IT - QA
Girls in IT - QA Girls in IT - QA
Girls in IT - QA
monterail
 
Refaktoryzacja
RefaktoryzacjaRefaktoryzacja
Refaktoryzacja
PHPstokPHPstok
 
Spotkanie #1 - Inauguracja
Spotkanie #1 - InauguracjaSpotkanie #1 - Inauguracja
Spotkanie #1 - Inauguracja
Damian Melniczuk
 
7 competences workshop - 22.06 at Spartez
7 competences workshop - 22.06 at Spartez7 competences workshop - 22.06 at Spartez
7 competences workshop - 22.06 at Spartez
Anna Brzezińska
 
university day 1
university day 1university day 1
university day 1
Sławomir Borowiec
 
Architektura to nie bzdura
Architektura to nie bzduraArchitektura to nie bzdura
Architektura to nie bzdura
Pawel Szulc
 
Testy Jednostokowe
Testy  JednostokoweTesty  Jednostokowe
Testy Jednostokowehugoamv
 
Getting Things Programmed
Getting Things ProgrammedGetting Things Programmed
Getting Things Programmed
Michał Bartyzel
 
Podstawy testowania oprogramowania INCO 2023.pptx
Podstawy testowania oprogramowania INCO 2023.pptxPodstawy testowania oprogramowania INCO 2023.pptx
Podstawy testowania oprogramowania INCO 2023.pptx
Katarzyna Javaheri-Szpak
 
Agile & Scrum podstawy
Agile & Scrum podstawyAgile & Scrum podstawy
Agile & Scrum podstawy
Mateusz Żeromski
 
Wiosenne Wieczory ze Scrum 2 Estymacja i Planowanie
Wiosenne Wieczory ze Scrum 2 Estymacja i PlanowanieWiosenne Wieczory ze Scrum 2 Estymacja i Planowanie
Wiosenne Wieczory ze Scrum 2 Estymacja i Planowanie
Michał Parkoła
 
JAK TESTOWAĆ CZYSTY KOD JAVASCRIPT?
JAK TESTOWAĆ CZYSTY KOD JAVASCRIPT?JAK TESTOWAĆ CZYSTY KOD JAVASCRIPT?
JAK TESTOWAĆ CZYSTY KOD JAVASCRIPT?
Piotr Nalepa
 
Edukacja testerska na Quality in IT
Edukacja testerska na Quality in ITEdukacja testerska na Quality in IT
Edukacja testerska na Quality in IT
Radoslaw Smilgin
 
Testy jednostkowe - PHPUnit
Testy jednostkowe - PHPUnitTesty jednostkowe - PHPUnit
Testy jednostkowe - PHPUnit
PHPstokPHPstok
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów Sparkowych
Marcin Jasiński
 

Similar to 4Developers 2018: Unit testing - introduction (Marek Kawczyński) (20)

Confitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ AllegroConfitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ Allegro
 
SkładQA 2018 - Daniel Dec
SkładQA 2018 - Daniel DecSkładQA 2018 - Daniel Dec
SkładQA 2018 - Daniel Dec
 
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
 
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
 
Agile LEGO Game
Agile LEGO GameAgile LEGO Game
Agile LEGO Game
 
Girls in IT - QA
Girls in IT - QA Girls in IT - QA
Girls in IT - QA
 
Refaktoryzacja
RefaktoryzacjaRefaktoryzacja
Refaktoryzacja
 
Spotkanie #1 - Inauguracja
Spotkanie #1 - InauguracjaSpotkanie #1 - Inauguracja
Spotkanie #1 - Inauguracja
 
7 competences workshop - 22.06 at Spartez
7 competences workshop - 22.06 at Spartez7 competences workshop - 22.06 at Spartez
7 competences workshop - 22.06 at Spartez
 
university day 1
university day 1university day 1
university day 1
 
Architektura to nie bzdura
Architektura to nie bzduraArchitektura to nie bzdura
Architektura to nie bzdura
 
Testy Jednostokowe
Testy  JednostokoweTesty  Jednostokowe
Testy Jednostokowe
 
Getting Things Programmed
Getting Things ProgrammedGetting Things Programmed
Getting Things Programmed
 
Podstawy testowania oprogramowania INCO 2023.pptx
Podstawy testowania oprogramowania INCO 2023.pptxPodstawy testowania oprogramowania INCO 2023.pptx
Podstawy testowania oprogramowania INCO 2023.pptx
 
Agile & Scrum podstawy
Agile & Scrum podstawyAgile & Scrum podstawy
Agile & Scrum podstawy
 
Wiosenne Wieczory ze Scrum 2 Estymacja i Planowanie
Wiosenne Wieczory ze Scrum 2 Estymacja i PlanowanieWiosenne Wieczory ze Scrum 2 Estymacja i Planowanie
Wiosenne Wieczory ze Scrum 2 Estymacja i Planowanie
 
JAK TESTOWAĆ CZYSTY KOD JAVASCRIPT?
JAK TESTOWAĆ CZYSTY KOD JAVASCRIPT?JAK TESTOWAĆ CZYSTY KOD JAVASCRIPT?
JAK TESTOWAĆ CZYSTY KOD JAVASCRIPT?
 
Edukacja testerska na Quality in IT
Edukacja testerska na Quality in ITEdukacja testerska na Quality in IT
Edukacja testerska na Quality in IT
 
Testy jednostkowe - PHPUnit
Testy jednostkowe - PHPUnitTesty jednostkowe - PHPUnit
Testy jednostkowe - PHPUnit
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów Sparkowych
 

4Developers 2018: Unit testing - introduction (Marek Kawczyński)

  • 2. 2 Index co na dziś ● idea, definicja ● przykłady ● środowiska uruchomieniowe ● benefity, czym testy nie są ● test doubles ● co i jak testować ● tdd ● rzeczywistość
  • 3. 3 ● ojciec, mąż, programista ● full stack, team leader ● zarządzanie dokumentacją medyczną, integrację, BPM, obiegi dokumentów, energetyka, innowacje ● javascript, java Kim jestem? Marek Kawczyński mkawczynski@astek.pl
  • 4. 4 Idea Po co nam to? The idea behind unit tests is simple: it is to make sure the class(/function, files) you are working on right now works correctly – to make sure it does its job. This concerns whether, given certain input data, it will respond with a certain expected output, or whether, fed with nonsense data, it will throw an appropriate exception, and so on. The idea, then, is to write tests that will verify this expected behaviour. “Practical Unit Testing with TestNG and Mockito” Tomek Kaczanowski
  • 5. 5 Definicja Test jednostkowy Test jednostkowy (ang. unit test) – metoda testowania tworzonego oprogramowania poprzez wykonywanie testów weryfikujących poprawność działania pojedynczych elementów (jednostek) programu – np. metod lub obiektów w programowaniu obiektowym lub procedur w programowaniu proceduralnym. WIKI
  • 6. 6 ● skupiają się na pojedynczej klasie, funkcji ● w pełni kontrolują środowisko w jakim nasz funkcja lub klasa jest testowana ● nie interesuje ich użytkownik końcowy systemu, warstwy systemu czy też zasoby - są niezależne ● wykonują się bardzo szybko, i są uruchamiane często ● Istnieją po to aby zweryfikować czy nasz kod działa Definicja istnienie, lokalizacja
  • 7. 7 Innymi słowy Piszemy kod do testowania naszego kodu. :)
  • 8. 8
  • 9. 9 Przykład Test jednostkowy import expect from 'expect'; import Optional from '../../../src/share/utils/Optional' ; describe('#Optional', () => { it('isPresent should return true if value is present' , () => { expect(Optional(1).isPresent()).toEqual(true); }); });
  • 10. 10 ● Oszczędność czasu podczas programowania Benefity $$
  • 11. 11 ● Oszczędność czasu podczas programowania ● Głębsze zrozumienie aktualnego problemu Benefity $$
  • 12. 12 ● Oszczędność czasu podczas programowania ● Głębsze zrozumienie aktualnego problemu ● Bezpieczna refaktoryzacja Benefity $$
  • 13. 13 ● Oszczędność czasu podczas programowania ● Głębsze zrozumienie aktualnego problemu ● Bezpieczna refaktoryzacja ● Bycie lepszym człowiekiem :) Benefity $$
  • 14. 14 ● Zabezpieczeniem przed bugami Czym nie są testy jednostkowe W mojej prywatnej opinii
  • 15. 15 ● Zabezpieczeniem przed bugami ● Religią Czym nie są testy jednostkowe W mojej prywatnej opinii
  • 16. 16 ● Zabezpieczeniem przed bugami ● Religią ● Dokumentacją Czym nie są testy jednostkowe W mojej prywatnej opinii
  • 17. 17 Środowisko uruchomieniowe Jak zacząć? Co wybrać? Jak uruchamiać? WIKI
  • 18. 18
  • 19. 19 Metody/obiekty symulujące rzeczywiste zachowanie metod/obiektów, w kontrolowany sposób. Test doubles Co to jest?
  • 20. 20 Używamy gdy chcemy zastąpić funkcję/obiekt jakąś “lekką” implementacją. Fake object Co to jest? const store = { storage: {}, get: function () { return this.storage[name] }, set: function (name, value) { this.storage[name] = value } }
  • 21. 21 Używamy gdy chcemy sprawdzić czy nasza zależność została “wykorzystana”. Spies Co to jest? const onChangeSpy = sinon.spy(); <DateInput onChange={onChangeSpy} /> assertTrue(onChangeSpy.called); assertTrue(onChangeSpy.calledOnce); assertTrue(onChangeSpy .getCall(0) .args[0] .value instanceof Date);
  • 22. 22 Używamy gdy chcemy mieć pewność do tego co nasza zależność zwraca. Stubs Co to jest? onTypeChange(){ const {loadItems, type} = this.props; loadItems(type); } const props = { loadItems: sinon.stub() } props.loadItems.withArgs(0).returns([]); props.loadItems.withArgs(1).returns([ {name: 'item 1'}, {name: 'item 2'} ]);
  • 23. 23 Stub + Spy Mocks Co to jest? const service = { getAll: () => [], process: item => { } }; const mock = sinon.mock(service); mock.expects('getAll').once().returns([ { item: 1 }, { item: 2 } ]); mock.expects('process').twice().withArgs(1, 2); <EventPanel service={mock} /> mock.verify();
  • 24. 24 ● Proste funkcje Co i jak testować? W mojej prywatnej opinii function Optional(value) { return { or: orValue => isDefined(value) ? value : orValue, isPresent: () => isDefined(value) }; }
  • 25. 25 ● Proste funkcje ● Publiczne funkcje, api Co i jak testować? W mojej prywatnej opinii /*utils.js*/ export function addToCurrentMonth (amount) { return amount + getCurrentMonth (); } function getCurrentMonth () { return new Date().getMonth(); }
  • 26. 26 ● Proste funkcje ● Publiczne funkcje, api ● To co uważam za słuszne! Co i jak testować? W mojej prywatnej opinii
  • 27. 27 ● Proste funkcje ● Publiczne funkcje, api ● To co uważam za słuszne! ● Wyjście, zachowanie Co i jak testować? W mojej prywatnej opinii
  • 28. 28 ● Proste funkcje ● Publiczne funkcje, api ● To co uważam za słuszne! ● Wartości brzegowe Co i jak testować? W mojej prywatnej opinii
  • 29. 29 ● Proste funkcje ● Publiczne funkcje, api ● To co uważam za słuszne! ● Wartości brzegowe ● Wartości problematyczne Co i jak testować? W mojej prywatnej opinii it('isPresent should return false if value is undefined' , () => { expect(Optional(void 0).isPresent()) .toEqual(false); }); it('isPresent should return false if value is null', () => { expect(Optional(null).isPresent()) .toEqual(false); });
  • 30. 30 ● Proste funkcje ● Publiczne funkcje, api ● To co uważam za słuszne! ● Wartości brzegowe ● Wartości problematyczne ● Nie przepisuj testowanego kodu! Co i jak testować? W mojej prywatnej opinii export function toDate(date) { return moment(date, 'YYYY-MM-DD', true); } it('should parse date' , () => { const actual = toDate('2011-01-01'); const expected = moment('2011-01-01', 'YYYY-MM-DD', true ); assert(actual).toEqual(expected); });
  • 31. 31 ● Proste funkcje ● Publiczne funkcje, api ● To co uważam za słuszne! ● Wartości brzegowe ● Wartości problematyczne ● Nie przepisuj testowanego kodu! ● Pisz testowalny kod Co i jak testować? W mojej prywatnej opinii export function toDate() { const $input = $('input.date'); return moment($input.val(), 'YYYY-MM-DD', true ); }
  • 32. 32 TDD Po co nam to? Technika tworzenia oprogramowania, zaliczana do metodyk zwinnych. Pierwotnie była częścią programowania ekstremalnego (ang. extreme programming), lecz obecnie stanowi samodzielną technikę. Polega na wielokrotnym powtarzaniu kilku kroków: ● Najpierw programista pisze automatyczny test sprawdzający dodawaną funkcjonalność. Test w tym momencie nie powinien się udać. ● Później następuje implementacja funkcjonalności. W tym momencie wcześniej napisany test powinien się udać. ● W ostatnim kroku programista dokonuje refaktoryzacji napisanego kodu, żeby spełniał on oczekiwane standardy. WIKI
  • 34. 34 TDD Plusy ● nastawienie się na dobry design api naszych klas/metod ● 100% pokrycia testami ● wzrasta pewność zespołu ● brak strachu przed refaktoryzacją ● przyśpieszenie developmentu WIKI
  • 35. 35 TDD Minusy ● Wymagana dobra znajomość dziedzinowa ● Łatwo utknąć w martwy punkcie ● Pisanie testów do rzeczy, które są na etapie refaktoryzacji usuwane WIKI
  • 36. 36 TDD Kiedy idea się nie sprawdzi? function compareTo(firstTeam, secondTeam) { if (firstTeam.getGamesWon() > secondTeam.getGamesWon()) { return 1; } else if (firstTeam.getGamesWon() < secondTeam.getGamesWon()) { return -1; } return 0; }
  • 37. 37 ● Test coverage Rzeczywistość Jak to jest w prawdziwym życiu
  • 38. 38 ● Test coverage ● Dobre praktyki: nowy bug = nowy test Rzeczywistość Jak to jest w prawdziwym życiu
  • 39. 39 ● Test coverage ● Dobre praktyki: nowy bug = nowy test ● Testujemy tylko proste rzeczy Rzeczywistość Jak to jest w prawdziwym życiu
  • 40. 40 ● Test coverage ● Dobre praktyki - nowy bug = nowy test ● Testujemy tylko proste rzeczy ● Testujemy po fakcie kod innych developerów Rzeczywistość Jak to jest w prawdziwym życiu
  • 41. 41 ● Test coverage ● Dobre praktyki - nowy bug = nowy test ● Testujemy tylko proste rzeczy ● Testujemy po fakcie kod innych developerów ● wszystko jest mockiem :) Rzeczywistość Jak to jest w prawdziwym życiu
  • 42. 42 ● Test coverage ● Dobre praktyki - nowy bug = nowy test ● Testujemy tylko proste rzeczy ● Testujemy po fakcie kod innych developerów ● wszystko jest mockiem :) ● Piszemy nie testowalny kod Rzeczywistość Jak to jest w prawdziwym życiu