piątek, 3 stycznia 2014

sonar


 Continuous Inspection (Sonar)



Co dla Ciebie zrobi sonar ? 
- sprawdzi standard Twojego kodu (Coding standards) (Clean code)








- znajdzie potencjalne bugi (Potential bugs) (Quality)















- sprawdzi dokumentacje i komentarze w kodzie (Documentation and comments) (Clean code)




- znajdzie zduplikowany kod (Duplicated code) (DRY










- sprawdzi złożoność kodu (Complexity) (Clean code)











- sprawdzi pokrycie kodu testami (Test coverage) (Quality)


















- sprawdzi jakoś projektu i jego architektury (Design and architecture)(Quality,Clean code)





















Pełną dokumentacje i opis projektu Sonar znajdziesz tutaj
Stąd też pochodzi poniższy obrazek.




przykład analizy sonara znajdziesz tutaj

Opis siedmiu grzechów głównych programisty znajdziesz tutaj

Sposób obliczania metryk znajduje się tutaj

Dzięki sonarowi możemy spojrzeć w głąb naszego kodu, poznać go, odkryć potencjalne pułapki programistyczne, sprawdzić jakoś kodu oraz zdobyć wiedzę co jak programować lepiej.

Dostajemy klasyczne metryki jak : 
- linie kodu w pojekcie
- udokumentowane API
- złożoność i złożoność cykliczną 
- pokrycie oraz statystyki testów
- wykrywanie duplikacji w kodzie

Pamiętaj: Sonar is not a magic bullet !

Zaczynamy (instalacja):
Ściągamy paczkę ze strony sonara, rozpakowujemy i uruchamiamy jako serwis.
Cały ten proces znajdziecie tutaj.

Uwaga! (logging in to sonar for first time: username as admin and password as admin. )  
Potem tworzymy grupy i użytkowników (analogia do prawdziwego projektu) oraz instalujemy wygrane przez nas pluginy mające na celu poprawić nam zbieranie danych, analizę, ich prezentacje etc. Możemy określić sobie także reguły znajdowania issues w obrębie projektu.


Ja pokaże Wam jak zintegrować sonar z mavenem.
Przykład konfiguracja mavena jest tutaj



Odpalamy sonar na standardowym domyślnym porcie : localhost:9000

Teraz wystarczy tylko podać polecenie:
mvn  -Psonar sonar:sonar,  a maven rozpocznie proces analizy. 
Widzimy na konsoli coś w rodzaju takiego logu

Po wejściu na localhost:9000 pierwszą rzeczą którą zobaczymy będzie dashboard (entry point for every project).

 





Lines of code (LOC) - liczba linii kodu w projekcie z pominięciem dokumentacji (komentarzy)
Rules compliance - procentowa zagregowana wartość określająca całkowitą jakość

Build date - kiedy analiza miała miejsce
Links - wartości sprecyzowane w konfiguracji maven : scm, issue tracker etc

RCI indeks (weighted violations) :
 Blocker =5
 Critical =4
 Major =3
 Minor =2
 Info =1



Time Machine (project historical health)
Jedna z najważniejszych cech sonara. Pozwala wnioskować jak posuwa się projekt w czasie. Możny stwierdzić  czy zwiększa lub zmniejsza się złożoność kodu, liczba problemów, ilość linii, klas, metod, pokrycie testami, etc.




Complexity
 
- It takes time for developers to understand them.
- Changes can lead to regressions if there is no automated unit tests on the modified components.



Generalnie complexity określa złożoność kodu. Jest to tak naprawdę ilość ścieżek którymi może przejść proces w kodzie.
Co to znaczy dla programisty? Jeśli złożoność wynosi np 4 to obowiązkiem programisty jest przetestować potencjalnie  każdą z nich oznacza to cztery testy jednostkowe.
Ponadto zajmuje czas developera potrzebny do zrozumienia kodu oraz powoduje pewien rodzaje regresji gdyż jak wyżej napisałem istnieje wiele możliwych ścieżek przejścia danego procesu - przez co testowanie jest bardziej skomplikowane.

Keywords incrementing the complexity: if, for, while, case, catch, throw, return (that is not the last statement of a method), &&, ||, ?
  • Notes:
    • else, default, and finally keywords do not increment the complexity.
    • a simple method with a switch statement and a huge block of case statements can have a surprisingly high complexity value (still it has the same value when converting a switch block to an equivalent sequence of if statements).
    • accessors are not considered as methods and so do not increment the complexity

Example: the following method has a complexity of 5

RFC

RFC stands for Response For Class.
Oblicza złożoność klas w odniesieniu do metod.
I tak:
  • +1 dla każdej metody w klasie
  • +1dla odwołania każdej metody w obrębie zasobu (getter i setter nie jest brany pod uwagę)
przykład:

LCOM4 - sprawdza czy nie tworzymy klasy która ma za dużą odpowiedzialność.
(solid - SRP). Pozwala określić nam czy możemy rozbić klasę na n.. innych czyli rozbić funkcjonalność.

 Issue

  - sprawdza standardy javy jak (checkstyle, findbug, pmd, jacoco) :
               -  konwencje nazewnicze
               - klasy, metody i deklaracje zmiennych
                  - wyrażenia : pętle, warunki etc
                  - layout oraz puste znaki
                  - wykrywa potencjalne bugi
                  - wykrywa brak pokrycia testami
                  - wykrywa zależności cykliczne
                  - wykrywa duplikaty i martwy kod



 
 Hotspots


Code review


Dostępne statusy :
•     Open: początkowy status
•     Resolved: problem rozwiązany
•     Reopened: otwórz ponownie do rozwiązania
•     Closed: rozwiązany - definitywnie zamknięty

Jeśli uważasz, że naruszenie nie kwalifikuje się za brać go teraz pod uwagę
masz opcję : False-Positive

Tip : Możesz włączyć powiadomienia mailowe.
Tip : Możesz włączyć alerty np 60% code coverage
Tip : Możesz stworzyć własne metryki

Issues Drilldown

'Drążenie w kodzie' pozwala zrobić coś na kształt code review. Użytkownik sonaru może poprzypisywać poszczególne issue do danej osoby wraz ze stosownym komentarzem oraz określić jego priorytet.
Lider projektu czy architekt może też uznać, że dany problem jest mało znaczący i odznaczyć go w ogóle.

Documentation and comments

Współczynnik pokrycia komentarzami obliczamy stosując wzór:








przykład z projektu Activiti BPM:










Duplication 

  Density of duplication = Duplicated lines / Lines * 100

przykład z projektu Activiti BPM:

a gdy rozwiniemy którą z klas podlegającą zasadzie DRY 















widzimy dwie klasy ze wspólnym kodem. Do nam należy decyzja co z tym zrobimy. Czy np zastosujemy wzorzec Template czy też wyniesiemy ten kod do jakiegoś Helpera lub przeniesiemy poprzez przekształcenie Extract Method do wyższej hierarchii abstrakcji. Pełna dowolność ;)

