Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

TEST WELL 2014 6 MAR 2014 GRZEGORZ GAŁĘZOWSKI MOTOROLA SOLUTIONS.

Podobne prezentacje


Prezentacja na temat: "TEST WELL 2014 6 MAR 2014 GRZEGORZ GAŁĘZOWSKI MOTOROLA SOLUTIONS."— Zapis prezentacji:

1 TEST WELL MAR 2014 GRZEGORZ GAŁĘZOWSKI MOTOROLA SOLUTIONS

2 NIE ROZWIĄZUJ W TESTACHNIE ROZWIĄZUJ W TESTACH JEDNOSTKOWYCH PROBLEMÓW Z TESTOWANYM KODEM NIE ROZWIĄZUJ W TESTACHNIE ROZWIĄZUJ W TESTACH JEDNOSTKOWYCH PROBLEMÓW Z TESTOWANYM KODEM

3 BĘDZIE O... TESTACH JEDNOSTKOWYCH I PROJEKTOWANIU ORAZ ICH ZWIĄZKU NA 5 PRZYKŁADACH

4

5 TESTY W MOIM ŚWIECIE...

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Ś

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

13 METODY SETUP [SetUp] public void SetTheStage() { this.valueUsedEverywhere = 12; }

14 DZIEDZICZENIE KLAS [TestFixture] public class AuthorizationBehaviors : TestBase

15 METODY POMOCNICZE message = createMessageFor("Ala");

16

17 JAKOŚĆ JEDNOSTKI: SPÓJNOŚĆ I POWIĄZANIA

18 SPÓJNOŚĆ ~ JEDNA RZECZ A A B B C C D D

19 A A B B C C D D

20 A A B B C C D D

21 POWIĄZANIA – KOGO KLASA ZNA? A A B B C C D D

22 MOCKI – "SYMULATORY" OBIEKTÓW A A TEST

23 SPÓJNOŚĆ I POWIĄZANIA A TESTY

24 TEST JEDNOSTKOWY TO KLIENT KODU Jednostka Klient Test

25 ŹLE ZAPROJEKTOWANA JEDNOSTKA... Jednostka Klient Test

26 ...JEST TRUDNO TESTOWALNA Jednostka Klient Test

27 SŁUCHAJ ŚLEPO SWOICH TESTÓW

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

30 UWAGA! ZŁY KOD!

31 PRZYKŁAD 1: NACHODZENIE ZAKRESU TESTÓW

32 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.Name = "$"; info.Surname = "Kowalski"; info.Age = VALID_AGE; Assert.Throws ( () => validation.Of(info) );

34 validation = new SanityValidation(); info = new PersonInfo(); info.Name = "Zenek"; info.Surname = "$"; info.Age = VALID_AGE; Assert.Throws ( () => validation.Of(info) );

35 validation = new SanityValidation(); info = new PersonInfo(); info.Name = "Zenek"; info.Surname = "Kowalski"; info.Age = VALID_AGE – 1; Assert.Throws ( () => validation.Of(info) );

36 PÓKI CO... NameSurnameAge

37 UTRZYMYWALNOŚĆ NameSurnameAgeCountry

38 NameSurnameAgeCountry UTRZYMYWALNOŚĆ Wskazówka: Nachodzenie na siebie zakresów testów. 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 ( () => validation.Of(info) );

40 NADPISZ JEDNO POLE˝ - OK, ALE... validation = new SanityValidation(); info = CreateValidPersonInfo(); info.Name = CreateInvalidName(); Assert.Throws ( () => validation.Of(info) ); Wskazówka: Testy różnych zachowań padają z tego samego powodu Wskazówka: Testy różnych zachowań padają z tego samego powodu

41 MAŁA SPÓJNOŚĆ SanityValidation Walidacja Surname Walidacja Age Testy Surname Testy Age Of(x) Testy Name Walidacja Name Walidacja Surname Walidacja Age

42 ZACHOWANIA SOBIE PRZESZKADZAJĄ SanityValidation Walidacja Name Walidacja Surname Walidacja Age Testy Surname Testy Age Of(x) Testy Name

43 ZACHOWANIA SOBIE PRZESZKADZAJĄ SanityValidation Walidacja Surname Walidacja Age Testy Age Of() Testy Name Walidacja Name Walidacja Surname Walidacja Age Testy Surname

44 ZACHOWANIA SOBIE PRZESZKADZAJĄ SanityValidation Walidacja Surname Walidacja Age Testy Surname Of(x) Testy Name Walidacja Name Walidacja Surname Walidacja Age Testy Age

45 PODZIAŁ LEPSZA SPOJNOSĆ PartialValidations Walidacja Name Walidacja Surname Walidacja Age SanityValidation Of(x) PersonInfo

46 UWSPÓLNIENIE SanityValidation PartialValidations Walidacja Napisu Walidacja Minimum Of(x) PersonInfo

47 MAMY DANE I FUNKCJĘ SanityValidation PartialValidations Walidacja Napisu Walidacja Minimum Of(x) PersonInfo

48 LEPSZA ABSTRAKCJA Person Validate() PartialValidations Walidacja Napisu Walidacja Minimum PersonInfo

49 TEST PERSON: UŻYWA WALIDACJI? Person Validate() PersonInfo Test Validate() Partial Validations Mock

