Technologia programowania

Podobne dokumenty
Projektowanie obiektowe oprogramowania Wykład 4 - SOLID GRASP Wiktor Zychla 2012

Wykład 4. Projektowanie. MIS n Inżynieria oprogramowania Październik 2014

METODY PROGRAMOWANIA

Programowanie poprzez testy z wykorzystaniem JUnit

Testowanie jednostkowe. Jacek Starzyński, ZETiIS PW

Programowanie zespołowe

LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8

Metodyki zwinne wytwarzania oprogramowania

Wprowadzenie do testów jednostkowych. Marcin Dziedzic, Wiktor Żołnowski

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Projektowanie obiektowe oprogramowania Wykład 3 - SOLID GRASP Wiktor Zychla 2016

Wykład 5. Inżynieria oprogramowania MIS s MIO s MIS n Listopad 2014

Testowanie. Ryszard Beczek & Piotr Miłkowski 1 04/11/07

JUnit TESTY JEDNOSTKOWE. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Zasady projektowania obiektowego

Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0 Zofia Kruczkiewicz

Technologia Programowania 2016/2017 Wykład 5

Projektowanie obiektowe oprogramowania Wykład 3 - SOLID GRASP Wiktor Zychla 2017

Polimorfizm. dr Jarosław Skaruz

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Testowanie aplikacji mobilnych na platformie Android - architektura, wzorce, praktyki i narzędzia

TESTOWANIE OPROGRAMOWANIA

Programowanie Zespołowe

Projektowanie obiektowe oprogramowania Wykład 3 - SOLID GRASP Wiktor Zychla 2018

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Platformy Technologiczne

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

Metodyki zwinne wytwarzania oprogramowania

Testowanie II. Cel zajęć. Pokrycie kodu

SOLIDnie śmierdzący kod.

Dokumentacja do API Javy.

Wskazówki projektowe. Programowanie Obiektowe Mateusz Cicheński

Automatyzacja testowania oprogramowania. Automatyzacja testowania oprogramowania 1/36

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Technologie i usługi internetowe cz. 2

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

NAJLEPSZE STRATEGIE SKUTECZNYCH PROGRAMISTÓW. TECHNIKI PRACY Z KODEM KOD: NSKOD

Testowanie aplikacji Java Servlets

Programowanie obiektowe

Testowanie i logowanie. 1. Testowanie aplikacji JUnit. 2. Tworzenie logów: pakiet java.util.logging.

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Technologia Programowania 2016/2017 Wykład 4

WYKORZYSTANIE JĘZYKA GROOVY W TESTACH JEDNOSTKOWYCH, INTEGRACYJNYCH I AUTOMATYCZNYCH. Mirosław Gołda, Programista Java

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Modelowanie i Programowanie Obiektowe

Programowanie zorientowane obiektowo. Mateusz Kołecki

Iteracyjno-rozwojowy proces tworzenia oprogramowania Wykład 3 część 1

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Podstawy Programowania Obiektowego

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie Komputerów

METODY PROGRAMOWANIA

Programowanie obiektowe

Program szkolenia: Wzorce projektowe i ich implementacja w C# oraz testowanie automatyczne

Dziedziczenie. dr Jarosław Skaruz

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

1. Robert C. Martin: Clean Code: A Handbook of Agile Software Craftsmanship (Czysty Kod: Podręcznik Dobrego Programisty)

Programowanie obiektowe

Wprowadzenie do zasad SOLID - czyli jak pisać SOLIDny kod

Całościowe podejście do testowania automatycznego dla programistów. (TDD, BDD, Spec. by Example, wzorce, narzędzia)

Testy automatyczne. Korzystające z junit

Weryfikacja i walidacja. Metody testowania systemów informatycznych

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Podstawy i języki programowania

Paweł Rajba

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015

Dziedziczenie. » Dodawanie nowych elementów klasy (składowych funkcyjnych, danych składowych)» Modyfikacje odziedziczonych składowych funkcyjnych

Metody Metody, parametry, zwracanie wartości

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

PHP 5 język obiektowy

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Podstawy Języka Java

Techniki projektowania wzorce projektowe

Programowanie obiektowe

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

Początki Javy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 8

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Programowanie kontraktowe w Javie

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

Definiowanie własnych klas

Programowanie w języku Java WYKŁAD

Przykład -

Programowanie obiektowe

