Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałMalwina Bobiński Został zmieniony 10 lat temu
1
TEST WELL 2014 GRZEGORZ GAŁĘZOWSKI MOTOROLA SOLUTIONS 6 MAR 2014 1
Title Page Option 3 Solid-colored Background Date/location information is Arial16pt. Headline copy is Arial Bold 54pt in all caps. Use Paragraph Line Spacing Multiple of 0.8 with 0pt spacing before and after. Presenter information is Arial Bold 18pt in all caps. The Paragraph Line Spacing is Exactly 0.9pt with 0pt spacing before and after. Background can be changed to any color is white. GRZEGORZ GAŁĘZOWSKI MOTOROLA SOLUTIONS 1
2
NIE ROZWIĄZUJ W TESTACH JEDNOSTKOWYCH PROBLEMÓW Z TESTOWANYM KODEM
Title Page Option 3 Solid-colored Background Date/location information is Arial16pt. Headline copy is Arial Bold 54pt in all caps. Use Paragraph Line Spacing Multiple of 0.8 with 0pt spacing before and after. Presenter information is Arial Bold 18pt in all caps. The Paragraph Line Spacing is Exactly 0.9pt with 0pt spacing before and after. Background can be changed to any color is white. GRZEGORZ GAŁĘZOWSKI MOTOROLA SOLUTIONS 2
3
BĘDZIE O... TESTACH JEDNOSTKOWYCH I PROJEKTOWANIU ORAZ ICH ZWIĄZKU
NA 5 PRZYKŁADACH Agenda Slide Example Note: All slide titles in deck are 44pt BOLD ALL CAPS Arial, Subject Titles 24pt Bold ALL CAPS, Arial. Title color should be consistent with color in presentation. To change title colors you will need to do so in Slide Master view. Images can be swapped out using any of the new brand imagery at go to page 21 for instructions on sizing/modifying. Image for agenda can have three sided bleed.
5
TESTY W MOIM ŚWIECIE... Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation. 5
6
Lista TODO Czy zaimplementowałem wszystko?
7
Analiza Czy wiem, co buduję?
8
Wykonywalna dokumentacja
Czego "klient" może od kodu oczekiwać?
9
Projektowanie Jak rozbić problem?
10
TESTY JEDNOSTKOWE DAWNIEJ I DZIŚ
Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation. 10
11
"the tests must be kept to the same level of high quality as the production code. (...) Duplication must be eliminated from them." Robert C. Martin
12
ROZWIĄZANIA NA POZIOMIE AUTOMATYZACJI
Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation. 12
13
Metody SetUp [SetUp] public void SetTheStage() { this.valueUsedEverywhere = 12; }
14
Dziedziczenie Klas [TestFixture] public class AuthorizationBehaviors : TestBase
15
Metody pomocnicze message = createMessageFor("Ala");
17
JAKOŚĆ JEDNOSTKI: SPÓJNOŚĆ I POWIĄZANIA
Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation. 17
18
Spójność ~ jednA rzecz A B C D
19
Spójność ~ jedna rzecz B A C D
20
Spójność ~ jedna rzecz B A C D
21
Powiązania – kogo klasa zna?
B C D
22
Mocki – "symulatory" obiektów
TEST
23
SPÓJNOŚĆ I POWIĄZANIA a testy
Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation. 23
24
Test jednostkowy to klient kodu
Jednostka Test Test Test Test
25
Źle zaprojektowana jednostka...
Test Klient Test Test Jednostka Test Test Test Test
26
...jest trudno testowalna
Klient Test Test Jednostka Test Test Test Test
27
SŁUCHAJ ŚLEPO SWOICH TESTÓW
Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation. 27
28
Korzyści z ˶słuchania testów˝
Lepszy design produktu większa spójność mniej powiązań Lepsza utrzymywalność testów
29
PIĘĆ PRZYKŁADÓW 29 Section Slide Example – No Image, Solid Color
TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation. 29
30
UWAGA! ZŁY KOD!
31
Przykład 1: nachodzenie zakresu testów
Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation. 31
32
validation = new SanityValidation(); info = new PersonInfo(); info
validation = new SanityValidation(); info = new PersonInfo(); info.Name = "Zenek"; info.Surname = "Kowalski"; info.Age = VALID_AGE; Assert.DoesNotThrow( () => validation.Of(info) );
33
validation = new SanityValidation(); info = new PersonInfo(); info
validation = new SanityValidation(); info = new PersonInfo(); info.Name = "$"; info.Surname = "Kowalski"; info.Age = VALID_AGE; Assert.Throws<InvalidValueException>( () => validation.Of(info) );
34
validation = new SanityValidation(); info = new PersonInfo(); info
validation = new SanityValidation(); info = new PersonInfo(); info.Name = "Zenek"; info.Surname = "$"; info.Age = VALID_AGE; Assert.Throws<InvalidValueException>( () => validation.Of(info) );
35
validation = new SanityValidation(); info = new PersonInfo(); info
validation = new SanityValidation(); info = new PersonInfo(); info.Name = "Zenek"; info.Surname = "Kowalski"; info.Age = VALID_AGE – 1; Assert.Throws<InvalidValueException>( () => validation.Of(info) );
36
Póki co... Name Surname Age
37
Utrzymywalność Name Surname Age Country
38
Nachodzenie na siebie zakresów testów.
Utrzymywalność Name Surname Age Country Wskazówka: Nachodzenie na siebie zakresów testów.
39
˶Nadpisz jedno pole˝ - OK, ale...
validation = new SanityValidation(); info = CreateValidPersonInfo(); info.Name = CreateInvalidName(); Assert.Throws<InvalidValueException>( () => validation.Of(info) );
40
˶Nadpisz jedno pole˝ - OK, ale...
validation = new SanityValidation(); info = CreateValidPersonInfo(); info.Name = CreateInvalidName(); Assert.Throws<InvalidValueException>( () => validation.Of(info) ); Wskazówka: Testy różnych zachowań padają z tego samego powodu
41
SanityValidation mała spójność Testy Name Of(x) Walidacja Name
Testy Surname Walidacja Surname Walidacja Surname Testy Age Walidacja Age Walidacja Age
42
zachowania sobie przeszkadzają
SanityValidation Testy Name Of(x) Walidacja Name Testy Surname Walidacja Surname Testy Age Walidacja Age
43
zachowania sobie przeszkadzają
SanityValidation Testy Name Of() Walidacja Name Testy Surname Walidacja Surname Walidacja Surname Testy Age Walidacja Age Walidacja Age
44
zachowania sobie przeszkadzają
SanityValidation Testy Name Of(x) Walidacja Name Testy Surname Walidacja Surname Walidacja Surname Testy Age Walidacja Age Walidacja Age
45
Podział lepsza spojnosć
SanityValidation PartialValidations Of(x) Walidacja Name Walidacja Surname PersonInfo Walidacja Age
46
Uwspólnienie SanityValidation PartialValidations Of(x)
Walidacja Napisu PersonInfo Walidacja Minimum
47
Mamy dane i funkcję SanityValidation PartialValidations Of(x)
Walidacja Napisu PersonInfo Walidacja Minimum
48
lepsza abstrakcja Person PartialValidations Validate()
Walidacja Napisu PersonInfo Walidacja Minimum
49
Test Person: używa walidacji?
Test Validate() Validate() PersonInfo Partial Validations Mock
50
Testy walidacji napisu
PartialValidations Testy Napisu Walidacja Napisu Testy Minimum Walidacja Minimum
51
Test walidacji minimum
Validations Testy Napisu Walidacja Napisu Testy Minimum Walidacja Minimum
52
Przykład 2: kombinacje funkcjonalności
Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation. 52
53
var processing = new MessageProcessing(); messageProcessing
var processing = new MessageProcessing(); messageProcessing.Encryption = true; messageProcessing.Translation = true; messageProcessing.Compression = true; processing.For(message); ...
54
Wskazówka: Eksplozja Kombinacji
var processing = new MessageProcessing(); messageProcessing.Encryption = true; messageProcessing.Translation = true; messageProcessing.Compression = true; processing.For(message); ... Wskazówka: Eksplozja Kombinacji
55
[TestCase(true, true, true)] public void ShouldProcessMessage(
bool encrypt, bool translate, bool compress) { processing = new MessageProcessing(); processing.Encryption = encrypt; processing.Translation = translate; processing.Compression = compress; //...
56
[TestCase(true , true , true )] [TestCase(false, true , true )] [TestCase(true , false, true )] [TestCase(true , true , false)] [TestCase(false, false, true )] [TestCase(true , false, false)] [TestCase(false, true , false)] [TestCase(false, false, false)] public void ShouldProcessMessage( bool encrypt, bool translate, bool compress)
57
Zbyt wiele odpowiedzialności
MessageProcessing For(msg) Encryption Translation Walidacja Surname Compression Walidacja Age
58
Podział obiektów Encryption For(msg) Translation Compression
MessageProcessing For(msg) Encryption Translation Compression
59
Wyłączanie transformacji
MessageProcessing For(msg) NullEncryption Translation Compression
60
Test przetwarzania - lepiej, ale...
MessageProcessing (1) For(msg) (2) (3)
61
Test przetwarzania - lepiej, ale...
MessageProcessing For(msg) Wskazówka: Dużo różnych mocków na test
62
Wspólny mianownik... Encryption For(msg) Translation Compression
MessageProcessing For(msg) Encryption Translation Compression
63
Podział obiektów Transformation Transformation For(m) Transformation
MessageProcessing Transformation Transformation For(m) Transformation Translation Encryption Compression
64
Test Przetwarzania – jeszcze raz
MessageProcessing For(m)
65
Przykład 3: łańcuchy zależności
Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation. 65
66
Mocki - legenda Utworzenie: mock = Substitute.For<Interface>() Zaprogramowanie rezultatu wywołanie metody: mock.GetSomething().Returns(something);
67
system = Substitute. For<System>(); radio = Substitute
system = Substitute.For<System>(); radio = Substitute.For<Radio>(); owner = Substitute.For<User>(); system.GetRadio(1).Returns(radio); radio.GetOwner().Returns(owner); owner.GetName().Returns(name); struktura odzwierciedla świat rzeczywisty. Nawigowanie po łańcuchu może prowadzić do problemów. Zamiast tego mogę próbować to przykryć fasadą. problem z enkapsulacją. Pokazać poprawny przykład. Zmienić zamiast danych zwraca boola?
68
Zestawianie łańcucha mocków
Test Name
69
Wszystko widoczne publicznie
Klient System Radio Owner Name
70
Problem z zależnościami
Klient System Radio Owner Name
71
Problem z zależnościami
Klient System Radio Wskazówka: mocki zwracające mocki Owner Name
72
najprostsze Rozwiązanie
Klient System Radio Owner RadioOwnerName
73
Łatwiejsze testy Klient RadioOwnerName
74
Przykład 4: muszę testować prywatne metody
Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation. 74
75
- Chcę testować prywatną metodę
Obiekt A() B() D() C()
76
- Zrób to przez publiczne API
Test Obiekt A() B() D() C()
77
- Ale ona jest na tyle odrębna...
Test 2 Obiekt A() B() D() C()
78
... że chcę ją testować osobno.
Obiekt A() Wskazówka: Chęć testowania prywatnych metod B() D() C()
79
- To ją wydziel! Test 2 Obiekt Inny Obiekt A() B() D() C()
80
Przykład 5: ciężki kontekst
Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation. 80
81
configData = new ConfigData(); configData. GetHeader()
configData = new ConfigData(); configData.GetHeader().SetStdState(StdState.SUBMITTED); configData.GetHeader().SetType(FileType.NECB); ge1 = CreateGroupEntry(1, TALKGROUP, null, configData.Id); ge2 = CreateGroupEntry(2, TALKGROUP, null, configData.Id); ge3 = CreateGroupEntry(3, MULTIGROUP, null, configData.Id); ge4 = CreateGroupEntry(4, MULTIGROUP, null, configData.Id); ge5 = CreateGroupEntry(5, MULTIGROUP, null, configData.Id); talkgroup1 = CreateTalkgroup(1, 1, null, configData.Id); talkgroup2 = CreateTalkgroup(1, 3, null, configData.Id); talkgroup3 = CreateTalkgroup(2, 0, null, configData.Id); talkgroup4 = CreateTalkgroup(3, 5, null, configData.Id); context = new ValidationObjectContext(configData);
82
pracochłonne ustawianie kontekstu
configData = new ConfigData(); configData.GetHeader().SetStdState(StdState.SUBMITTED); configData.GetHeader().SetType(FileType.NECB); ge1 = CreateGroupEntry(1, TALKGROUP, null, configData.Id); ge2 = CreateGroupEntry(2, TALKGROUP, null, configData.Id); ge3 = CreateGroupEntry(3, MULTIGROUP, null, configData.Id); ge4 = CreateGroupEntry(4, MULTIGROUP, null, configData.Id); ge5 = CreateGroupEntry(5, MULTIGROUP, null, configData.Id); talkgroup1 = CreateTalkgroup(1, 1, null, configData.Id); talkgroup2 = CreateTalkgroup(1, 3, null, configData.Id); talkgroup3 = CreateTalkgroup(2, 0, null, configData.Id); talkgroup4 = CreateTalkgroup(3, 5, null, configData.Id); context = new ValidationObjectContext(configData); Wskazówka: pracochłonne ustawianie kontekstu
83
wnioski Słuchaj ślepo swoich testów Uważaj na:
eksplozje kombinacji długie testy testowanie prywatnych metod mocki zwracające mocki ciężki kontekst Szukaj najpierw źródła problemu w designie
84
pytania? Słuchaj ślepo swoich testów Uważaj na:
eksplozje kombinacji długie testy testowanie prywatnych metod mocki zwracające mocki ciężki kontekst Szukaj najpierw źródła problemu w designie
85
85 Thank you or Q&A wrap up slide example. Font arial 80pt.
Legal disclaimer bottom of page arial 8pt font with I Protect iProtect Classification: Public MOTOROLA, MOTO, MOTOROLA SOLUTIONS and the Stylized M Logo are trademarks or registered trademarks of Motorola Trademark Holdings, LLC and are used under license. All other trademarks are the property of their respective owners. © 2010 Motorola, Inc. All rights reserved. 85
86
Tests As Design Rot Radar
Synaesthesia S. Freeman, N. Pryce Test Reflexology A. Kolsky, S. Bain Tests As Design Rot Radar J. Grenning
87
Lepiej, ale... var encryption = Substitute.For<Encryption>(); var translation = Substitute.For<Translation>(); var compression = Substitute.For<Compression>(); var processing = new MessageProcessing( encryption, translation, compression );
88
Dużo różnych mocków na test
Lepiej, ale... var encryption = Substitute.For<Encryption>(); var translation = Substitute.For<Translation>(); var compression = Substitute.For<Compression>(); var processing = new MessageProcessing( encryption, translation, compression ); Wskazówka: Dużo różnych mocków na test
89
var transformations = new[] { Substitute
var transformations = new[] { Substitute.For<Transformation>(); }; var processing = new MessageProcessing( transformations );
90
Co testy próbują powiedzieć?
public bool Of(PersonInfo info) { if(info.Name == null) throw new InvalidValueException(); if(info.Surname == null) if(info.Age < VALID_AGE) }
91
var v = Substitute. For<Validation>(); var info = Any
var v = Substitute.For<Validation>(); var info = Any.Instance<PersonInfo>(); var person = new Person(info); person.ValidateUsing(v); v.Received().OfString(info.Name); v.Received().OfString(info.Surname); v.Received().OfMin(VALID_AGE, info.Age);
92
var inbound = new InboundMessaging(
var inbound = new InboundMessaging(...); var privateObject = new PrivateObject(inbound); var frame = (Frame)privateObject .Invoke("ParseInput", bytes); Assert.AreEqual(12, frame.Field1); Rozwiązanie 1: testuj przez publiczne API.
93
testowanie prywatnych metod
var inbound = new InboundMessaging(...); var privateObject = new PrivateObject(inbound); var frame = (Frame)privateObject .Invoke("ParseInput", bytes); Assert.AreEqual(12, frame.Field1); Wskazówka: testowanie prywatnych metod
94
var parsing = new InboundParsing(. ); var frame = parsing
var parsing = new InboundParsing(...); var frame = parsing.Of(bytes); Assert.AreEqual(12, frame.Field1);
95
Przykład: Inteligentne Mocki
96
mock. When(m => m. Process(WithAnyMessage()) )
mock.When(m => m.Process(WithAnyMessage()) ).Do(() => { messageCount++; if(messageCount > 100) throw new CountExceededException(); Thread.Sleep(1000); }); TODO zastąpić pseudokodem
97
Wskazówka: "inteligentne" mocki
mock.When(m => m.Process(WithAnyMessage()) ).Do(() => { messageCount++; if(messageCount > 100) throw new CountExceededException(); Thread.Sleep(1000); }); Wskazówka: "inteligentne" mocki
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.