testy dynamiczne uruchamianie programu testy statyczne analiza kodu

Podobne dokumenty
Inżynieria oprogramowania

Wykład 8. Testowanie w JEE 5.0 (1) Autor: Zofia Kruczkiewicz. Zofia Kruczkiewicz

Możliwe strategie tworzenia niezawodnego oprogramowania:

Testowanie oprogramowania. Testowanie oprogramowania 1/34

Porównanie metod i technik testowania oprogramowania. Damian Ryś Maja Wojnarowska

opracowanie Iteracje Rys.1. Przepływ działań w iteracyjno-rozwojowym procesie powstawiania oprogramowania obiektowego udział testowania

Język ludzki kod maszynowy

Projektowanie oprogramowania. Wykład Weryfikacja i Zatwierdzanie Inżynieria Oprogramowania Kazimierz Michalik

Maciej Oleksy Zenon Matuszyk

Wykład 7. Projektowanie kodu oprogramowania

DOKUMENTACJA. Przeznaczenie dokumentacji użytkowej. Użytkownicy końcowi Administratorzy SKŁADNIKI DOKUMENTACJI. Synteza Dokumentacja.

Automatyzacja testowania oprogramowania. Automatyzacja testowania oprogramowania 1/36

Weryfikacja i walidacja. Metody testowania systemów informatycznych

ECDL Podstawy programowania Sylabus - wersja 1.0

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

TEMAT : KLASY DZIEDZICZENIE

Szablony funkcji i szablony klas

TESTOWANIE OPROGRAMOWANIA

Testowanie i walidacja oprogramowania

Zapisywanie algorytmów w języku programowania

Kontrola jakości artefaktów

Liczby losowe i pętla while w języku Python

Podstawy Informatyki. Algorytmy i ich poprawność

Jarosław Kuchta Dokumentacja i Jakość Oprogramowania. Wymagania jakości w Agile Programming

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

Techniki (automatyzacji) projektowania testów. Adam Roman WarszawQA, 24 II 2016

Zasady organizacji projektów informatycznych

4. Funkcje. Przykłady

Wstęp do programowania

Projektowanie klas c.d. Projektowanie klas przykład

Szablony klas, zastosowanie szablonów w programach

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

Kod doskonały : jak tworzyć oprogramowanie pozbawione błędów / Steve McConnell. Gliwice, cop Spis treści. Wstęp 15.

Jakość w procesie wytwarzania oprogramowania

INŻYNIERIA OROGRAMOWANIA TESTOWANIE JEDNOSTKOWE 2015/2016

Testowanie I. Celem zajęć jest zapoznanie studentów z podstawami testowania ze szczególnym uwzględnieniem testowania jednostkowego.

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

3. Podaj elementy składowe jakie powinna uwzględniać definicja informatyki.

12) Wadą modelu kaskadowego jest: Zagadnienia obowiązujące na egzaminie z inżynierii oprogramowania: 13) Wadą modelu opartego na prototypowaniu jest:

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Projektowanie obiektowe oprogramowania Testowanie oprogramowania Wykład 13 Wiktor Zychla 2014

INŻYNIERIA OPROGRAMOWANIA TESTOWANIE SYSTEMOWE

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

lekcja 8a Gry komputerowe MasterMind

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Szkoła programisty PLC : sterowniki przemysłowe / Gilewski Tomasz. Gliwice, cop Spis treści

Testowanie według modelu (MBT) Stowarzyszenie Inżynierii Wymagań wymagania.org.pl

Podstawy programowania w języku C

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Testowanie i walidacja oprogramowania

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Podstawy Programowania Podstawowa składnia języka C++

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Plan testów do Internetowego Serwisu Oferowania i Wyszukiwania Usług Transportowych

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

JAVA W SUPER EXPRESOWEJ PIGUŁCE

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Pytania sprawdzające wiedzę z programowania C++

Efekty uboczne błędów

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Wstęp do programowania

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

Wstęp do Programowania 2

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Podstawy programowania skrót z wykładów:

Programowanie obiektowe

Wprowadzenie do szablonów szablony funkcji

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Wprowadzenie do szablonów szablony funkcji

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Programowanie w języku C++

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Konwerter Plan testów. Jakub Rauch Tomasz Gołębiowski Adam Busch Bartosz Franaszek 1 czerwca 2008

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Testy automatyczne. Korzystające z junit

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