Sexy unit testy. czyli o kilku praktykach w testach jednostkowych

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Laboratorium 10 Testy jednostkowe z użyciem narzędzia JUnit

Klasy abstrakcyjne i interfejsy

Programowanie 2. Język C++. Wykład 3.

Wprowadzenie do Behaviordriven

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków


Aplikacje w środowisku Java

Programowanie obiektowe - 1.

Co jeszcze mogą nam dać adnotacje? Adam Warski

Transkrypt:

Testowanie/GRASP 23 października 2018

Testy jednostkowe Testy jednostkowe (unit tests) Test jednostkowy to kod, który ma na celu zapewnić, że inny kod działa poprawnie. Główna idea: najpierw test, potem implementacja, czyli: trochę testowania, trochę implementacji. Stosowane sa podczas tworzenia zgodnie z metodyka Test-driven development. Korzyści: błędy znajdowane sa wcześniej, mniej debuggowania, kod jest bardziej stabilny i czytelny.

Testy jednostkowe >>

Testy jednostkowe Kiedy pisać? W najbardziej skomplikowanych i krytycznych częściach kodu. Nie ma sensu tworzyć testów dla trywialnego kodu. Dobry zestaw testów zapobiega błędom podczas tworzenia nowych funkcjonalności. Gdy kod nie ma pokrycia testami, warto zaczać od takiego kodu, w którym jest duże prawdopodobieństwo wystapienia błędów. Przykład Largest method

Główne klasy Klasy pakietu junit.framework 1 Assert - zawiera metody asercji. 2 TestCase- definiuje elementy do wywoływnia wielu testów (metody: setup, teardown). 3 TestResult - przechowuje rezultaty wykonywania testów. 4 TestSuite - wywołuje wiele klas testowych: @RunWith(Suite.class), @Suite.SuiteClasses.

Klasa Assert Podstawowe metody 1 // Check that two objects are equal 2 assertequals ( str1, str2 ); 3 // Check that a condition is true 4 asserttrue ( val1 < val2 ); 5 // Check that a condition is false 6 assertfalse ( val1 > val2 ); 7 // Check that an object isn 't null 8 assertnotnull ( str1 ); 9 // Check that an object is null 10 assertnull ( str3 ); 11 // Check if two references point to the same object 12 assertsame ( str4, str5 ); 13 // Check if two references not point to the same object 14 assertnotsame ( str1, str3 ); 15 // Check whether two arrays are equal to each other. 16 assertarrayequals ( expectedarray, resultarray ); Przykład UnitTesting->TestAssertion

Klasa TestCase Podstawowe metody 1 public class JUnitTestCase extends TestCase { 2 3 public void setup () { 4 } 5 6 @Test 7 public void testadd () { 8 } 9 10 public void teardown ( ) { 11 } 12 } Przykład UnitTesting->JUnitTestCase

Klasa TestResult Podstawowe metody 1 Result result = JUnitCore. runclasses ( JUnit. class ); 2 for ( Failure failure : result. getfailures ()) { 3 System. out. println ( failure. tostring ()); 4 } 5 System. out. println ( result. wassuccessful ()); Przykład UnitTesting->TestRunner

JUnit Annotations Podstawowe adnotacje 1 public class JUnitAnnotation { 2 3 @BeforeClass 4 public static void beforeclass () { 5 } 6 @AfterClass 7 public static void afterclass () { 8 } 9 @Before 10 public void before () { 11 } 12 @After 13 public void after () { 14 } 15 @Test 16 public void test () { 17 } 18 @Ignore 19 public void ignoretest () { 20 } 21 }

JUnit Annotations Przykład UnitTesting->JUnitAnnotation UnitTesting->JUnitAnnotationExample UnitTesting->JUnitException

Klasa TestSuite Podstawowe metody 1 @RunWith ( Suite. class ) 2 @Suite. SuiteClasses ({ 3 TestAssertions. class, 4 JunitAnnotation. class, 5 TestJunit. class 6 }) 7 8 public class TestSuite { 9 } Przykład UnitTesting->TestSuite

Obiekty imitacji Obiekty imitacji (Moking objects) Mocking to technika testowania charakteryzujaca sie tym, że rzeczywiste obiekty zastapione sa ich imitacja z predefiniowanym zachowaniem. Obiekt imitacyjny to obiekt, który dla określonego wejścia ma zdefiniowane określone wyjście bez podejmowania określonych akcji. Przykład JUnitMockCalculation JUnitWithMockito

