Pomiar pokrycia kodu w Delphi

Czy Jest jakiś sposób na zmierzenie zasięgu kodu za pomocą DUnit? A może są jakieś darmowe narzędzia do tego? Czego do tego używasz? Jaki zasięg kodu Zwykle wybierasz?

Jim McKeeth: dzięki za szczegółową odpowiedź. Mówię o testach jednostkowych w sensie podejścia TDD, a nie tylko o testach jednostkowych po wystąpieniu awarii. Interesuje mnie zasięg kodu, który mogę osiągnąć dzięki kilku podstawowym testom jednostkowym.

Author: jpfollenius, 2009-02-10

6 answers

Właśnie stworzyłem nowy projekt open source na Google Code z podstawowym narzędziem do pokrycia kodu dla Delphi 2010. https://sourceforge.net/projects/delphicodecoverage/

Teraz może zmierzyć pokrycie linii, ale planuję dodać pokrycie klas i metod.

Generuje raporty html z podsumowaniem, a także zaznaczone źródło pokazujące, jakie linie są zakryte( zielone), które nie były (czerwone) i pozostałe linie, dla których nie wygenerowano żadnego kodu oni.

Aktualizacja: Od wersji 0.3 Delphi Code Coverage możesz generować raporty XML zgodne z wtyczką Hudson EMMA, aby wyświetlać trendy pokrycia kodu w obrębie Hudson .

Aktualizacja: Wersja 0.5 przynosi poprawki błędów, zwiększoną konfigurowalność i oczyszczone raporty

Aktualizacja: Wersja 1.0 zapewnia wsparcie dla wyjścia emma, pokrycie klas i metod oraz pokrycie bibliotek DLL i BPLs

 24
Author: Christer Fahlgren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-04 12:14:08

Nie znam żadnych darmowych narzędzi. AQtime jest prawie standardem defacto do profilowania Delphi. Nie używałem go, ale szybkie wyszukiwanie znalazłem Discover dla Delphi, który jest teraz open source, ale tylko pokrywa kod.

Jedno z tych narzędzi powinno dać ci wyobrażenie o tym, ile kodu pokrywają twoje testy jednostkowe.

 11
Author: Bruce McGee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-26 20:22:36

Czy chodzi Ci o pokrycie kodu z testów jednostkowych czy o kod nieświeży? Ogólnie uważam, że tylko testowalny kod, który ma awarię, powinien być objęty testem jednostkowym(tak, zdaję sobie sprawę, że może to być początek świętej wojny, ale na tym stoję). Więc to byłby dość niski procent.

Teraz stary kod z drugiej strony to już inna historia. Nieświeży kod to kod, który nie jest używany. Najprawdopodobniej nie potrzebujesz narzędzia, aby powiedzieć ci to za dużo kodu, po prostu poszukaj małego niebieskiego Kropki po kompilacji w Delphi. Wszystko bez niebieskiej kropki jest czerstwe. Ogólnie jeśli kod nie jest używany, należy go usunąć. Więc byłoby to 100% pokrycie kodu.

Są inne scenariusze dla nieświeżego kodu, na przykład jeśli masz specjalny kod do obsługi, jeśli data kiedykolwiek wyląduje na 31 lutego. Kompilator nie wie, że to niemożliwe, więc kompiluje go i daje niebieską kropkę. Teraz możesz napisać do tego test jednostkowy, przetestować go i może się udać, ale wtedy po prostu zmarnowałeś swój czas po raz drugi (pierwszy na napisanie kodu, drugi na testowanie go).

Istnieją narzędzia do śledzenia, jakie ścieżki kodu są używane podczas uruchamiania programu, ale jest to tylko Simi-niezawodne, ponieważ nie wszystkie ścieżki kodu będą używane za każdym razem. Tak jak ten specjalny kod do obsługi roku przestępnego, będzie działał tylko co cztery lata. Więc jeśli go wyjmiesz, Twój program będzie zepsuty co cztery lata.

Chyba nie odpowiedziałem na twoje pytanie o DUnit i Code Reportaż, ale myślę, że zostawiłam Ci więcej pytań, niż zaczęłaś. Jakiego rodzaju kodu szukasz?

UPDATE: jeśli stosujesz podejście TDD, żaden kod nie jest pisany, dopóki nie napiszesz dla niego testu, więc z natury masz 100 testów pokrycia. Oczywiście to, że każda metoda jest wykonywana przez test, nie oznacza, że cały jej zakres zachowań jest wykonywany. SmartInspect zapewnia naprawdę łatwą metodę pomiaru, który metody są wywoływane wraz z czasem itp. Jest trochę mniej niż AQTime, ale nie za darmo. Z nieco więcej pracy z twojej strony można dodać Oprzyrządowanie do pomiaru każdej ścieżki kodu (gałęzie poleceń "if", itp.) Oczywiście możesz również po prostu dodać własne logowanie do swoich metod, aby uzyskać raport pokrycia, a to jest bezpłatne(cóż, oczekuj na swój czas, który jest prawdopodobnie wart więcej niż narzędzia). Jeśli używasz debugowania JEDI, możesz również uzyskać stos połączeń.

TDD naprawdę nie może łatwo być stosowane z mocą wsteczną do istniejącego kodu bez dużej refaktoryzacji. Chociaż nowsze IDE Delphi mają możliwość generowania stubów testów jednostkowych dla każdej metody publicznej, co daje 100% pokrycia metod publicznych. To, co umieścisz w tych stubach, decyduje o skuteczności tego pokrycia.

 7
Author: Jim McKeeth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-10 17:47:18

Używam Discover dla Delphi i działa, do testów jednostkowych z DUnit i testów funkcjonalnych z TestComplete.

Discover można skonfigurować do uruchamiania z linii poleceń dla automatyzacji. Jak w:

Discover.exe Project.dpr -s -c -m
 5
Author: Tiago Moraes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-06 04:35:10

Discover działa świetnie dla mnie. To prawie spowalnia aplikację, w przeciwieństwie do AQTime. Oczywiście to może nie być dla ciebie problemem. Myślę, że najnowsze wersje AQTime działają lepiej pod tym względem.

 2
Author: Giel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-10 22:40:57

Używam Discover " od lat, działał doskonale aż do BDS2006 włącznie (który był ostatnią wersją Delphi Pre-XE* używałem i nadal używam), ale jego obecny stan opensourced, nie jest jasne, jak to zrobić, aby działał z wersjami Delphi XE*. Szkoda naprawdę, bo uwielbiałem to narzędzie, szybkie i wygodne pod każdym względem. Więc teraz przechodzę do Delphi-Code-coverage...

 1
Author: Kristofer Ganer Skaug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-05 13:00:03