Wprowadzenie
Nadszedł czas na moje pierwsze testy jednostkowe. Do nauki wykorzystałem moją aplikację Client-Server, którą stale rozbudowuję. W trakcie pisania testów, zorientowałem się, że mój kod jest niedoskonały i wymaga znacznej refaktoryzacji. Testy ujawniły brak niektórych funkcjonalności oraz fakt, że metody nie zwracały oczekiwanych wartości. Kod często był nietestowalny.
Ta lekcja pozwoliła mi zidentyfikować i naprawić wiele elementów aplikacji. Dzięki testom zrozumiałem, jak zrefaktoryzować kod, aby poprawić jego czytelność i organizację, a także dodać brakujące funkcjonalności. Po dokonanych zmianach w obrębie całej aplikacji na zaktualizowałem testy zapewniając, że program działa poprawnie i jest gotowy do dalszego rozwoju.
Wykonane prace
0. Link do repozytorium
Client-Server-Application
jakubBone • Updated Sep 2, 2024
1. Integracja z narzędziami do testowania:
- Dodanie bibliotek JUnit
- Dodanie Mockito do symulowania zależności w testach klas odpowiedzialnych za połączenie C/S
1. Dodanie i stała aktualizacja testów jednostkowych:
- Skupiłem się na klasach, które wg mnie były najistotniejsze do przetestowania:
UserManager
,MailBox
,MailService
,AccountUpdateHandler
,ClientConnection
,Client
,ServerConnection
,RequestFactory
,Admin
,JsonConverter
,ServerRequestService
2. Poprawki w obrębie całego kodu na podstawie testów:
- Na podstawie wadliwych wyników lub niewykonalnych testów wprowadziłem zmiany w kodzie:
- Poprawki logiki, zmiany nazw zmiennych, metod oraz ich wartości zwracanych
- Dodanie nowych getterów i setterów przy użyciu Lomboka
- Izolacja logiki, w tym stworzenie metod pomocniczych w celu lepszej modularności i łatwiejszego testowania
3. Wprowadzenie nowych i poprawa istniejących testów:
- Dodanie nowych klas testowych uwzględniajać powyższe zmiany w kodzie:
AccountUpdateHandlerTest
,ClientCommunicationTest
,ClientTest
,MailBoxTest
,MailServiceTest
,RequestServiceTest
,ServerConnectionHandlerTest
,JsonConverterTest
,AdminTest
- Refactoring testów poprzez poprawę nazw metod, usunięcie zbędnego kodu oraz uproszczenie logiki w celu zwiększenia czytelności i efektywności testów
Struktura kodu
Pakiety client
oraz server
:
- Client - nawiązywanie połączenia, komunikacja z serwerem, logowanie, wysyłanie żądań
- Server - nasłuchiwanie połączeń, obsługa żądań klientów
Pakiet mail
:
- Mail - reprezentuje wiadomość e-mail
- MailBox - zarządzanie skrzynką pocztową użytkownika
- MailService - operacje związane z e-mailami (wysyłanie, odbieranie, opróżnianie)
Pakiet user
:
- User - reprezentuje użytkownika, przechowuje dane użytkownika
- Admin - użytkownik z rolą administratora, zarządzanie innymi użytkownikami
- UserManager - zarządzanie rejestracją, logowaniem, uprawnieniami użytkowników
Pakiet utils
:
- JsonConverter - konwersja obiektów do/z formatu JSON
- Screen - wyświetlanie menu w konsoli
- UserInteraction - interakcja z użytkownikiem poprzez konsolę, pobieranie danych wejściowych od użytkownika
- ResponseMessage - formatowanie i zarządzanie wiadomościami odpowiedzi
Pakiet request
:
- Request - reprezentuje specyficzne zapytanie
- RequestFactory - tworzenie obiektów
Request
na podstawie typu żądania
- RequestService - obsługa tworzenia i wysyłania żądań
Pakiet handler
:
- AuthHandler - obsługa rejestracji i logowania
- ServerDetailsHandler - informacje o serwerze (czas działania, komendy)
- MailboxHandler - operacje na skrzynkach pocztowych (czytanie, opróżnianie)
- AccountUpdateHandler - zmiana haseł, usuwanie użytkowników, zmiana ról
- WriteHandler - wysyłanie wiadomości e-mail
- LogoutHandler - wylogowywanie użytkowników
- AdminSwitchHandler - przełączanie użytkowników przez administratora