Test Driven Development z uzyciem JUnit 5. Czesc 3

Luxoft Training
3 min readOct 14, 2021

Trzecia część naszego artykułu o programowaniu sterowanym testami w JUnit 5. Tym razem przyjrzymy się, jak przygotować aplikację do zarządzania lotami dla TDD.

3. Przygotowanie aplikacji do zarządzania lotami dla TDD

Aby przenieść aplikację do zarządzania lotami do TDD, musimy najpierw pokryć istniejącą logikę biznesową testami JUnit 5. Dodajemy zależności JUnit 5 (junit-jupiter-api i junit-jupiter-engine) do pliku pom.xml Mavena.

<dependencies>

<dependency>

<groupId>org.junit.jupiter</groupId>

<artifactId>junit-jupiter-api</artifactId>

<version>5.6.0</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.junit.jupiter</groupId>

<artifactId>junit-jupiter-engine</artifactId>

<version>5.6.0</version>

<scope>test</scope>

</dependency>

</dependencies>

Sprawdzając logikę biznesową, rozumiemy, że musimy sprawdzić scenariusze dodawania / usuwania pasażerów, udostępniając testy dla dwóch typów lotów i dwóch typów pasażerów. Zatem pomnożenie dwóch typów lotów przez dwa typy pasażerów daje w sumie cztery testy. Dla każdego z testów musimy zweryfikować możliwe operacje dodawania i usuwania.

Kierujemy się logiką biznesową dla lotu ekonomicznego i używamy zagnieżdżonych możliwości testowych JUnit 5, ponieważ testy mają wspólne podobieństwa między nimi i można je grupować: testy dla lotów ekonomicznych i testy dla lotów biznesowych.

public class AirportTest {

@DisplayName(“Given there is an economy flight”) #1
@Nested #1
class EconomyFlightTest { #1

private Flight economyFlight; #2

@BeforeEach #2
void setUp() { #2
economyFlight = new Flight(“1”, “Economy”); #2
} #2

@Test
public void testEconomyFlightRegularPassenger() {
Passenger mike = new Passenger(“Mike”, false); #3

assertEquals(“1”, economyFlight.getId()); #4
assertEquals(true, economyFlight.addPassenger(mike)); #5
assertEquals(1, economyFlight.getPassengersList().size()); #5
assertEquals(“Mike”, #5
economyFlight.getPassengersList().get(0).getName()); #5

assertEquals(true, economyFlight.removePassenger(mike)); #6
assertEquals(0, economyFlight.getPassengersList().size()); #6
}

@Test
public void testEconomyFlightVipPassenger() {
Passenger james = new Passenger(“James”, true); #7

assertEquals(“1”, economyFlight.getId()); #8
assertEquals(true, economyFlight.addPassenger(james)); #9
assertEquals(1, economyFlight.getPassengersList().size()); #9
assertEquals(“James”, #9
economyFlight.getPassengersList().get(0).getName()); #9

assertEquals(false, economyFlight.removePassenger(james)); #10
assertEquals(1, economyFlight.getPassengersList().size()); #10
}
}
}
W tym listingu:

  • Deklarujemy zagnieżdżoną klasę testową EconomyFlightTest i nadajemy jej etykietę “Biorąc pod uwagę, że istnieje lot ekonomiczny” za pomocą adnotacji @DisplayName # 1
  • Deklarujemy lot ekonomiczny i inicjujemy go przed wykonaniem każdego testu # 2
  • Podczas testowania, jak działa lot ekonomiczny ze zwykłym pasażerem, tworzymy Mike’a jako zwykłego pasażera # 3. Następnie sprawdzamy identyfikator lotu nr 4, czy możemy dodać Mike’a do lotu ekonomicznego i czy możemy tam znaleźć Mike’a nr 5 oraz czy możemy usunąć Mike’a z lotu ekonomicznego i czy Mike’a już tam nie ma # 6
  • Podczas testowania, jak działa lot ekonomiczny z pasażerem VIP, tworzymy Jamesa jako pasażera VIP # 7. Następnie sprawdzamy identyfikator lotu nr 8, czy możemy dodać Jamesa do lotu ekonomicznego i czy możemy tam znaleźć Jamesa nr 9 oraz czy nie możemy usunąć Jamesa z lotu ekonomicznego i czy James nadal tam jest
  • Postępujemy zgodnie z logiką biznesową lotu biznesowego i przekładamy ją na następujące testy

public class AirportTest {
[…]

@DisplayName(“Given there is a business flight”) #1
@Nested #1
class BusinessFlightTest { #1
private Flight businessFlight; #2

@BeforeEach #2
void setUp() { #2
businessFlight = new Flight(“2”, “Business”); #2
} #2

@Test
public void testBusinessFlightRegularPassenger() {
Passenger mike = new Passenger(“Mike”, false); #3

assertEquals(false, businessFlight.addPassenger(mike)); #4
assertEquals(0, businessFlight.getPassengersList().size()); #4
assertEquals(false, businessFlight.removePassenger(mike)); #5
assertEquals(0, businessFlight.getPassengersList().size()); #5

}

@Test
public void testBusinessFlightVipPassenger() {
Passenger james = new Passenger(“James”, true); #6

assertEquals(true, businessFlight.addPassenger(james)); #7
assertEquals(1, businessFlight.getPassengersList().size()); #7
assertEquals(false, businessFlight.removePassenger(james)); #8
assertEquals(1, businessFlight.getPassengersList().size()); #8

}
}
}

W tym listingu:

  • Deklarujemy zagnieżdżoną klasę testową BusinessFlightTest i nadajemy jej etykietę “Biorąc pod uwagę, że istnieje lot biznesowy” za pomocą adnotacji @DisplayName # 1.
  • Deklarujemy lot biznesowy i inicjujemy go przed wykonaniem każdego testu nr 2
  • Podczas testowania, jak lot biznesowy działa ze zwykłym pasażerem, tworzymy Mike’a jako zwykłego pasażera # 3. Następnie sprawdzamy, czy nie możemy dodać Mike’a do lotu biznesowego nr 4 i czy próba usunięcia Mike’a z lotu biznesowego również nie ma żadnego efektu nr 5
  • Podczas testowania, jak działa lot biznesowy z pasażerem VIP, tworzymy Jamesa jako pasażera VIP # 6. Następnie sprawdzamy, czy możemy dodać Jamesa do lotu biznesowego i czy możemy go znaleźć tam # 7 oraz że nie możemy usunąć Jamesa z lotu biznesowego i że James nadal tam jest # 8

Testy przebiegły pomyślnie.

Z powodzeniem zweryfikowaliśmy funkcjonalność aplikacji pisząc testy dla wszystkich scenariuszy wynikających z logiki biznesowej. Możliwe, że w prawdziwym życiu możesz zacząć pracę z aplikacją, która nie ma testów i chcesz przejść do TDD. Zanim to zrobisz, będziesz musiał przetestować aplikację w obecnej postaci.

Interesujesz się JUnit? Sprawdź nasze szkolenia

Catalin Tudose
Java and Web Technologies Expert

Originally published at https://www.luxoft-training.pl.

--

--