PROJEKTOWANIE. kodowanie implementacja. PROJEKT most pomiędzy specyfikowaniem a kodowaniem

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Podstawy Programowania C++

Lista dwukierunkowa - przykład implementacji destruktorów

Programowanie, algorytmy i struktury danych

Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.

Etapy życia oprogramowania

Programowanie zespołowe

Podstawy programowania

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

Wykład XII. optymalizacja w relacyjnych bazach danych

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Identyfikacje typu na etapie. wykonania (RTTI)

PRZEWODNIK PO PRZEDMIOCIE

Usługa: Audyt kodu źródłowego

Technologie cyfrowe. Artur Kalinowski. Zakład Cząstek i Oddziaływań Fundamentalnych Pasteura 5, pokój 4.15

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Przeciążanie funkcji. Przykład 1: #include <iostream> using namespace std; double srednia(double n1, double n2) { return ((n1 + n2)/2.

Paradygmaty programowania

Transkrypt:

Niezawodność Błąd fault, error, bug Błędne wykonanie failure Czy niezawodność jest ważna? Miary niezawodności: Prawdopodobieństwo błędnego wykonania podczas realizacji transakcji Częstotliwość występowania błędnych wykonań Średni czas pomiędzy błędnymi wykonaniami Dostępność (procent czasu, w którym system jest dostępny) Typowa zależność między gęstością błędów a niezawodnością Gęstość błędów [/1000l] Średni czas pomiędzy błędnymi wykonaniami >30 <2 min 20-30 4-15 min 10-20 5-60 min 5-10 1-4h 2-5 4-24h 1-2 24-160h <1 - Jak poprawiać niezawodność Unikanie błędów Stosowanie warunków poprawności Odporność na błędy Testowanie Wykorzystanie gotowych komponentów Generowanie kodu Testowanie Atestowanie i weryfikacja Atestowanie testowanie zgodności z rzeczywistymi potrzebami użytkowników Weryfikacja testowanie zgodności z wcześniej określonymi wymaganiami Cele testowania: wykrycie i usunięcie błędów w systemie - wykrywanie błędów ocena niezawodności systemu testy statystyczne Testowanie Testy dynamiczne Techniki testowania: testy dynamiczne uruchamianie programu testy statyczne analiza kodu Etapy testowania Testy jednostkowe w modelu kaskadowym wykonywane w fazie implementacji Testy integracyjne Testy systemu Testy akceptacyjne Jak dobrać dane testowe (w tym informacje kontrolne)? Jak określić czy wykonanie jest poprawne? Jak zlokalizować błąd? 1

Jak określić czy wykonanie jest poprawne? Wyrocznia zwykła i odwracająca Sytuacje oczywiste, np. zawieszenie się programu, Porównanie z poprawnymi wynikami - dane z przeszłości, wyniki wyznaczone ręcznie, porównanie z wynikami innych programów (zastosowanie wyroczni) Dane wejściowe Testowany moduł Wyrocznia zwykła Porównanie Ocena Zastosowanie warunków poprawności - ręczne, zautomatyzowane (zewnętrzny lub wewnętrzny kod) Dane wejściowe Powtarzalność wyników Testowany moduł Wyrocznia odwracająca Ocena Wyrocznia oceniająca (stosująca warunki poprawności) Dane wejściowe Testowany moduł Wyrocznia oceniająca Ocena Np. funkcja: Wykorzystanie sytuacji szczególnych I I i+ 1 i cos( x) sin( x) x i= 1 Przyjmie wartość 0 dla x = 0, Π/2, Π... Testy statystyczne Losowy dobór danych testowych z rozkładem prawdopodobieństwa zbliżonym do rzeczywistego Możliwość automatyzacji Wykrywają przyczyny najczęstszych błędnych wykonań Pozwalają na oszacowanie niezawodności oprogramowania! Poprawa niezawodności w testach statystycznych Obserwowana niezawodność Przewidywana niezawodność 200 180 Częstotliwość występowania 160 błędnych wykonań [1/h] 140 120 100 80 60 40 20 0 0 5000 10000 15000 Pożądana Liczba testów Moment osiągnięcia niezawodność pożądanej niezawodności 2