Condition coverage

Sprawdzamy pokrycie testami



Quick wins:

     Font size: wszystkie linie kodu
     Color: pokrycie testami ; czerwony (0 procent) do niebieskiego (100 procent)


Top risk :

      Font size: średnia złożoność na metodę
      Color: Pokrycie kodu testami;
                 czerwony  (0 procent) do niebieskiego (100 procent)

Clouds 

Pokazuje w formie tagów klasy czy komponenty systemu.  
Obrazuje w ten sposób ich pokrycie testami i   naruszenia polityki kontroli jakości (Rules compliance).

Tak naprawdę dostaje cztery wymiary danych : 
Coverage: kolor jest bardziej czerwony gdy pokrycie testami jest marne:)
Rules Compliance: kolor jest bardziej czerwony gdy naruszeń jest więcej
Quick wins: wielkość czcionki jest proporcjonalny do linii kodu
Top Risk: wielkość  czcionki jest proporcjonalny do złożoności





Design and architecture

Sprawdzamy zależności cykliczne między modułami .
   


















 
Kolor czerwony wskazuje na potencjalne problemy cyklomatyczne między pakietami.

Wskazówki:

Red > Yellow > Green
Najbardziej odpowiedni kolor dla naszego projektu to zielony.Każda zmiana barwy w stronę czerwonego oznacza kłopoty:)
(np: brak dokumentacji (API) jest oznaczany kolorem czerwonym)

Zbiór metryk dostępny jest tutaj

Dobre praktyki:

 - używaj filtrów do filtrowania interesujących Cię statystyk czy metryk.
 - skomponuj swój własny dashboard - pokaż rzeczy które naprawdę są dla  Ciebie ważne w projekcie
- utwórz swoje własne reguły (own violations create)
- zainstaluj plugin sonara do swojego IDE (eclipse taki posiada)
- włącz powiadomienia
- włącz automatyczne alerty
- technical dept - określ współczynniki dla kosztów refaktoringu
- violation density plugin 
- Useless Code Tracker plugin - wykrywany nieużywany kod
- pełna integracja z CI (jenkins , sonar plugin)

dalej ->

Brak komentarzy:

Prześlij komentarz