50 TESTY WALIDACJI NAPISU PartialValidations Walidacja Napisu Walidacja Minimum Testy Napisu Testy Minimum

51 TEST WALIDACJI MINIMUM Validations Walidacja Minimum Testy Minimum Walidacja Napisu Testy Napisu

52 PRZYKŁAD 2: KOMBINACJE FUNKCJONALNOŚCI

53 var processing = new MessageProcessing(); messageProcessing.Encryption = true; messageProcessing.Translation = true; messageProcessing.Compression = true; processing.For(message);...

54 var processing = new MessageProcessing(); messageProcessing.Encryption = true; messageProcessing.Translation = true; messageProcessing.Compression = true; processing.For(message);... Wskazówka: Eksplozja Kombinacji 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 Walidacja Surname Walidacja Age For(msg) Encryption Translation Compression

58 PODZIAŁ OBIEKTÓW MessageProcessing For(msg) Encryption Translation Compression

59 WYŁĄCZANIE TRANSFORMACJI MessageProcessing For(msg) NullEncryption Translation Compression

60 TEST PRZETWARZANIA - LEPIEJ, ALE... MessageProcessing For(msg) (1) (2) (3)

61 TEST PRZETWARZANIA - LEPIEJ, ALE... MessageProcessing For(msg) Wskazówka: Dużo różnych mocków na test Wskazówka: Dużo różnych mocków na test

62 WSPÓLNY MIANOWNIK... MessageProcessing Encryption Translation Compression For(msg)

63 PODZIAŁ OBIEKTÓW MessageProcessing For(m) Encryption Translation Compression Transformation

64 TEST PRZETWARZANIA – JESZCZE RAZ MessageProcessing For(m)

65 PRZYKŁAD 3: ŁAŃCUCHY ZALEŻNOŚCI

66 MOCKI - LEGENDA Utworzenie: mock = Substitute.For () Zaprogramowanie rezultatu wywołanie metody: mock.GetSomething().Returns(something);

67 system = Substitute.For (); radio = Substitute.For (); owner = Substitute.For (); system.GetRadio(1).Returns(radio); radio.GetOwner().Returns(owner); owner.GetName().Returns(name);

68 ZESTAWIANIE ŁAŃCUCHA MOCKÓW Test Name

69 WSZYSTKO WIDOCZNE PUBLICZNIE System Radio Owner Name Klient

70 PROBLEM Z ZALEŻNOŚCIAMI System Radio Owner Name Klient

71 PROBLEM Z ZALEŻNOŚCIAMI System Radio Owner Name Klient Wskazówka: mocki zwracające mocki Wskazówka: mocki zwracające mocki

72 NAJPROSTSZE ROZWIĄZANIE System Radio Owner RadioOwnerName Klient

73 ŁATWIEJSZE TESTY RadioOwnerName Klient

74 PRZYKŁAD 4: MUSZĘ TESTOWAĆ PRYWATNE METODY

75 Obiekt D() B() C() A() - CHCĘ TESTOWAĆ PRYWATNĄ METODĘ

76 - ZRÓB TO PRZEZ PUBLICZNE API Test Obiekt B() C() A() D()

77 - ALE ONA JEST NA TYLE ODRĘBNA... Test 2 Obiekt B() C() A() D()

78 ... ŻE CHCĘ JĄ TESTOWAĆ OSOBNO. Test 2 Obiekt B() C() A() D() Wskazówka: Chęć testowania prywatnych metod Wskazówka: Chęć testowania prywatnych metod

79 - TO JĄ WYDZIEL! Test 2 Obiekt B() C() A() Inny Obiekt Inny Obiekt D()

80 PRZYKŁAD 5: CIĘŻKI KONTEKST

81 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 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 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 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. iProtect Classification: Public

86 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 (); var translation = Substitute.For (); var compression = Substitute.For (); var processing = new MessageProcessing( encryption, translation, compression );

88 LEPIEJ, ALE... var encryption = Substitute.For (); var translation = Substitute.For (); var compression = Substitute.For (); var processing = new MessageProcessing( encryption, translation, compression ); Wskazówka: Dużo różnych mocków na test Wskazówka: Dużo różnych mocków na test

89 var transformations = new[] { Substitute.For (); }; 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) throw new InvalidValueException(); if(info.Age < VALID_AGE) throw new InvalidValueException(); }

91 var v = Substitute.For (); var info = Any.Instance (); 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 privateObject = new PrivateObject(inbound); var frame = (Frame)privateObject.Invoke("ParseInput", bytes); Assert.AreEqual(12, frame.Field1);

93 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 Wskazówka: testowanie prywatnych metod

94 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()) ).Do(() => { messageCount++; if(messageCount > 100) throw new CountExceededException(); Thread.Sleep(1000); });

97 mock.When(m => m.Process(WithAnyMessage()) ).Do(() => { messageCount++; if(messageCount > 100) throw new CountExceededException(); Thread.Sleep(1000); }); Wskazówka: "inteligentne" mocki Wskazówka: "inteligentne" mocki


Pobierz ppt "TEST WELL 2014 6 MAR 2014 GRZEGORZ GAŁĘZOWSKI MOTOROLA SOLUTIONS."

Podobne prezentacje


Reklamy Google