Testowanie oprogramowania metodą badania pokrycia kodu

Slides:



Advertisements
Podobne prezentacje
Projekt Do kariery na skrzydłach – studiuj Aviation Management Projekt współfinansowany ze ś rodków Europejskiego Funduszu Społecznego. Biuro projektu:
Advertisements

Rodzaje testów oprogramowania
C++ w Objectivity Marcin Michalak s1744. Pomocne pakiety: Data Definition Language (DDL). Standard Template Library (STL). Active Schema.
OOPC++ - operatory1 Operatory class complex { private: double re, im; public: complex (double r, double i = 0) { re = r; im = i; } friend complex operator+
PRZYPOMNIENIE!!!!!! Używamy mówiąc o warunku i skutkach jego spełnienia, które są zawsze prawdziwe If + Present Simple,+ Present Simple lub czasownik.
GUI Struktury Spotkanie integracyjne Nazwa wydziału: EAIiE Nazwa katedry: Informatyka Miejsce i data prezentacji: Kraków,
Rekursja Teoretyczne podstawy informatyki Wykład 5
ROUGH SET BASED DECISION SUPPORT Roman Słowiński Laboratory of Intelligent Decision Support Systems Institute of Computing Science Poznań University of.
Łukasz Monkiewicz.
Współprogramy Plan: Motywacja Składnia Scenariusz obiektu współprogramu Przykłady Producent – konsument ( instrukcja attach ) Czytelnik -pisarze ( instukcja.
142 JAVA – sterowanie i wątki public class A20 extends javax.swing.JApplet implements ActionListener { private int licznik = 0; private JTextField t =
REKURENCJA.
Krzysztof Manuszewski
Zasoby elektroniczne w cyklu akademickim Biblioteka w kryzysie czy kryzys w bibliotece Łódź 2010.
db4o Kacper Skory Marcin Talarek
funkcja przyjmuje wartości dodatnie, a dla jakich ujemne?
FUNKCJA L I N I O W A Autorzy: Jolanta Kaczka Magdalena Wierdak
Widzisz byłego prezydęta Clintona i jego następcę Gora? Nie... To są 2 twarze Clintona ale z innym uczesaniem. Co widzisz?
DYFRAKCJA ŚWIATŁA NA SIATCE DYNAMICZNEJ
Socjologia rynku pracy
Analiza matematyczna III. Funkcje Funkcje I – własności podstawowe
Analiza matematyczna III. Funkcje Funkcje II – własności podstawowe
PIO 2_2, Zofia Kruczkiewicz1 Wykład 2 – część druga Iteracyjno-rozwojowy cykl oprogramowania 2.
PIO. Autor -Zofia Kruczkiewicz1 Wykład 1-część druga Wstęp do inżynierii oprogramowania. Cykle rozwoju oprogramowania (część biznesowa aplikacji) iteracyjno-rozwojowy.
PIO. Autor -Zofia Kruczkiewicz1 Wykład 1-część druga Wstęp do inżynierii oprogramowania. Cykle rozwoju oprogramowania (część biznesowa aplikacji) iteracyjno-rozwojowy.
Elektronika cyfrowa Prezentacja Remka Kondrackiego.
Prąd Elektryczny.
Tablice.
Podstawy programowania
Anna Salamończyk. Kontekst użycia programu: O Nauka nowego materiału - nowych pojęć: O wybór (dodawanie) pojęć, O powtarzanie, O możliwość związanie rysunków.
Zapraszamy.. Rocznie wycina się 200 tysięcy kilometrów kwadratowych lasów liściastych i iglastych.
Elementarz programowania 1. QBASIC
QUIZ ADWENTOWO-ŚWIĄTECZNY
Co każdy użytkownik komputera wiedzieć powinien
ALGORYTMY.
Materiał edukacyjny wytworzony w ramach projektu „Scholaris - portal wiedzy dla nauczycieli” współfinansowanego przez Unię Europejską w ramach Europejskiego.
Automatyczne wyznaczanie złożoności obliczeniowej algorytmów
Adam Suwała DIY - DI.
Cz.8 Zdarzenia. Refleksja – przypomnienie Event Programowanie zdarzeniowe Do dzieła!
Automatyzacja testów akceptacyjnych
Powrót do sukcesu Analiza przypadku Princessy (rola badań marketingowych podczas rozwoju produktu: ) Powrót do sukcesu Analiza przypadku Princessy.
Ruch niejednostajny Wykres zależności Wykres w zależności od prędkości susającego zająca (1) i poruszającego się żółwia (2) od czasu trwania ruchu.
Myśli Ojca Świętego Jana Pawła II.
Dominik Jedliński oraz Bartek Kurczab
Polskie cyfrowe miasto ? Marzenia a rzeczywistość. Maxymilian Bylicki - Zakopane, Polskie cyfrowe miasto - marzenia a rzeczywistość Maxymilian.
Elementy programowania
Elementy programowania97 Użycie zmiennych w procedurze Sub ObliczWiek() 'deklaracja zmiennych Dim ImieNazwisko As String Dim DataUrodzenia As Date Dim.
Warsztaty C# Część 2 Grzegorz Piotrowski Grupa.NET PO
Warsztaty C# Część 3 Grzegorz Piotrowski Grupa.NET PO
KINECT – czyli z czym to się je?. Damian Zawada
Ewa Amghar, Barbara Bułat BIBLIOTEKARZ – ZAWÓD Z PRZYPADKU, Z PRZYMUSU CZY Z MARZEŃ? MOTYWY WYBORU ZAWODU PRZEZ PRACOWNIKÓW BIBLIOTEKI JAGIELLOŃSKIEJ.
A. Jędryczkowski – 2006 ©. Tablica to struktura danych zawierająca zbiór obiektów tego samego typu i odpowiada matematycznemu pojęciu wektora (tablica.
Turbo Pascal umożliwia wykorzystanie w programach zbiorów teoriomnogościowych, których elementy muszą należeć do pewnego określonego typu. Typ zbiorowy.
Pliki elementowe – A. Jędryczkowski © 2007 Turbo Pascal umożliwia wykorzystanie w programach plików elementowych. Pliki takie zawierają informację zakodowaną
Zmienne środowiskowe wpływające na wyniki egzaminów zewnętrznych osiągane przez uczniów Artur Pokropek INSTYTUT FILOZOFII I SOCJOLOGII.
Budowa programu #include /*instrukcje preprocesora */ #include int main(void) { /*podstawowa funkcja programu */ int a=1; /*deklaracja i inicjalizacja.
Uwierzytelnianie (Authentication) Sergiusz Przybylski III r. Informatyka Stosowana.
W.K. (c) Bazy danych Access. 2W.K. (c) 2007 Baza danych - definicje Baza danych to zbiór informacji dotyczących określonego tematu (stanowiących.
Ocenianie. 6 Ocenę celującą otrzymuje uczeń wówczas, jeżeli posiadł wiedzę i umiejętności wykraczające poza program nauczania w danej klasie, samodzielnie.
HTML cz.3 Tabele cd. oraz ramki
Matmatura 2013; 2014; 2015; 2016; 2017…. p. Katarzyna Misztal z uczniami klasy 2F: Monika Tobera Milena Ściana Radosław Stochmal KTO?
Prezentacja powstała w ramach projektu „Etno-projekt dla najmłodszych” realizowanego przez Stowarzyszenie Pracownia Etnograficzna.
Warsztaty użytkowników programu PLANS – Karwia06 Język makropoleceń JMP programu PLANS Część I mgr inż. Tomasz Zdun.
Instrukcja switch switch (wyrażenie) { case wart_1 : { instr_1; break; } case wart_2 : { instr_2; break; } … case wart_n : { instr_n; break; } default.
Instrukcja switch switch (wyrażenie) { case wart_1 : { instr_1; break; } case wart_2 : { instr_2; break; } … case wart_n : { instr_n; break; } default.
Obsługa strumienia wejścia/wyjścia /zajęcia nr 2/ printf – wyświetlanie scanf – ??? dla printf: \n - nowa linia \t - tabulator poziomy \b - znak cofania.
Instrukcje sterujące: W instrukcjach sterujących podejmowane są decyzje o wykonaniu tych czy innych instrukcji programu. Decyzje te podejmowane są w zależności.
w/g Grzegorz Gadomskiego
1.
Piotr Czapiewski Wydział Informatyki ZUT.  Extensible Markup Language  Język znaczników  Human-readable and machine-readable  Niezależny od platformy.
Zapis prezentacji:

Testowanie oprogramowania metodą badania pokrycia kodu Artur Rembiszewski Opiekun: dr inż. Ilona Bluemke

Plan prezentacji Przypomnienie podstawowych pojęć Testowanie metodą badanie pokrycia kodu Pokrycie przepływu danych Dostosowanie kryteriów przepływu danych do programów obiektowych Zasięg widoczności zmiennych Klasyfikacja instrukcji Prezentacja mojego programu Pytania

Podział metod testowania Testowanie Strukturalne (white-box) Funkcjonalne (black-box) Statyczne Dynamiczne

Przypadek testowy (test) Zbiór danych wejściowych Scenariusz wykonania Oczekiwany wynik Przypadek testowy ma przetestować program w kontekście elementarnej operacji, lub ich zbioru

Ocena jakości zestawu testów Po co? Czy aplikacja jest przetestowana w wystarczającym stopniu? Znalezienie minimalnego zbioru testów Jak? - kryteria - Pokrycie danych - Pokrycie kodu Pokrycie przepływu sterowania Pokrycie przepływu danych Znalezienie minimalnego zbioru testów – np. do testów regresji Pokrycie danych - sprawdzenie możliwie wszystkich kombinacji (klas równoważności) wartości danych wejściowych, a także wyników pośrednich obliczeń.

Schemat testowania

Pokrycie instrukcji Wymagane wykonanie co najmniej raz każdej instrukcji kodu programu

EclEmma

Pokrycie instrukcji - wady int abs (int x) { if (x>=0) x=0-x; return x; } Dla tego fragmentu kodu i zbioru testów jednoelementowego pokrycie instrukcji wynosi 100% - błąd nie został znaleziony T= {(x=0)}

Inne kryteria pokrycia przepływu sterowania Pokrycie warunków MCC (ang. Multiple Condition Coverage) MCDC (ang. Modyfied condition / decision coverage) JJ-paths (ang. jump-to-jump-paths) Pełne pokrycie ścieżek Kryteria związane z pokryciem pętli ... MCC – wielokrotne pokrycie warunków – eliminuje problem przedstawiony na poprzednim slajdzie, ale dużo kombinacji MCDC – zmniejsza liczbę kombinacji Pełne pokrycie ścieżek – bardzo, bardzo wyczerpujące, ale zbyt dużo kombinacji Kryteria związane z pokryciem pętli – specjalne traktowanie konstrukcji pętli – najpopularniejsze – pętla musi być wykonana 0, 1, max razy ... – powstało mnóstwo różnych kyteriów pokrycia (od początków lat 60-tych)

Pokrycie przepływu danych S. Rapps, E.J. Weyuker – 1985 Stwierdzenie czy pewna operacja przebiegła prawidłowo możliwe jest tylko w przypadku, gdy jej wynik zostanie użyty.

Pokrycie przepływu danych - pojęcia definicja (ang. definition) zmiennej x – instrukcja w wyniku której do zmiennej zostaje przypisana wartość. użycie (ang. use) zmiennej x – instrukcja której wykonanie wymaga podstawienia wartości zmiennej x. Graf DUG (ang. def-use graph) Definicja – np x=5, ale tez scanf(..., &x) DUG - jest pewnym rozszerzeniem grafu przepływu sterowania. Każdy węzeł zawiera dodatkowo informację o definicji, lub użyciu zmiennych z nim związanych.

Pokrycie przepływu danych - pojęcia p-use (ang. predicative) – użycie zmiennej w predykacie c-use (ang. computational) – użycie zmiennej w instrukcji obliczeniowej. Ścieżka wolna od definicji zmiennej x (ang. def-clear path)

Pokrycie przepływu danych

Pokrycie przepływu danych Rodzaje All defs All uses All p-uses All c-uses All p-uses/some c-uses All c-uses/some p-uses Inne kryteria zdefiniowane w pracy tamtych pań Mają na celu zapewnienie dobrego kryterium pokrycia przy zmniejszeniu liczby potrzebnych przypadków testowych Bo przykładowy kod zawierający 100,000 linii, ale zawiera aż 132,348 łańcuchów all-uses.

Dostosowanie kryteriów do programów obiektowych Zasięg widoczności zmiennych Które instrukcje traktować jako definicje, a które jako użycia zmiennych reprezentujących obiekty ? Problemy związane z dostosowaniem kryteriow do programow oiektowych

Zasięg widoczności zmiennych Poziomy testowania: Intra-method Inter-method Intra-class

Zasięg widoczności zmiennych Poziomy testowania: Intra-method Inter-method Intra-class ·  Intra-method – testowanie w zasięgu jednej metody. Jest to model pierwotny zdefiniowany w [2]. Nie uwzględnia atrybutów klasy ani interakcji pomiędzy metodami.

Zasięg widoczności zmiennych public class KeyTable { private static final int NOT_FOUND = -1; private TableElem[] table; private int length, maxTabSize; private int getIndex(String key) { for (int i=0; i<length; i++) if (table[i].key.equals(key)) return i; return NOT_FOUND; } private void removeIndex(int index) { for (int i=index; i<length-1; i++) table[i] = table[i+1]; table[length-1] = null; length --; private void reallocate() { TableElem[] newT = new TableElem[2*length]; newT[i] = table[i]; table = newT; maxTabSize = 2*length; public KeyTable(int startTabSize) { this.maxTabSize = startTabSize; table = new TableElem[maxTabSize]; length = 0; public void add(String key, int value) { int index = getIndex(key); if (index == NOT_FOUND) { //add new table[length] = new TableElem(); table[length].key = key; table[length].value = value; length ++; if (length == maxTabSize) reallocate(); } else //replace existing table[index].value = value; } public int get(String key) throws ElementNotFoundException { if (index == NOT_FOUND) throw new ElementNotFoundException(); return table[index].value; public void remove(String key) removeIndex(index); Kryterium all defs – jedno Kryterium all uses - obydwa

Zasięg widoczności zmiennych Poziomy testowania: Intra-method Inter-method Intra-class ·  Inter-method – testowanie metody publicznej klasy wraz z metodami, które są bezpośrednio lub pośrednio przez nią wywoływane. Pozwala znaleźć pary definicja-użycie dla atrybutów klasy.

Zasięg widoczności zmiennych public class KeyTable { private static final int NOT_FOUND = -1; private TableElem[] table; private int length, maxTabSize; private int getIndex(String key) { for (int i=0; i<length; i++) if (table[i].key.equals(key)) return i; return NOT_FOUND; } private void removeIndex(int index) { for (int i=index; i<length-1; i++) table[i] = table[i+1]; table[length-1] = null; length --; private void reallocate() { TableElem[] newT = new TableElem[2*length]; newT[i] = table[i]; table = newT; maxTabSize = 2*length; public KeyTable(int startTabSize) { this.maxTabSize = startTabSize; table = new TableElem[maxTabSize]; length = 0; public void add(String key, int value) { int index = getIndex(key); if (index == NOT_FOUND) { //add new table[length] = new TableElem(); table[length].key = key; table[length].value = value; length ++; if (length == maxTabSize) reallocate(); } else //replace existing table[index].value = value; } public int get(String key) throws ElementNotFoundException { if (index == NOT_FOUND) throw new ElementNotFoundException(); return table[index].value; public void remove(String key) removeIndex(index);

Zasięg widoczności zmiennych Poziomy testowania: Intra-method Inter-method Intra-class ·  Intra-class – uwzględnia łańcuchy powstałe w wyniku wywołania różnych sekwencji metod publicznych testowanej klasy. Liczba możliwych sekwencji wywołań metod publicznych jest w większości przypadków nieskończona dlatego testowane są tylko niektóre z nich.

Zasięg widoczności zmiennych public class KeyTable { private static final int NOT_FOUND = -1; private TableElem[] table; private int length, maxTabSize; private int getIndex(String key) { for (int i=0; i<length; i++) if (table[i].key.equals(key)) return i; return NOT_FOUND; } private void removeIndex(int index) { for (int i=index; i<length-1; i++) table[i] = table[i+1]; table[length-1] = null; length --; private void reallocate() { TableElem[] newT = new TableElem[2*length]; newT[i] = table[i]; table = newT; maxTabSize = 2*length; public KeyTable(int startTabSize) { this.maxTabSize = startTabSize; table = new TableElem[maxTabSize]; length = 0; public void add(String key, int value) { int index = getIndex(key); if (index == NOT_FOUND) { //add new table[length] = new TableElem(); table[length].key = key; table[length].value = value; length ++; if (length == maxTabSize) reallocate(); } else //replace existing table[index].value = value; } public int get(String key) throws ElementNotFoundException { if (index == NOT_FOUND) throw new ElementNotFoundException(); return table[index].value; public void remove(String key) removeIndex(index); Dzieki intra-class możemy wygenerowac sekwencje metod publicznych, które należy wykonac

CCFG - Class Control Flow Graph Konstrukcja CCFG, źródło: M.J. Harrold, G. Rothermel – „Performing data flow testing on classes”, Proceedings of the 2nd ACM SIGSOFT symposium on Foundations of software engineering, 154-163, 1994

Dostosowanie kryteriów do programów obiektowych Zasięg widoczności zmiennych Które instrukcje traktować jako definicje, a które jako użycia zmiennych reprezentujących obiekty ?

Dostosowanie kryteriów do programów obiektowych private static void test1(boolean b1) { KeyTable t1 = new KeyTable(10); KeyTable t2; t1.add("A", 15); t1.x = 1; if (b1) { System.out.println("A="+t1.get("A")); } t2 = t1; if (b1 == false) { t2.add("A", 10); System.out.println("A="+t2.get("A")); Gdzie mamy definicje?

Reguły dla języka Java - JaBUTi A.M.R. Vincenzi, J.C. Maldonado 1.Typy agregacyjne traktowane są jako obiekty zawierające referencje do kolejnych obiektów. Definicja (użycie) któregokolwiek elementu składowego traktowana jest jako definicja (użycie) całej zmiennej. 2. Dla zmiennej typu a[][] dostęp do elementu jest traktowany jako definicja (użycie) zmiennej a[][]. 3. Każda definicja (użycie) niestatycznego pola innej klasy (lub elementu typu agregacyjnego) traktowane jest jako użycie referencji do obiektu oraz definicja (użycie) tego pola. Przykład: ref_1 oraz ref_2 są referencjami do obiektów klasy C zawierającej pola x oraz y. W wyrażeniu „ref_1.x = ref_2.y” występują: użycie zmiennych ref_1 i ref_2, użycie zmiennej ref_2.y oraz definicja zmiennej ref_1.x. 4. W przypadku pól statycznych klas odwołanie traktowane jest jako definicja (użycie) tylko tego pola. W przykładach „C.x=10” oraz „ref_1.x=10”, gdzie ref_1 jest referencją do obiektu klasy C, a x jest polem statycznym występuje tylko definicja zmiennej C.x. 5. Wywołania metod traktowane są jako użycie zmiennej będącej referencją obiektu w kontekście którego wywoływana jest metoda. W przykładzie „ref_1.foo(e1,e2)” występuje użycie zmiennej ref_1. 6. Wywołanie metody z tej samej klasy traktowane jest jako wywołanie przy użyciu zmiennej this. Źródło: A.M.R. Vincenzi, J.C. Maldonado, W.E. Wong, M.E. Delamaro – „Coverage testing of Java programs and components”, Science of Computer Programming 56, 211-230, 2005

Określenie definicji i użyć zmiennych w oparciu o stan obiektu Mei-Hwa Chen, H.M. Kao Stan obiektu – pewna kombinacja wartości zmiennych będących atrybutami obiektu. Przez wartość dla atrybutu będącego innym obiektem rozumiany jest jego stan. Definicja obiektu – Instrukcja w wyniku której stan obiektu jest inicjalizowany lub zmieniany. Użycie obiektu – Instrukcja w wyniku, której bezpośrednio lub pośrednio używana jest jedna ze zmiennych określających stan obiektu. Takie podejście jest bliższe paradygmatowi programowania obiektowego. Ponieważ traktuje obiekt jako atomowa jednostke Źródło: Mei-Hwa Chen, H.M. Kao – „Testing Object-Oriented Programs An Integrated Approach”, Proceedings of the 10th International Symposium on Software Reliability Engineering, 73-83, 1999

Określenie zbioru metod modyfikujących stan obiektu Na podstawie kodu źródłowego metody (Mei-Hwa Chen, H.M. Koo) Bez znajomości kodu źródłowego (klasy z zewnętrznych bibliotek) C ++ - na podstawie deklaracji : class Class1 { public: int get_value() const; }; Często mamy biblioteki, wiec kod zrodlowy jest niedostepny Java - ?

Określenie zbioru metod modyfikujących stan obiektu - Java Statycznie Dekompilacja i analiza kodu Dynamicznie 1. Instrumentacja kodu { stateBefore = get_state(obj); obj.method1(); if (stateBefore!=get_state(obj)) setDef(obj.getClass(),”method1”); } 2. Wykonanie programu Wyjasnic co to instrumentacja Statycznie – wady – jeśli na stan obiektu sklada się inny obiekt, to trzeba rekurencyjnie to robic Dynamicznie – metoda może modyfikowac stan obiektu warunkowo, a pozatym może w ogole nie zostac wywolana

Pobranie stanu obiektu Wartości wszystkich pól prywatne – refleksja Sample sObj = new Sample(); Class cl = sObj.getClass(); Field[] fields = cl.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); Object fieldValue = field.get(sObj); System.out.println(field +"="+ fieldValue); } hashCode() Każde wywołanie metody w kontekście tego samego obiektu, musi zwrócić tą samą wartość (o ile obiekt nie był modyfikowany). Wartość nie musi być taka sama po ponownym uruchomieniu programu. Jeśli dwa obiekty są równe (wg logiki aplikacji) wywołanie metody dla obydwu musi zwrócić tą samą wartość. Nie jest konieczne, aby wyniki zwrócone przez metodę dla dwóch różnych obiektów były różne. Wartosci wszystkich pol – ta sama wada co statyczna alaliza kodu. Pole może być obiektem i trzeba rekurencyjnie pobierac hashCode – moze być niezaimplementowana. Pierwotne przeznaczenie – wartosc funkcji mieszajacej dla hashTable, jest w Object, kazda klasa ja ma.

Literatura 1. JaBUTi Homepage - http://jabuti.incubadora.fapesp.br/   2. S. Rapps, E.J. Weyuker, - „Selecting software test data using data flow information.”, IEEE Transactions on Software Engineering 11, 367–375, 1985 3. A.M.R. Vincenzi, J.C. Maldonado, W.E. Wong, M.E. Delamaro – „Coverage testing of Java programs and components”, Science of Computer Programming 56, 211-230, 2005 4. M.J. Harrold, G. Rothermel – „Performing data flow testing on classes”, Proceedings of the 2nd ACM SIGSOFT symposium on Foundations of software engineering, 154-163, 1994

Pytania?