Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tests Unitaires pour gérer le temps échouent

gérer l'entrée et les sorties des véhicules dans un parking

    20 septembre 2020 à 21:53:48

    Bonjour, 

    Je suis novice en tests unitaires et cela fait plus de 10 jours que je cherche à tester les entrées et les sorties de véhicules dans un parking pour générer un ticket (gratuit si moins de 30 minutes), mon test échoue dans tous les coups..

    J'ai soupçonné la concordance (comparaison des millisecondes mais je crois que je compare la même valeur ?

    Merci d'avance

    // Classe qui compare les valeurs pour générer un ticket
    package com.parkit.parkingsystem.service;
    
    import com.parkit.parkingsystem.constants.DBConstants;
    import com.parkit.parkingsystem.constants.Fare;
    import com.parkit.parkingsystem.dao.TicketDAO;
    import com.parkit.parkingsystem.model.Ticket;
    
    public class FareCalculatorService {
    
    	private DBConstants dbConstants;
    
    	public static final int THIRTY_MINUTES = 1800000; // 30 * 60 * 1000
    	public static final int HOUR = 1440000; // 24 * 60 * 1000
    	public static final int TWINTY_FOUR_HOURE = 1440000; // 24 * 60 * 60 * 1000
    
    	private TicketDAO ticketDAO;
    
    	public void calculateFare(Ticket ticket) {
    		if ((ticket.getOutTime() == null) || (ticket.getOutTime().before(ticket.getInTime()))) {
    			throw new IllegalArgumentException("Out time provided is incorrect:" + ticket.getOutTime().toString());
    		}
    
    		int inHour = ticket.getInTime().getHours();
    		int outHour = ticket.getOutTime().getHours();
    
    		// TODO: Some tests are failing here. Need to check if this logic is
    		// correct
    
    		int duration = outHour - inHour;
    
    		String resultSet = DBConstants.RESULT_SET;
    
    		if (resultSet != null) {
    			switch (ticket.getParkingSpot().getParkingType()) {
    			case CAR: {
    				ticket.setPrice(100 / (5 * Fare.CAR_RATE_PER_HOUR));
    				break;
    			}
    			case BIKE: {
    				ticket.setPrice(100 / (5 * Fare.BIKE_RATE_PER_HOUR));
    				break;
    			}
    			default:
    				throw new IllegalArgumentException("Unkown Parking Type");
    			}
    		}
    
    		if (duration < HOUR) {
    
    			switch (ticket.getParkingSpot().getParkingType()) {
    			case CAR: {
    				ticket.setPrice(0.75 * Fare.CAR_RATE_PER_HOUR);
    				break;
    			}
    			case BIKE: {
    				ticket.setPrice(0.75 * Fare.BIKE_RATE_PER_HOUR);
    				break;
    			}
    			default:
    				throw new IllegalArgumentException("Unkown Parking Type");
    			}
    
    		}
    
    		if (duration < THIRTY_MINUTES) {
    
    		} else if (duration < 30) {
    			switch (ticket.getParkingSpot().getParkingType()) {
    			case CAR: {
    				ticket.setPrice(0);
    				break;
    			}
    			case BIKE: {
    				ticket.setPrice(0);
    				break;
    			}
    			default:
    				throw new IllegalArgumentException("Unkown Parking Type");
    			}
    
    		}
    
    		else {
    
    			switch (ticket.getParkingSpot().getParkingType()) {
    			case CAR: {
    				ticket.setPrice(duration * Fare.CAR_RATE_PER_HOUR);
    				break;
    			}
    			case BIKE: {
    				ticket.setPrice(duration * Fare.BIKE_RATE_PER_HOUR);
    				break;
    			}
    			default:
    				throw new IllegalArgumentException("Unkown Parking Type");
    			}
    
    		}
    	}
    }


    Classe des tests

    //Classe de test
    package com.parkit.parkingsystem;
    
    import static org.junit.jupiter.api.Assertions.assertEquals;
    import static org.junit.jupiter.api.Assertions.assertThrows;
    
    import java.util.Date;
    
    import org.junit.jupiter.api.BeforeAll;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    
    import com.parkit.parkingsystem.constants.Fare;
    import com.parkit.parkingsystem.constants.ParkingType;
    import com.parkit.parkingsystem.model.ParkingSpot;
    import com.parkit.parkingsystem.model.Ticket;
    import com.parkit.parkingsystem.service.FareCalculatorService;
    
    public class FareCalculatorServiceTest {
    
    	private static FareCalculatorService fareCalculatorService;
    	private Ticket ticket;
    
    	@BeforeAll
    	private static void setUp() {
    		fareCalculatorService = new FareCalculatorService();
    	}
    
    	@BeforeEach
    	private void setUpPerTest() {
    		ticket = new Ticket();
    	}
    
    
    @Test
    	public void calculateFareBikeWithLessThanThirtyMinutesFreeParkingTime() {
    		Date inTime = new Date();
    		inTime.setTime(System.currentTimeMillis() - (30 * 60 * 1000));// 30
    																		// minutes
    																		// parking
    																		// time
    																		// should
    																		// give
    																		// free
    		Date outTime = new Date();
    		ParkingSpot parkingSpot = new ParkingSpot(1, ParkingType.BIKE, false);
    
    		ticket.setInTime(inTime);
    		ticket.setOutTime(outTime);
    		ticket.setParkingSpot(parkingSpot);
    		fareCalculatorService.calculateFare(ticket);
    		assertEquals((0), ticket.getPrice());
    	}
    }



    • Partager sur Facebook
    • Partager sur Twitter

    Nobody is perfect I'm Nobody...

      21 septembre 2020 à 6:49:11

      Bonjour,

      Premier point qui m'interpelle, ce sont les valeurs de tes constantes 

      1. THIRTY_MINUTES > HOUR

      2. HOUR = TWINTY_FOUR_HOURE

      Deuxièmement, tu ne récupères que l'heure d'entrée / sortie (au lieu du time: ticket.getInTime().getTime()), donc tu n'obtiendras jamais 30mn, et tes tests avec les constantes en secondes échoueront systématiquement.

      Donc ton test échoue car tu n'utilises pas les mêmes unités (la fameuses phrase des profs : on ne mélange pas les choux et les carottes ;-) )

      Sinon, pourquoi ne pas utiliser les Date introduites en Java 8 qui permettent des manipulations plus simples (LocalDateTime) ?

      • Partager sur Facebook
      • Partager sur Twitter
        25 septembre 2020 à 16:56:46

        Merci JDesm pour ton message, désolé pour le retard de ma réponse,

        j'ai dû finalisé les cours :
        "Testez votre code Java pour réaliser des applications de qualité" et "Débuggez votre application Java"

        Pour mieux comprendre les comportements et les valeurs de mes méthodes...
        J'ai apporté quelques ajustements sur la classe mais sans pouvoir réussir les tests..

        J'ai expérimenté également LocalDateTime, alors à ce moment-là faut-il changer le type des attributs dans la classe "tickets" ? 

        package com.parkit.parkingsystem.service;
        
        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        
        import org.apache.logging.log4j.LogManager;
        import org.apache.logging.log4j.Logger;
        
        import com.parkit.parkingsystem.config.DataBaseConfig;
        import com.parkit.parkingsystem.constants.DBConstants;
        import com.parkit.parkingsystem.constants.Fare;
        import com.parkit.parkingsystem.dao.TicketDAO;
        import com.parkit.parkingsystem.model.Ticket;
        
        public class FareCalculatorService {
        
        	private DBConstants dbConstants;
        
        	private static final Logger logger = LogManager.getLogger("FareCalculator");
        
        	public DataBaseConfig dataBaseConfig = new DataBaseConfig();
        	private TicketDAO ticketDAO;
        
        	// Si le véhicule a déja été dans le parking au moins une fois pour
        	// appliquer la remise 5%
        	public String recurring_park() {
        		Connection con = null;
        		String ResultSet;
        
        		try {
        			con = dataBaseConfig.getConnection();
        			PreparedStatement ps = con.prepareStatement(DBConstants.RESULT_SET);
        			ResultSet rs = ps.executeQuery();
        		} catch (Exception ex) {
        			logger.error("Error fetching next next value", ex);
        		} finally {
        			dataBaseConfig.closeConnection(con);
        			return "0";
        		}
        
        	}
        
        	public void calculateFare(Ticket ticket) {
        		if ((ticket.getOutTime() == null) || (ticket.getOutTime().before(ticket.getInTime()))) {
        			throw new IllegalArgumentException("Out time provided is incorrect:" + ticket.getOutTime().toString());
        		}
        
        		int inHour = ticket.getInTime().getHours();
        		int outHour = ticket.getOutTime().getHours();
        
        		int inMinutes = ticket.getInTime().getMinutes();
        		int outMinutes = ticket.getOutTime().getMinutes();
        
        		int inDay = ticket.getInTime().getDay();
        		int outDay = ticket.getOutTime().getDay();
        
        		
        		int duration_hour = outHour - inHour;
        		int duration_in_Minutes = inMinutes - outMinutes;
        		int duration_in_Days = inDay - outDay;
        
        		// String resultSet = DBConstants.RESULT_SET;
        
        		double price_car_promo = 100 / (Fare.CAR_RATE_PER_HOUR * 5);
        		double price_bike_promo = 100 / (Fare.CAR_RATE_PER_HOUR * 5);
        
        		double add_promo_car_if_exist = 0;
        		double add_promo_bike_if_exist = 0;
        
        		/*
        		 * Constances class 'dbConstants'
        		 * 
        		 * 30 * 60 * 1000
        		 * public static final int THIRTY_MINUTES = 1800000;
        		 * 
        		 * 24 * 60 * 60 * 1000 
        		 * public static final int HOUR = 3600000;
        * 24 * 60 * 60 * 1000 * public static final int DAY = 86400000;
        */ if (duration_in_Minutes <= dbConstants.THIRTY_MINUTES) { // Tester si le véhicule est déjà passé dans le parking et appliquer // la promo 5% switch (ticket.getParkingSpot().getParkingType()) { case CAR: { logger.info("Info log message"); ticket.setPrice(0); break; } case BIKE: { ticket.setPrice(0); break; } default: throw new IllegalArgumentException("Unkown Parking Type"); } } else if (duration_hour <= dbConstants.HOUR && duration_in_Minutes >= dbConstants.THIRTY_MINUTES) { System.out.println("hour"); switch (ticket.getParkingSpot().getParkingType()) { case CAR: { ticket.setPrice(Fare.CAR_RATE_PER_HOUR - add_promo_car_if_exist); break; } case BIKE: { ticket.setPrice(Fare.BIKE_RATE_PER_HOUR - add_promo_bike_if_exist); break; } default: break; } } else { if (duration_in_Days >= dbConstants.DAY) { // Day switch (ticket.getParkingSpot().getParkingType()) { case CAR: { ticket.setPrice((duration_in_Days * (24 * Fare.CAR_RATE_PER_HOUR)) - add_promo_car_if_exist); break; } case BIKE: { ticket.setPrice((duration_in_Days * (24 * Fare.BIKE_RATE_PER_HOUR)) - add_promo_car_if_exist); break; } default: break; } } } } }



        • Partager sur Facebook
        • Partager sur Twitter

        Nobody is perfect I'm Nobody...

        Tests Unitaires pour gérer le temps échouent

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown