Piotr Dwieczkowski. Code coverage. Mierzenie pokrycia kodu, teoria oraz praktyka w C/C++



Podobne dokumenty
GNU GProf i GCov. przygotował: Krzysztof Jurczuk Politechnika Białostocka Wydział Informatyki Katedra Oprogramowania ul. Wiejska 45A Białystok

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Podstawy programowania C. dr. Krystyna Łapin

Tworzenie oprogramowania

Programowanie Proceduralne

Podstawy Programowania.

Sposoby wykrywania i usuwania błędów. Tomasz Borzyszkowski

Programowanie I C / C++ laboratorium 01 Organizacja zajęć

Laboratorium Informatyka (I) AiR Ćwiczenia z debugowania

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

Podstawy Programowania

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Podstawy informatyki

Automatyzacja kompilacji. Automatyzacja kompilacji 1/40

System kontroli wersji, system zarządzania kodem źródłowym

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Ćwiczenie 1. Przygotowanie środowiska JAVA

Programowanie mikrokontrolerów AVR

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

1.Wstęp. 2.Generowanie systemu w EDK

X P.I.W.O. Portowanie Tizena na nowe architektury na przykładzie ARMv6. Maciej Wereski Samsung R&D Institute Poland. 17 Maj Poznań, Polska

Continuous Integration z ClickOnce

Wstęp do Programowania, laboratorium 02

JAVA?? to proste!! Autor: wojtekb111111

1 Podstawy c++ w pigułce.

Środowisko Keil. Spis treści. Krzysztof Świentek. Systemy wbudowane. 1 Trochę teorii. 2 Keil

Trochę o plikach wsadowych (Windows)

Laboratorium 1. I. Zainstaluj program Eclipse (wersja C/C++ w odpowiednim systemie operacyjnym

Optymalizacja programów Open Source. Profilery wysokiego poziomu część 2. Krzysztof Lichota

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

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

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Informatyka I : Tworzenie projektu

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Programy użytkowe (utilities)

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Java Podstawy. Michał Bereta

Narzędzie pomocnicze do przedmiotu Podstawy Informatyki - złożoność obliczeniowa

Testowanie jądra Linuksa. Michał Pilipczuk Michał Świtakowski Piotr Wojnarowski

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Adam Wójs <adam[shift+2]wojs.pl> git --wprowadzenie

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Automatyzacja kompilacji. Automatyzacja kompilacji 1/28

Wstęp do programowania

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Programowanie w C++ Wykład 10. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 10) Programowanie w C++ 1 / 21

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Automatyczne generowanie testów z modeli. Bogdan Bereza Automatyczne generowanie testów z modeli

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

Fragment wykładu z języka C ( )

Wprowadzenie do języka Java

Testowanie i walidacja oprogramowania

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

Programowanie obiektowe

Zadania: 1. Funkcja przeliczająca F na C: float FtoC(float f){ return (f 32.0) * 5.0 / 9.0; }

Testowanie oprogramowania. Testowanie oprogramowania 1/34

dr inż. Jarosław Forenc

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

Proste algorytmy w języku C

PROGRAMOWANIE w C prolog

Pętle instrukcje powtórzeo

1 Podstawy c++ w pigułce.

Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.

Umieszczanie kodu. kod skryptu

Uruchomienie Intel Galileo

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Tworzenie oprogramowania

Komentarze w PHP (niewykonywane fragmenty tekstowe, będące informacją dla programisty)

Optimizing Programs with Intended Semantics

Technika mikroprocesorowa. Struktura programu użytkownika w systemie mikroprocesorowym

Podstawy programowania. Wykład 9 Preprocesor i modularna struktura programów. Krzysztof Banaś Podstawy programowania 1

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

Uniwersytet Mikołaja Kopernika w Toruniu. Profilowanie ruchu sieciowego w systemie GNU/Linux

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Pixy - analiza statyczna skryptów PHP

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Skrypty powłoki Skrypty Najcz ciej u ywane polecenia w skryptach:

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

Analiza Exchange Granular Recovery

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Co nie powinno być umieszczane w plikach nagłówkowych:

Microsoft Test Manager

Podstawy Programowania. Wykład 1

KURS C/C++ WYKŁAD 2. char znak; znak = a ; Program 2 #include<stdio.h> void main() { char znak; while( (znak = getchar() )!= t ) putchar(znak); }

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Podstawy Informatyki Wprowadzenie do języka C dr inż. Jarosław Bułat

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

3 Przygotował: mgr inż. Maciej Lasota

lekcja 8a Gry komputerowe MasterMind

MS Visual Studio 2005 Team Suite - Performance Tool

Zadanie 1. Tworzenie nowej "strony sieci WEB". Będziemy korzystad ze stron w technologii ASP.NET.

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Transkrypt:

Piotr Dwieczkowski Code coverage Mierzenie pokrycia kodu, teoria oraz praktyka w C/C++

Plan Co to jest pokrycie kodu? Możliwe sposoby wykorzystania Rodzaje statystyk Wady i zalety mierzenia porycia kodu Narzędzia: gcov, lcov Bardzo prosty przykład Bardziej skomplikowane CMAKE + gcov + lcov Alternatywy

Co to jest pokrycie kodu? Miara wykorzystywana przy testowaniu oprogramowania Opisuje w jakim stopieniu program został sprawdzony przez testy Zazwyczaj wykorzystywane przy określaniu skuteczności testów jednostkowych Dla większości języków istnieją zestawy narzędzi do testowania/pomiaru pokrycia Pokrycie możemy mierzyd według różnych kryteriów

Pokrycie linii kodu ang. statement/line coverage Dla każdej linii kodu czy instrukcje w danej linii zostały uruchomione? Zależne od struktury tekstowej kodu, np. : if( 1 == 0 ) printf( hello world! ); Ta linia zawsze zostanie oznaczona jako uruchomiona Nie da nam to żadnej informacji o pokryciu printf Mało nam mówi o pętlach i instrukcjach warunkowcyh

Pokrycie funkcji ang. function coverage Dla każdej funkcji czy została wykonana? Pozwala szybko znaleźd funkcje, które nie są przetestowane Lub np. nie są już używane Może byd przydatne przy prostym profilowaniu jeśli zbieramy liczbę wywołao w tym wypadku najlepiej zbierad czas spędzony w funkcji (gprof)

Pokrycie gałęzi ang. branch/decision coverage Wymaga analizy struktury kodu Mierzy czy instrukcje warunkowe wykonały obie ścieżki kodu (także pętle) Dokładniej mierzy czy wartośd logiczna warunku została wyliczona podczas uruchomienia jako prawda i fałsz Nie bierze pod uwagę w jaki sposób została ona wyliczona (ang. condition coverage)

Pokrycie ścieżek ang. path coverage Mierzy pokrycie wszystkich możliwych ścieżek wykonania funkcji Oczywiście pętle to utrudniają Możemy wprowadzid dodatkowe kryteria Zamiast nieskooczonej liczby ścieżek pętla dodaje dwie: Program nie wszedł do pętli Program wszedł do pętli (i uruchomił ją dowolną liczbę razy)

Inne kryteria Race coverage Condition coverage (Multiple condition coverage) Loop coverage Data flow coverage Relational operator coverage Weak mutation coverage

Pokrycie kodu - wady, zalety Dobry sposób oceniania skuteczności testów Tworzenie testów dla pokrycia wymusza dodatkową analizę kodu Dużo (raczej łatwych w obsłudze) narzędzi Nie istnieje idealna miara pokrycia Nie można w 100% wierzyd, że wszystko zostało sprawdzone Wykonianie i analiza części z opisanych kryteriów może zająd dużo czasu Z drugiej strony nie zawsze opłaca się dążyd do 100% pokrycia Prawo malejących przychodów (ang. dimnishing returns)

gcov Pozwala analizowad pokrycie linii kodu, wykonywanych funkcji oraz gałęzi Wchodzi w skład pakietu gcc, działa tylko z programami skompilowanymi przez gcc (wymaga specjalnych flag) Dla podanego pliku źródłowego nazwa.cpp generuje tekstowy plik nazwa.cpp.gcov zawierający informacje o pokryciu dla każdej linii Jest raczej nieprzyjemny w obsłudze trudno go ręcznie używad przy nieco większych projektach

Pliki.gcov (wygenerowane przez gcov b) -: 0:Source:tmp.c -: 0:Graph:tmp.gcno -: 0:Data:tmp.gcda -: 0:Runs:1 -: 0:Programs:1 -: 1:#include <stdio.h> -: 2: -: 3:int main (void) function main called 1 returned 1 blocks executed 75% 1: 4:{ 1: 5: int i, total; -: 6: 1: 7: total = 0; -: 8: 11: 9: for (i = 0; i < 10; i++) branch 0 taken 91% (fallthrough) branch 1 taken 9% 10: 10: total += i; -: 11: 1: 12: if (total!= 45) branch 0 taken 0% (fallthrough) branch 1 taken 100% #####:13: printf ("Failure\n"); call 0 never executed -: 14: else 1: 15: printf ("Success\n"); call 0 called 1 returned 100% 1: 16: return 0; -: 17:}

Jak to działa? Podczas kompilacji podajemy do gcc odpowiednie flagi: fprofile arcs ftest coverage Gcc generuje pliki.gcno dla każdego pliku źródłowego Zawierają one informacje o strukturze kodu Oprócz tego do programu jest dołączany kod, który sprawia, że: Podczas działania zbierane są statystyki pokrycia Przed zakooczeniem programu dane są zapisywane w plikach.gcda (w tym katalogu, w którym jest plik.gcno) Każdemu plikowi źródłowemu odpowiada po jednym.gcda i.gcno (ale nie plikom nagłówkowym) Pomimo tego przy uruchomieniu gcov generuje pokrycie dla plików nagłówkowych Pliki.gcda i.gcno są binarne i są wykorzystywane przez np. gcov, gprof i inne programy z gcc