Obiekty imitacji Kiedy stosować? Do testowania komponentów, które zależa od komponentów jeszcze nie zaimplementowanych. Gdy rzeczywiste komponenty działaja zbyt powoli. Gdy infrastuktura (a raczej jej brak) uniemożliwia rzeczywiste testowanie. Mockito-tutorial https://examples.javacodegeeks.com/core-java/mockito/mockitotutorial-beginners/

Zasady GRASP Expert Creator Low Coupling High Cohesion Polymorphism Indirection Pure Fabrication Protected Variations Controller

Expert >> Product Description -zna cenę produktu za sztukę SalesLineItem-zna liczbę sztuk danego produku Sale - zna zakupione produkty Która klasa powinna wyliczać całkowita kwotę sprzedaży?

Expert - czyli ten, który wie, co robi Przydziel zobowiazanie ekspertowi: klasie, która ma informacje konieczne do jego realizacji. Gdy informacja jest rozproszona po różnych klasach konieczna może być współpraca ekspertów. Zysk: wspiera hermetyzację i równomierny podział odpowiedzialności, lżejsze i czytelniejsze klasy.

Expert - rozwi zanie >>

Creator >> Kto powinien być odpowiedzialny za utworznie nowej instancji klasy SalesLineItem?

Creator Nowa instancję A powinna tworzyć klasa B, która: Posiada, pamięta lub bezpośrednio używa A Posiada dane inicjalizujace dla A Gdy wiele klas spełnia warunki, wybierz B zawierajace A Zysk: mniejsza liczba powiazań, kod łatwy w utrzymaniu.

Creator - rozwi zanie >>

Sprz»enie (ang. Coupling) Zależności między klasami: atrybuty, argumenty metod, wywołania metod, dziedziczenie... Sprzężenie - miara określajaca w jakim stopniu dana klasa jest zależna od innych klas Problemy z wysokim sprzężeniem klasy A: zmiany w innych klasach wymuszaja zmiany w A trudno jest zrozumieć klasę A w izolacji trudno jest powtórnie użyć klasę A, bo potrzebne sa też obiekty z nia powiazane.

Niskie sprz»enie (Low Coupling) Jak lepiej powiazać instancje klas Payment i Sales? >>

Niskie sprz»enie (Low Coupling) >>

Niskie sprz»enie - zasady Oceniajac różne możliwości przydzielaj metody tak, aby ograniczać sprzężenie między klasami. Zysk: łatwiejsze ponowne wykorzystanie kodu, ograniczenie zasięgu zmian. Pewnien stopień powiazania jest nieunikniony, bo obiekty musza się komunikować.

Spójno± (ang. Cohesion) Spójność - miara określajaca w jakim stopniu metody klasy sa do siebie podobne i ze soba powiazane (tzn. podobna funkcjonalność i stopień ogólności) Niska spójność powoduje, że: trudno zrozumieć kod i cel istnienia klasy trudno jest klasę utrzymywać, rozwijać i ponownie wykorzystywać.

Jak oceni spójno±? Bardzo niska spójność - bardzo dużo zadań w różnych obszarach funkcjonalnych (np. klasa odpowiada za logikę i za interakcję z baza danych) Niska spójność - wiele bardzo różnych zadań w jednym obszarze funkcjonalnym (np. jedna klasa w pełni odpowiada za interakcję z baza danych) Wysoka spójność - mała liczba podobnych zobowiazań w ustalonym obszarze funkcjonalnym (np. grupa klas realizuje obsługę bazy danych)

Spójno± >>

High Cohesion - zasada ewaluacyjna Oceniajac różne możliwości przydzielaj metody tak, aby spójność pozostała wysoka Zysk: łatwy w utrzymaniu kod High Cohesion = Low Coupling

Pure Fabrication - czysty wymysª Problem: ograniczenie się w modelu projektowym do obiektów z modelu dziedziny może prowadzić do niskiej spójności i wysokiego sprzężenia. Pomysł: wymyśl klasę pomocnicza spoza modelu dziedziny i przydziel jej odpowienie zobowiazania. Przykład: gdy każda klasa odpowiada za swój zapis do bazy danych to występuje wysokie sprzężenie i niska spójność. Stwórzmy więc specjalne klasy do obsługi bazy danych.