Testy nastawione na wykrywanie błędów Dane testowe dobierane są systematycznie tak, aby maksymalizować szanse na wykrycie nowych błędów Rodzaje: Funkcjonalne Strukturalne Testy funkcjonalne testy czarnej skrzynki testowanie według powinności Dane testowe dobierane są na podstawie analizy specyfikacji oprogramowania Podział danych wejściowych na klasy grupy danych, dla których program działa jakościowo tak samo Testujemy dla kilku przypadków z każdej klasy Testowanie warunków granicznych Testy funkcjonalne - przykład Zamówienia o wartości powyżej 3000 zł są realizowane w trybie przetargu, zamówienia do 3000 zł w trybie zapytania ofertowego Zamówienie o wartości do 3000 zł Zamówienie o wartości dokładnie 3000 zł Zamówienie o wartości powyżej 3000 zł Testy funkcjonalne przykład, c.d. Sprzęt komputerowy jest zawsze kupowany w trybie przetargu sprzęt komputerowy, wartość < 3000, sprzęt komputerowy, wartość = 3000, sprzęt komputerowy, wartość > 3000, inne zakupy, wartość < 3000, inne zakupy, wartość = 3000, inne zakupy, wartość > 3000. Testy funkcjonalne przykład /** Posortowana lista różnych elementów * Dla każdego i, j >= 0 i < size () i < j => (*this) [i] < (*this) [j] */ class TOrderedList : public vector <double> { public: /** Sprawdza czy podany element jest na liście */ bool Exists (double ditem); ; Klasy danych Lista jest pusta Lista nie jest pusta Podany element jest na liście Podanego elementu nie ma na liście 3

Testy funkcjonalne - przykład Funkcja przyjmuje dane w zakresie 1-100. Dla danych spoza tego zakresu zwraca wyjątek Testy strukturalne testy białej/szklanej skrzynki testowanie według implementacji Dane testowe dobierane są na podstawie analizy kodu i dokumentacji technicznej Klasy danych: [1-100] <1 i > 100 Wartości graniczne 1 i 100 Kryterium pokrycia wszystkich instrukcji programu Dobierz zestaw danych testowych tak, aby po wykonaniu wszystkich testów każda instrukcja programu została przynajmniej raz wykonana Kryterium często nie wystarczające: int a; if (W) a = b; c = a; Kryterium pokrycia wszystkich instrukcji programu - przykład TData TerminPlatnosci; if (Faktura.Typ == _MATERIALY) { // W1 TerminPlatnosci = min (DataAktualna + 14, Faktura.TerminPlatnosci); // B1 else { Faktura.Sprzet = true; // B2 if (Faktura.Wartosc > 1000) { // W2 Faktura.OsobaAkceptujaca = Dyrektor; // B3 PrzekazDoAkceptacji (TerminPlatnosci); else { Faktura.Zaakceptowania = true; // B4 Kryterium pokrycia wszystkich instrukcji programu - przykład Kryterium pokrycia wszystkich instrukcji warunkowych W1 Dwie ścieżki, np.: W1-B1-W2-B3 Każda instrukcja warunkowa musi być przynajmniej raz spełniona i raz nie spełniona B1 B3 W2 B2 B4 W1-B2-W2-B4 Zapewniają pokrycie wszystkich instrukcji programu int a; if (W) a = b; c = a; Ta instrukcja musi być raz spełniona i raz nie spełniona 4

Kryterium pokrycia wszystkich warunków elementarnych Każdy warunek elementarny musi być przynajmniej raz spełniony i raz nie spełniony Kryterium pokrycia wszystkich ścieżek w grafie przepływu sterowania programu Należy przejść przez testowany fragment programu wszystkimi możliwymi ścieżkami if ((A > B) && (C == D)) Każdy warunek elementarny (A > B) i (C == D) musi być przynajmniej raz spełniony i raz nie spełniony Kryterium pokrycia wszystkich ścieżek w grafie przepływu sterowania programu Łączenie kryteriów B1 W1 B2 Niezbędne jest pokrycie czterech ścieżek: W1-B1-W2-B3 Jeżeli dana ścieżka jest definiowana przez warunek złożony, np. (A < B) (A > C) W2 W1-B2-W2-B4 W1-B1-W2-B4 to należy przejść tę ścieżkę przy (nie)spełnionym każdym z tych warunków (lub nawet każdej ich B3 B4 W1-B2-W2-B3 kombinacji) while (W) B1; B2 W B1 Testowanie pętli Możliwe ścieżki: W-B2 W-B1-W-B2 W-B1-W-B1-W -B2... W-{B1-W -B2 Testowanie pętli wskazówki szczególne Dobierz dane tak, aby: pętla została wykonana minimalną liczbę razy pętla została wykonana maksymalną liczbę razy pętla została wykonana przeciętną liczbę razy B2 5

Testy strukturalne przykład /** Posortowana lista różnych elementów * Dla każdego i, j >= 0 i < size () i < j => (*this) [i] < (*this) [j] */ class TOrderedList : public vector <double> { public: /** Sprawdza czy podany element jest na liście */ bool Exists (double ditem); ; Jeżeli lista jest pusta to (W1) zwróć FALSE (B1) je żeli podany element jest mniejszy od pierwszego elementu na liście lub większy od ostatniego elementu na liście to (W2) zwróć FALSE (B2) je żeli podany element jest równy pierwszemu lub ostatniemu elementowi na liście to (W 3) zwróć TRUE (B3) rozważaj przedział od pierwszego do ostatniego elementu na liście (B4) powtarzaj, dopóki początek i koniec przedziału nie są odległe o więcej niż 1 (W4) Znajdź element środkowy przedziału pomiędzy (B5) jeżeli podany element jest równy elementowi środkowemu to (W5) zwróć TRUE (B6) jeżeli podany element jest mniejszy od elementu środkowego przedziału to (W6) uczyń element środkowy końcem rozważanego przedziału (B7) w przeciwnym wypadku uczyń element środkowy początkiem rozważanego przedziału (B8) zwróć FALSE (B9) W1 B1 W2 B2 W3 B3 B4 W4 B5 W5 B9 B6 B8 W6 B7 Możliwe ścieżki W1-B1 W1-W2-B2 W1-W2-W3-B3 W1-W2-W3-B4-W4-B9 W1-W2-W3-B4-W4-B5- W5-B6 W1-W2-W3-B4-W4-{B5- W5-W6-B7-W4-B9 W1-W2-W3-B4-W4-{B5- W5-W6-B8-W4-B9 W1-W2-W3-B4-W4-{B5- W5-W6-B8-W4 W4-B5- W5-W6-B8-W4-B5-W5-B6 W1-B1 Pusta lista W1-W2-B2 Lista niepusta. Podany element jest mniejszy od pierwszego elementu na liście lub większy od ostatniego elementu na liście W1-W2-W3-B3 Lista niepusta. Podany element jest równy pierwszemu lub ostatniemu elementowi na liście W1-W2-W3-B4-W4-B9 Lista niepusta o długości 1 lub 2. Podany element jest większy od pierwszego elementu na liście i mniejszy od ostatniego elementu na liście W1-W2-W3-B4-W4-B5-W5-B6 Lista niepusta o długości >= 3. Podany element jest równy środkowemu elementowi listy W1-W2-W3-B4-W4-{B5-W5-W6-B7-W4- B9 W1-W2-W3-B4-W4-{B5-W5-W6-B8-W4- B9 Lista niepusta o długości >= 3. Podanego elementu nie ma na liście W1-W2-W3-B4-W4-{B5-W5-W6-B8-W4 W4-B5-W5-W6-B8-W4-B5-W5-B6 Lista niepusta o długości >= 4. Podany element jest na liście void main () { double a, b, c; cout << "Podaj a: "; cin >> a; cout << "Podaj b: "; cin >> b; cout << "Podaj c: "; cin >> c; double delta = b * b - 4 * a * c; if (delta < 0) cout << "Brak rozwiązań rzeczywistych\n"; else if (delta == 0) { cout << "Rozwiazanie: " << (-b) / (2 * a); cout << '\n'; else { cout << "Rozwiązania: "; cout << (-b - sqrt (delta)) / (2 * a) << " "; cout << (-b + sqrt (delta)) / (2 * a) << '\n'; 6

Testy statyczne Formalne dowody poprawności Nieformalne inspekcje kodu (choć to drugie jest pojęciem szerszym) Dwa sposoby analizy programu Śledzenie przebiegu programu Liniowy przegląd kodu ~150 linii kodu/h Inspekcje kodu są bardzo efektywną formą testowania! Lista kontrolna typowych błędy Błąd zakresu Błędna operacja na zmiennych dynamicznych Błąd w wyrażeniu arytmetycznym/logicznym/znakowym Błąd w instrukcji warunkowej Niezainicjowanie zmiennej Niezgodność typów/błędna konwersja typów Nieuwzględnienie sytuacji wyjątkowej Błąd algorytmiczny Błąd techniczny Użycie niewłaściwej zmiennej Rodzaje nieformalnych testów statycznych Indywidualne przeglądy kodu (cudzego lub własnego) Formalne przeglądy techniczne Praca parami Formalne przeglądy techniczne 3-5 osób Wstępne przygotowanie 1-2h na osobę Czas trwania < 2h Uczestnicy: Autor, lider przeglądu, 2-3 recenzentów, sekretarz Prezentacja autora Decyzja Akceptacja, zwrot do małych poprawek, zwrot do dużych poprawek Podpis Formalne przeglądy techniczne - wskazówki Ocena produktu, a nie autora Ustalenie i trzymanie się zakresu przeglądu Ograniczona dyskusja Wskazywanie błędów, a nie koniecznie rozwiązywanie Notatki Ograniczona liczba uczestników Wcześniejsze przygotowanie Lista kontrolna Zapewnienie zasobów i zaplanowanie w harmonogramie 7

Testy jednostkowe Testy poprzedzające kodowanie Testy jednostkowe nie powinny być odkładane w czasie Zasada trochę kodu, test, trochę kodu, test Fowler: Zawsze, kiedy chcesz wyprowadzić na ekran lub zobaczyć pod debuggerem jakąś zmienną lub wyrażenie, napisz prosty test lub warunek poprawności Zasady stosowane np. w programowaniu ekstremalnym Wytwarzanie Najpierw test, potem funkcjonalność Wprowadzanie poprawek Najpierw test, potem poprawka Warunki poprawności a warunki testów Warunki poprawności muszą być spełnione zawsze niezależnie od danych wejściowych Warunki testów są spełnione dla konkretnych danych Narzędzia testów jednostkowych JUnit, CppUnit Funkcje Definiowanie testów jednostkowych Współdzielenie kontekstu testowania zmienne, obiekty Zestawy testów Wykonywanie testów (wzorzec Template method) Interfejs użytkownika Przykład class Complex { friend bool operator ==(const Complex& a, const Complex& b); double real, imaginary; public: Complex( double r, double i ); ; Wykorzystanie CppUnit class ComplexNumberTest : public CppUnit::TestCase { public: ComplexNumberTest( std::string name ) : CppUnit::TestCase( name ) { void runtest() { CPPUNIT_ASSERT( Complex (10, 1) == Complex (10, 1) ); CPPUNIT_ASSERT(!(Complex (1, 1) == Complex (2, 2)) ); ; 8

Testowanie połączone z zarządzaniem konfiguracjami Fakt, że moduł/program przeszedł zestaw testów nie oznacza, że przejdzie go w przyszłości!!! Testowanie po zbudowaniu systemu Zautomatyzowany zestaw testów sprawdzających poprawność aktualnej wersji Automatyczne uruchamianie testów po wprowadzeniu zmian w repozytorium projektu Szacowanie skuteczności testowania i liczby nieznanych błędów Posiewanie błędów Porównywanie niezależnych testów Porównywanie niezależnych Posiewanie błędów X - liczba nieznanych błędów w programie P liczba posianych błędów W liczba wykrytych błędów WP W liczba wykrytych posianych błędów WP/P skuteczność testowania X = P/WP (W-WP) testów W1, W2 liczby błędów wykrytych w dwóch niezależnie przeprowadzonych testach WP <W1, W2 liczba wspólnych błędów wykrytych w obu testach WP/W2, WP/W1 skuteczności testowania w testach pierwszym! i drugim! X = W2/WP (W1-WP) X = W1/WP (W2-WP) Psychologiczne aspekty testowania Problem motywacji Czy powinno się wprowadzać oddzielny zespół testujący Osoby szczególnie predestynowane do testowania Unikanie błędów Kwestia nastawienia psychicznego Ile kosztuje błąd? Koszt wykrycia (błędnego wykonania) Koszt lokalizacji Koszt poprawy Koszt dystrybucji do klientów Obsługa zgłoszeń o niepoprawnym działaniu programu Koszt opinii klientów Analiza przyczyn błędów 9

Unikanie niebezpiecznych technik Goto, itp. Wskaźniki Liczby zmiennopozycyjne Rekursja Przerwania Obliczenia równoległe Skomplikowane wyrażenia Zasada ograniczonego dostępu Lub zasada need to know (dostęp do danych ma tylko ten, kto musi wiedzieć) Dostęp do danych i funkcji powinny mieć tylko te fragmenty kodu, które z nich rzeczywiście korzystają Trudne do pełnego zrealizowania w typowych językach programowania Języki obiektowe Pola i metody chronione, prywatne, klasy, funkcje zaprzyjaźnione, pakiety Stosowanie kompilatorów sprawdzających zgodność typów - wymuszanie niezgodności typów Przykład z zajęć: int unsigned int FunctionChange = Distance (...) + Distance (...) - Distance (...) - Distance (...) Wymuszanie niezgodności typów, np. poprzez typy obiektowe C++ językiem o silnej typizacji? typedef int TLiczbaPracownikow; typedef int TLiczbaKomputerow; typedef int TLiczbaDni; TLiczbaPracownikow LiczbaPracownikow; TLiczbaKomputerow LiczbaKomputerow; TLiczbaDni LiczbaDni; LiczbaKomputerow = LiczbaDni + LiczbaPracownikow; Poprawne Pisanie czytelnego kodu TData du; TData da; TCzas cp; Cp = da du; CzasPracy = DataAktualna DataUrodzenia; Warunki poprawności Warunek poprawności to warunek logiczny, który zawsze musi być spełniony w danym miejscu programu Jest to warunek konieczny, ale nie wystarczający poprawności programu Rola standardów kodowania 10

Źródła warunków poprawności Ograniczenia dotyczące danych zmiennych, pól, parametrów Wzrost > 0 Płaca minimalna <= Płaca maksymalna Rodzic.DataUrodzenia < Dziecko.DataUrodzenia Dla każdego i, j i < j => A [i] < A [j] Niezmienniki algorytmów Sortowanie tablicy N elementowej Dla każdego i = 1,...,N-1 { Dla każdego j = i + 1,...,N { Jeżeli A [i] > A [j] to Zamień A [i] z A [j] ( A[i] <= A[i + k], k=1,...n-i ) Niezmiennik algorytmu Relacja dominacji (dla maksymalizacji kryteriów) Rozwiązania niezdominowane Rozwiązania niezdominowane Rozwiązania dominujące x f2 Rozwiązania zdominowane Rozwiązania niezdominowane f1 Uaktualnianie zbioru rozwiązań Pareto-optymalnych Uaktualnianie zbioru PP przy wykorzystaniu rozwiązania x Wszystkie rozwiązania zdominowane przez x są usuwane z PP x jest dodawane do PP jeżeli żadne rozwiązanie w PP dominuje x bool bzdominowane = false; bool bdominujace = false; Dla każdego i dopóki bzdominowane == false Jeżeli X dominuje N [i] to Usuń N [i] bdominujace = true W przeciwnym wypadku jeżeli X jest zdominowane przez to N [i] bzdominowane = true Jeżeli!bZdominowane to Dodaj X do N!(bZdominowane && bdominujace) 11

Warunki poprawności Cechy dobrego warunku poprawności Prostota Ogólność Makro assert w C++ Odporność na błędy (tolerancja błędów) Program jest odporny na błędy jeżeli nie prowadzą one do błędnych wykonań Etapy: wykrycie błędu wyjście z błędu, tj. zakończenia pracy modułu, w którym wystąpił błąd w poprawny sposób ewentualna naprawa błędu, tj. zmiany programu tak, aby zlikwidować wykryty błąd Jak wykrywać błędy podczas pracy programu Programowanie n-wersyjne Sprawdzanie warunków poprawności danych Porównywanie wyników różnych wersji modułu Wersja 1 Wersja 2... Porównanie wyników Wersja n Programowanie n-wersyjne Technika zapasowych modułów Załóżmy, że prawdopodobieństwo wystąpienia błędnego wykonania w module wynosi 0.01 Jeżeli są to zdarzenia niezależne to prawdopodobieństwo wystąpienia błędnego wykonania jednocześnie w dwóch wersjach modułu wynosi 0.01 0.01 = 0.0001 Prawdopodobieństwo takiego samego błędnego wykonania może być jeszcze dużo mniejsze Wersja podstawowa Wersja zapasowa Weryfikacja poprawności 12

Powrót do poprzedniego stanu Stosowane, jeżeli korzystamy tylko z jednej wersji modułu i nie możliwe zapewnienie poprawnego wykonania Zachowywanie poprawnego stanu Zapamiętywanie zmian Nadmiarowość danych 13