Problemy Nie możemy ustalid gdzie gcc zapisuje plik.gcno i.gcda (zapisuje tam gdzie plik wyjściowy) gcov musi zostad uruchomiony z tego samego katalogu co gcc podczas kompilacji Można podpowiedzied gdzie gcov ma szukad plików

lcov Front-end do gcov Pozwala na generowanie stron html z informacjami o pokryciu dla poszczególnych plików Dużo łatwiejszy w obsłudze wystarczy podad katalog, a lcov znajdzie pliki.gcda i.gcno (także w podkatalogach) i dla każdego pliku źródłowego przeanalizuje pokrycie lcov zapisuje pokrycie dla całego katalogu w pojedynczym pliku tracefile.info genhtml zamienia plik.info w pliki html

lcov możliwości W jednym pliku.info mogą byd przechowywane informacje o różnych uruchomieniach Można przeglądad pokrycie według oddzielnie uruchomionych testów lcov umożliwia np. porównywanie uruchomieo dodatkowo: lcov został stworzony w celu analizy pokrycia kodu uruchomionego jądra Linux (w czasie rzeczywistym)

gcov+lcov - tutorial Kompilacja z flagami gcc/g++ g++ fprofile arcs ftest coverage main.cpp o main Zauważ utworzone pliki.gcno Uruchom program tak jak zwykle./main Zauważ pliki.gcds Jeśli używasz bezpośrednio gcov gcov plik_zrodlowy.cpp (albo *.cpp) Dla każdego pliku źródłowego otrzymujemy plik.cpp.gcov Jeśli używasz lcov uruchom lcov (najlepiej w oddzielnym katalogu) i wygeneruj html mkdir report cd report lcov --capture --directory../ --output-file main.info c++filt < main.info > main.info (czytelne nazwy np. funkcji) genhtml main.info Otwórz index.html w ulubionej przeglądarce

Złożony przykład CMAKE Należy dodad flagi kompilatora CMAKE tego nie ułatwia (ze względu na przenośnośd) Mamy zmienną CMAKE_CXX_COMPILER_FLAGS Możemy ją zmieniad w zależności od wartości opcji Wystarczy zrobid to raz dla całego projektu (zmienid flagi przed dodawaniem podfolderów) Wykonujemy make bez pokrycia, potem z pokryciem Nic się nie dzieje CMAKE nie wie, że gcc powinien wygenerowad pliki.gcno nie szuka ich i nie wie, że należy przebudowad projekt

Złożony przykład Testowanie UnitTest++ wybrany na podstawie analizy dyskusji na SO i kilku artykułów w sieci W łatwy sposób można tworzyd całe zestawy testów Można też używad CTest Może byd to zbyt duże narzędzie dla niewielkich projektów Nie zdążyłem przetestowad tego rozwiązania

Złożony przykład Generowanie pokrycia Próby dodania gcov jako TARGET w Makefile żeby można było uruchomid make coverage taki TARGET można zdefiniowad jako obowiązkowy krok po testach zarówno add_custom_target jak i add_custom_command nie spełniają wszystkich wymagao trudno dostad się do plikó w.gcno powinny byd w katalogu CMakeFiles/target_name.dir/ ale nie jest to zdefiniowane w żadnej stałej co oznacza, że może się zmienid (znowu ze względu na przenośnośd)

Generowanie pokrycia rozwiązanie lcov służy właśnie do tego (i np. omija generację plików.gcov) Innym rozwiązaniem może byd CTest (w dokumentacji jest wspomniana opcja generowania pokrycia)

Alternatywy Działające z gcc: ggcov Trucov gcc pod cygwin Visual Studio 2008/10 Testowanie/pokrycie wbudowane wersji Linux/Windows BullseyeCoverage CTC++ TestCoverage

Urządzenia wbudowane Jest to możliwe, ale nie ma dużo materiałów O gcov+arm jest trochę informacji na grupach dyskusyjnych Jest też praca Gcov on an embedded systems Skupia się na architekturze PowerPC

Pytania?

Źródła gcov man gcov http://gcc.gnu.org/onlinedocs/gcc/gcov.html lcov http://ltp.sourceforge.net/coverage/lcov.php Trucov http://code.google.com/p/trucov/ BullseyeCoverage http://www.bullseye.com/ CTC++ TestCoverage http://www.verifysoft.com/en_ctcpp.html Różne rodzaje pokrycia z przykładami http://www.javaranch.com/journal/2004/01/introtocodecoverage.html http://www.bullseye.com/coverage.html Gcov on an embedded system (H.Blasum, F.Görgen, J.Urban) http://sysrun.haifa.il.ibm.com/hrl/greps2007/papers/gcov-on-an-embedded-system.pdf