Indirection - czyli po±rednictwo Unikaj bezpośrednich powiazań do elementów niestabilnych. W razie potrzeby wykorzystaj obiekt pośredniczacy. >>

Polymorphism Polimorfizm - oznacza nadanie tej samej nazwy metodom różnych klas, gdy metody sa ze soba powiazane. overriding - klasy maja wspólny interfejs lub nadklasę, ale maja taka sama sygnaturę. overloading - metody maja taka sama nazwę, ale w zależności od sygnatury moga mieć inny kod.

Polimorfizm - przykªad >> Sale będzie musiała wyliczyć podatek przy użyciu zewnętrznego kalkulatora podatków Kalkulatorów jest dużo - maja różne interfejsy Jaki obiekt powinien odpowiadać za ich obsługę?

Polimorfizm - przykªad >> Zobowiazanie ma postać polimorficznej metody gettaxes Zasada ogólna: użyj polimorfizmu jeśli metoda zależy od typu (zamiast if-then-else)

Protected Variations Jak projektować system by był odporny na zmiany i łatwo rozszerzalny? Zasada ogólna: rozpoznawaj miejsca, w których zmiany moga się pojawić i otaczaj je stabilnym interfejsem. Przykład: kalkulator podatków jest punktem zmienności (prawo się zmienia, wielu usługodawców, różne API)

Protected Variations Open/close principle - klasy powinny być otwarte na rozszerzenia i zamknięte na modyfikacje. Law of Demeter czyli: nie rozmawiaj z obcymi. Programowanie refleksyjne

Protected Variations - przykład Kiepsko - co jeśli trzeba dodać kolejny kształt? 1 public class Rectangle { 2 public double Length ; 3 public double Width ; 4 } 5 public class Circle { 6 public double Radius ; 7 } 8 public double Area ( object [] shapes ) 9 { 10 double area = 0; 11 for ( Object shape in shapes ) 12 { 13 if ( shape instanceof Rectangle ) 14 { 15 Rectangle rectangle = ( Rectangle ) shape ; 16 area += rectangle. Width * rectangle. Height ; 17 } 18 else 19 { 20 Circle circle = ( Circle ) shape ; 21 area += circle. Radius * circle. Radius * Math. PI ; 22 } 23 } 24 return area ; 25 }

Protected Variations - przykład Lepiej - Klas nie trzeba modyfikować, ale można dodać inne 1 public class Rectangle { 2 public double Length ; 3 public double Width ; 4 public double Area () 5 { 6 return Width * Height ; 7 } 8 } 9 10 public class Circle { 11 public double Radius ; 12 public double Area () 13 { 14 return Radius * Radius * Math. PI ; 15 } 16 } 17 18 public double Area ( Shape [] shapes ) 19 { 20 double area = 0; 21 for ( Shape shapeinstance in shapes ) 22 { 23 area += shapeinstance. Area (); 24 } 25 return area ; 26 }

Law of Demeter Klasa może wysłać komunikat do: Obiektu this metody parametru obiektu utworzonego wewnatrz metody Źle 1 AccountHolder holder = 2 sale. getpayment (). getaccount (). getaccountholder (); Dobrze 1 AccountHolder holder = 2 sale. getaccountholderofpayment ();

Programowanie refleksyjne Wybór i wiazanie obiektów w czasie wykonywania progamu Bez refleksji 1 Foo foo = new Foo (); 2 foo. hello (); Z użyciem refleksji 1 Class c = Class. forname (" Foo " ); 2 Method m = c. getmethod (" hello " ); 3 m. invoke (c. newinstance ());

SOLID Single Responsibility Open - close principle Liskov substitution Interface segregation Dependancy inversion

Dependancy inversion - klasyczna architektura warstwowa Uzależniać klasy od abstrakcji a nie od konkretnych klas. Warstwa to grupa pakietów o podobnym zakresie odpowiedzialności. Warstwy układaja się tak, aby wyższe wywoływały usługi niższych, a niższe nie zależały od wyższych. >>

Dependancy inversion - odwrócenie klasycznych zale»no±ci Wyższe warstwy zależa od interfejsów a nie od wartw niższych. >>

Inne wa»ne zasady KISS - Keep it Simple, Stupid YAGNI - You Ain t Gonna Need it DRY - Don t Repeat Yourself.