Co wiemy po pierwszych zajęciach:
* Projekt podzielony jest na katalogi źródłowy - src, testowy - test, zasobów - resources.* W katalogu projektu umieszczony jest plik pom.xml odpowiadający za ustawienia Mavena, w pliku tym dodajemy odnośniki do zewnętrznych bibliotek i ustawienia budowania aplikacji.* Ustawienia loggera znajdziemy w pliku log4.properties w katalogu resources. W definicji loggera podajemy klasę w której jest zdefiniowany - będzie to jego nazwa, dzięki czemu łatwiej określić w przyszłości skąd pochodzi dany wpis.* Pracujemy na GIT - nowa funkcjonalność (nowy temat zajęć) zakładana jest na nowej gałęzi (ang. branch).
Przejdź do VCS -> Git -> Remotes
Dodaj wpis o repozytorium prowadzącego
nazwij je najlepiej jako PrzedmiotoweRepo
Wybierz Ctrl + T, aby odświeżyć zależności.
Jeżeli Ctrl+T z jakiegoś powodu nie ściągnie oczekiwanych zmian, to żeby wymusić ściągnięcie zmian wybierz VCS -> Git -> fetch.
Wtedy na liście branchy w prawym dolnym rogu ekranu powinieneś widzieć gałęzie z repo przedmiotowego i ze swojego.
Przejdź na gałąź TestAndDebugStart.
Jako że dodaliśmy nowe repozytorium, możliwe, że musisz ponownie skonfigurować mavena. Przejdź do zakładki Maven i sprawdź, czy widzisz goale (Lifecycle, Plugin, Dependencies), jeżeli nie, spróbuj odświeżyć Mavena. Jeśli to nie pomoże wybierz mały plus i wskaż plik pom.xml z dysku twardego. Następnie odśwież ponownie Mavena. To powinno pomóc - sprawdź, czy twoje pliki .java mają zielone kółko obok nich w zakładce Project.
Lista skrótów IdeaJ
Alt + Enter pokaż podpowiedź rozwiązania błędu
Ctrl + W, Ctrl + Shift + W zaznaczenie całej sekcji, rozszerzenie zaznaczenia, zawężenie zaznaczenia.
Ctrl + Shift + N wyszukanie pliku po nazwie
Shift + Shift wyszukiwanie wszędzie
Alt + Insert generuj kod
Ctrl + / zakomentuj line
Ctrl + Shift + / odkomentuj linie
Ctrl + E ostatnio otwierane pliki
Ctrl + Alt + L formatuj kod
Tab, Shift+Tab wcięcie, cofnij wcięcie
Shift + F6 zmiana nazwy
Ctrl + Shift + Alt + T refaktoruj
Ctrl + Alt + M wyekstraktuj metodę
Alt + Right/Left przełączaj zakładki
Ctrl + (klik na nazwie metody) pokaż użycie
Ctrl + Alt + (klik na nazwie metody) pokaż implementację
Ctrl + K służy do commitowania kodu lokalnie do repozytorium
Ctrl + Shift + K służy do commitowania kodu do zewnętrznego repozytorium
Ctrl + T służy do odświeżania projektu - ściągania zmian z serwera
Wykonaj
Przedź na branch TestAndDebugStart
Wyszukaj klasę o nazwie ClassThatHaveItAll (Ctrl + Shift + N).
Zformatuj kod (Ctrl + Alt + L).
Dodaj do klasy w nagłówku linijkę
List <Long> list;
Wybierz automatyczną poprawę błędu (Alt + Enter).
Następnie wybierz (Alt + Insert) wygeneruj konstruktor, oraz settery i gettery dla klasy.
Znajdź interfejs InterfaceOne (Ctr + Shift + f). Wyszukaj użycie i implementacje metody printMe() (Ctrl + click na nazwie metody) klikając na implementacje jak i definicje metody.
Poprzez wybór Run -> Debug lub wybierając na klasie prawym przyciskiem myszy Debug możemy debugować nasz kod.
Aby uruchomić kod lub uruchomić debuggowanie możesz też kliknąć na zielony trójkąt obok nazwy klasy.
Pomocne w debugowaniu są tzw. breakpointy, czyli miejsce w kodzie, w którym chcemy zatrzymać wywołanie kodu by móc podejrzeć wartości zmiennych i stan programu. Żeby dodać breakpoint klikamy obok numeru linii tak, by pojawiła się czerwona kropka.
Po kliknięciu prawym przyciskiem myszy możemy określić także specjalny warunek przy breakpoincie.
Po uruchomieniu trybu debug na dole pojawia się nam okno debugowania na którym wyświetlone są aktualne wartości zmiennych. Dodatkowo możemy wybrać przez Alt+F8 lub klikając na ikonę kalkulatora okno ewaluacji wyrażeń i wykonać ewaluację jakiegoś wyrażenia na obecnych wartościach zmiennych. Ewaluacja wyrażeń jest przydatna przy debugowaniu np. wartości list, których wartości nie jesteśmy w stanie przejrzeć pojedynczo.
Przy odpowiednich ustawieniach możliwe jest także debugowanie aplikacji działających na serwerze w czasie wykonywania (więcej na ten temat na przyszłych zajęciach).
Wykonaj
Uruchom klasę Breakpoints. Jaki błąd wystąpił?
Uruchom debug klasy Breakpoints.
Żeby zatrzymać wywołanie dodaj breakpoint w klasie.
Użyj F8 (lub strzałka w dół na panelu debugingu) aby przejść w wywołaniu kodu linijka po linijce.
Użyj StepInto F7 (strzała w prawo-dół na panelu debugingu) aby wejść w wywołanie metody.
Znajdź i popraw błąd.
Wykonaj
Uruchom klasę EvaluateExpressions. Jaki błąd wystąpił?
Ustaw breakpointa w metodzie ProcessElementAtIndex.
Otwórz okno ewaluacji wyrażeń i wpisz w nie list.get(index) .
Przechodź F9 (zielony trójkąt na panelu debug) do kolejnych wystąpień breakpointa i podglądaj wartości zmiennych.
By sprawdzić jak naprawdę wyglądają ostatnie elementy listy wpisz w oknie evaluacji następujący kod:
Collections.reverse(list);
list
Znajdź i popraw błąd.
Wykonaj
Uruchom klasę ConditionalBreak. Jaki błąd wystąpił?
On line 18, ustaw zwykły breakpoint, czy łatwo jest znaleźć błąd?
Ustaw w linii 18 warunkowy breakpoint tak, by zatrzymywał się przy spełnieniu warunku !EverythingIsOk.
Jak widzisz breakpoint nie działa, przenieś go do linii 19.
Uruchom kod, co wywołało błąd?
JUnit to biblioteka służąca do pisania testów kodu. Testy mają na celu kontrolę jakości kodu, różnych ścieżek wywołań a także tego czy nowe zmiany nie wprowadzają błędów i zachowują starą funkcjonalność.
Proces budowania wersji przez Maven domyślnie uruchamia wszystkie testy w procesie tworzenia pliku wykonywalnego.
Najpierw musimy dodać w pliku pom.xml zależność dla modułu testowego.
W naszym branchu jest już stworzona klasa testowa jednak by dodać nową należałoby wykonać poniższe operacje:
Wejdź do klasy AdvanceMath i wybierz Ctrl + Shift + T , kliknij create new Test. Aby osiągnąć to samo inaczej można wybrać nazwę klasy i kliknąć Alt + Enter i wybrać create test.
Biblioteka JUnit korzysta z tzw. adnotacji. Przed każdą metodą która ma być uruchamiana jako test umieszczamy @Test.
Inną istotną adnotacją jest @Before która pozwala nam zdefiniować operacje które będą wykonywane przed uruchomieniem każdego testu.
Przykładowa klasa testująca:
package second.junit;
import com.sun.xml.internal.ws.policy.AssertionSet;
import example.HelloWorld;
import org.apache.log4j.Logger;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class AdvanceMathTest {
AdvanceMath math;
final static Logger logger = Logger.getLogger(AdvanceMath.class);
@Before
public void setUp(){
logger.info("Odpalam setUpa");
math = new AdvanceMath();
}
@Test
public void additionTest() {
Integer a = math.addition(1,4);
assertTrue(a==5);
}
@Test
public void additionTestString() {
long a = math.addition("1",4);
Assert.assertEquals(5L, a);
}
@Test(expected = Exception.class)
public void additionTestString2() {
int a = math.addition("a1",4);
}
}
Test możemy uruchomić klikając na klasę i wybierając run lub przez zakładkę Maven -> Test. Testy są też dodawane automatycznie przy wykonaniu Install w zakładce Mavena.
Przykłady wykorzystania biblioteki JUnit :
Polecam spojrzeć na przykłady na temat testowania list i map.
Projekt z zakresu 1-3
Stworzenie programu, który będzie tworzyć listy mieszkańców i zapisywać je do pliku.
Użytkownik podaje korzystając z konsoli nazwę miasta i w kolejnej linii imię nazwisko i numer PESEL mieszkańca. Numer PESEL powinien być sprawdzany względem poprawności - co najmniej w zakresie sumy kontrolnej ostatniej cyfry.
W przypadku złego numeru PESEL podany wpis nie jest zapisywany do pliku a użytkownik otrzymuje komunikat o błędzie.
Każde uruchomienie tworzy nowy plik odpowiedzi (program nie odczytuje żadnych danych).
W przypadku podania dwa razy tego samego numeru PESEL a innego imienia i nazwiska wpis jest nadpisywany.
co 30 sekund licząc od pełnych minut wpisane odpowiedzi zostają automatycznie zapisane do pliku odp.txt. Odpowiedzi w pliku mają być posortowane względem miast (czyli miasto A - lista mieszkańców (mieszkańcy danego miasta nie muszę być posortowani).
Uwaga! Użytkownik może w programie wpisywać odpowiedzi w dowolnej kolejności.
co pełną minutę będzie pokazywać na ekranie komunikat "X minut do końca zajęć/przeryw". Zamodeluj godziny zajęć i przerw zgodnie z harmonogramem WMI UAM.
Napisz testy do danych klas - co najmniej dla metody sprawdzającej poprawność numeru PESEL, oraz metody sprawdzającej czy dany czas jest przerwą, czy zajęciami.
Proponuję kod tworzyć u siebie na repozytorium w gałęzi master.
Wykorzystano materiały z:
Make indents inside loops and if-statements
function foo() {
if ($maybe) {
do_it_now();
again();
} else {
abort_mission();
}
finalize();
}
You can deal with curly brackets also like this:
function foo()
{
if ($maybe)
{
do_it_now();
again();
}
else
{
abort_mission();
}
finalize();
}
Use blank lines consistently and as required. Blank lines may be used for separating code lines or line groups semantically for readability.
Character count of a line should be limited for readability.
Name variables, procedures, functions in sensible way, start with small letter and introduce new word with capital letter
studentsCounter;
listIterator;
averageOverLastWeek;
findBestInClass();
computeAverage();
Name classes in sensible way, start with capital letter and introduce new word with capital letter
NightShift;
FastCar;
Name constant values with all capital letters, separate words with _
DAYS_IN_THE_WEEK();
NUMBER_OF_SHIFTS();
Using space chars in code should also be consistent in whole application. Generally, situations below are suitable for using spaces:
Between operators and operands:
a += b , c = 0; (a == b)
Between statement keywords and brackets:
if (value) {, public class A {
After ';' char in loops:
for (int i = 0; i < length; i++)
Between type casters and operands:
(int) value , (String) value