Faire test unitaire

Résolu/Fermé
jun_1393 Messages postés 28 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 2 juin 2020 - 21 mai 2020 à 01:23
jun_1393 Messages postés 28 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 2 juin 2020 - 22 mai 2020 à 02:12
Bonjour,


J'aurais une question vis-à-vis pour faire de bon les tests unitaires avec JUnit.
Bien que j'ai fais quelque recherche je reste un peux perdu.
j'Ai trois classe dont une abstraite et je ne sais pas comment commencer.
je me retrouve avec le syndrome de la page blanche.
voici mes classe:
la classe abtraite
package tp3;

import java.util.ArrayList;
import java.util.List;

public abstract class AbstractProduit {
    private String nomProduit;
    private float prix;
    protected List<String> ingredientsPermis;


    public AbstractProduit(String nomProduit, float prix) {
        ingredientsPermis = new ArrayList<>();
        this.nomProduit = nomProduit;
        this.prix = prix;
    }

    public String getNomProduit() {
        return nomProduit;
    }

    public void setNomProduit(String nomProduit) {
        this.nomProduit = nomProduit;
    }

    public float getPrix() {
        return prix;
    }

    public void setPrix(float prix) {
        this.prix = prix;
    }
    /**
     * calcule la taxe avec le taux reçut comme parametre
     * @param taxePourcentage le taux de taxe à appliquer (ne peux etre negatif et superieur à 100)
     * @return le montant avec taxe appliqué
     */
    public double calculTaxe(int taxePourcentage) {

        assert taxePourcentage >100 :"taux superieur à 100";
        assert taxePourcentage <0 : "taux negatif inferieur à zero";
        assert taxePourcentage != 0 :"taux zero";
        //L'utilisateur doit passer un pourcentage de taxe  positif et inférieur à 100.
        return prix * (taxePourcentage / 100);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        AbstractProduit that = (AbstractProduit) o;

        return nomProduit.equals(that.nomProduit);
    }

    @Override
    public int hashCode() {
        return nomProduit.hashCode();
    }

    @Override
    public String toString() {
        return nomProduit +
                " coutant " + prix + "$";
    }

    public abstract void prepare(List<String> ingredients);



    //Pour les tests
    public List<String> getIngredientsPermis() {
        return ingredientsPermis;
    }
}


class AbstractProduitTest {

    @BeforeEach
    void setUp() {
    }

    @Test
    void calculTaxe() {
    }

}


ma classe kiosque methode a tester addproduit
public class Kiosque {
    private static List<AbstractProduit> produitsDisponibles = new ArrayList<>();

    /**
     *  Presentre le nombre de maximal de produit en regardant le nombre de produit disponible
     * @param nombreMaxPresente produit present (ne doit presenter plus de 100 produit)
     * @return le nombre de produit
     */

    public String presente(int nombreMaxPresente) {
        //La méthode ne doit pas présenter plus de 100 produits. C'est inutile d'en demander plus
        assert nombreMaxPresente > 100: "nombre depasse 100";
        assert produitsDisponibles != null :"liste vide ";

        String retString = "Nos produits sont :\n";
        for (int i = 0; i < nombreMaxPresente && i < produitsDisponibles.size(); i++) {
            AbstractProduit produit = produitsDisponibles.get(i);
            retString += produit.toString() + "\n";
        }
        return retString;
    }

    public Kiosque(List<AbstractProduit> produitsInitiaux) {
        produitsDisponibles.addAll(produitsInitiaux);
    }

    public void addProduit(AbstractProduit nouveauProduit) {
        produitsDisponibles.add(nouveauProduit);
    }

    //Pour les tests
    public static List<AbstractProduit> getProduitsDisponibles() {
        return produitsDisponibles;
    }

    public static void reset() {
        produitsDisponibles.clear();
    }

}


classe greme glace methode a tester toSting

public class CremeGlacee extends AbstractProduit {
    public enum Saveur {VANILLE, PISTACHE, CHOCOLAT}

    private Saveur saveur;

    public CremeGlacee(float prix, Saveur saveur) {
        super("crème glacée", prix);
        this.ingredientsPermis.addAll(List.of("CREME", "SUCRE", "OEUF", "VANILLE", "PISTACHE", "CHOCOLAT"));
        this.saveur = saveur;
    }

    @Override
    public void prepare(List<String> ingredients) {
        // NOP
    }

    static boolean estMajuscule(char ch){
        int ascii = (int) ch;
        //[A..Z]
        if((ascii>=65 && ascii<=90)
                //les lettres accentuées
                || (ascii>=192 && ascii<=223))
            return true;
        return false;
    }

    /**
     * verifie que les ingredient enté sont permit
     * @param ingredient les ingredients avec lesquelles on va comparé avec ingredientPermis pour savoir si il sont permit ( ils doivent etre en majuscule)
     * @return vrai si l'ingredient est permis
     */

    public boolean valideIngredient(String ingredient) {
        boolean retVal = false;

        // ingredient pas null et non vide (pas de "")
        // IMPORTANT :les noms d'ingrédients tout en majuscule

        assert String ingredient != null: "est null";
        assert String ingredient != "": "est null";
       // assert estMajuscule(ch ) =false: "est miniscule";
        //On cherche si l'ingrédient recu en paramètre est permis
        if (ingredientsPermis.contains(ingredient)) {
            retVal = true;
        }

        return retVal;
    }


    @Override
     String toString() {
        return " à saveur de " + saveur + super.toString();
    }

}

2 réponses

KX Messages postés 16635 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 27 novembre 2022 2 982
Modifié le 21 mai 2020 à 13:55
Bonjour,

Cannot resolve method 'calculeTaxe' in 'CremeGlacee.
En effet, la méthode "calculeTaxe" n'existe pas, en tout cas pas avec ce nom là, il y a un "e" en trop pour correspondre à la méthode "calculTaxe" de AbstractProduit.

Je ne sais pas ce que tu utilises comme éditeur pour écrire ton code, mais sur Eclipse (par exemple) en survolant l'erreur tu aurais des suggestions de correction, la première d'entre elle étant la bonne (pour cette erreur).



Remarque : dans tes classes de tests tu n'as aucune assertions, cela ne sert donc à rien, il faut que tu contrôles le résultat du code avec les résultats théoriques attendus. Exemple :

@Test
public void calculTaxe() {
    AbstractProduit produit = new AbstractProduit("test", 42) {
        @Override
        public void prepare(List<String> ingredients) {
        }
    };

    Assertions.assertAll("Tests avec un produit dont le prix est 42",
    () -> {
        AssertionError e = Assertions.assertThrows(AssertionError.class, () -> produit.calculTaxe(-1), "Les taux négatifs devraient être interdits");
        Assertions.assertEquals("taux negatif inferieur à zero", e.getMessage(), "Un message devrait être indiqué pour les taux négatifs");
    },
    () -> {
        AssertionError e = Assertions.assertThrows(AssertionError.class, () -> produit.calculTaxe(0), "Les taux nuls devraient être interdits");
        Assertions.assertEquals("taux zero", e.getMessage(), "Un message devrait être indiqué pour les taux nuls");
    },
    () -> {
        AssertionError e = Assertions.assertThrows(AssertionError.class, () -> produit.calculTaxe(101), "Les taux supérieurs à 100 devraient être interdits");
        Assertions.assertEquals("taux superieur à 100", e.getMessage(), "Un message devrait être indiqué pour les taux supérieurs à 100");
    },
    () -> Assertions.assertEquals(0.42, produit.calculTaxe(1), "1% de 42 devrait donner 0.42"),
    () -> Assertions.assertEquals(4.2, produit.calculTaxe(10), "10% de 42 devrait donner 4.2"),
    () -> Assertions.assertEquals(42, produit.calculTaxe(100), "100% de 42 devrait donner 42"));
}

Ce test est correct, il échouera cependant car le code est faux, je te laisse le corriger, voici le message obtenu :
MultipleFailuresError: Tests avec un produit dont le prix est 42 (2 failures)
    AssertionFailedError: 1% de 42 devrait donner 0.42 ==> expected: <0.42> but was: <0.0>
    AssertionFailedError: 10% de 42 devrait donner 4.2 ==> expected: <4.2> but was: <0.0>

1
jun_1393 Messages postés 28 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 2 juin 2020
22 mai 2020 à 02:12
merci pour la correction;
pour le toString j'Ai utilisé un try catch et le problème à été réglé
0
jun_1393 Messages postés 28 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 2 juin 2020
21 mai 2020 à 08:52
mon code est complet maintenant cependant il y a des bugs pour les tests AbstractProduit.calculeTaxe() et CremeGlacee.toString() j'ai cherché des heures et je trouve pas le bug mais sa affiche Cannot resolve method 'calculeTaxe' in 'CremeGlacee.
voici mon code actuel
classe abstraite
import java.util.ArrayList;
import java.util.List;

public abstract class AbstractProduit {
    private String nomProduit;
    private float prix;
    protected List<String> ingredientsPermis;


    public AbstractProduit(String nomProduit, float prix) {
        ingredientsPermis = new ArrayList<>();
        this.nomProduit = nomProduit;
        this.prix = prix;
    }

    public String getNomProduit() {
        return nomProduit;
    }

    public void setNomProduit(String nomProduit) {
        this.nomProduit = nomProduit;
    }

    public float getPrix() {
        return prix;
    }

    public void setPrix(float prix) {
        this.prix = prix;
    }

    /*
     * calcule la taxe avec le taux reçut comme parametre
     * @param taxePourcentage le taux de taxe à appliquer (ne peux etre negatif et superieur à 100)
     * @return le montant avec taxe appliqué
     */
    public double calculTaxe(int taxePourcentage) {

        assert taxePourcentage <= 100 :"taux superieur à 100";
        assert taxePourcentage >= 0 : "taux negatif inferieur à zero";
        assert taxePourcentage != 0 :"taux zero";
        //L'utilisateur doit passer un pourcentage de taxe  positif et inférieur à 100.
        return prix * (taxePourcentage / 100);
    }


    @Override
    public boolean equals(Object o){
        if (this == o) return true;
        if (o ==null || getClass() !=o.getClass()) return false;

        AbstractProduit that = (AbstractProduit) o;

        return nomProduit.equals(that.nomProduit);
    }

    @Override
    public int hashCode() {
        return nomProduit.hashCode();
    }

    @Override
    public String toString() {
        return nomProduit +
                " coutant " + prix + "$";
    }

    public abstract void prepare(List<String> ingredients);



    //Pour les tests
    public List<String> getIngredientsPermis() {
        return ingredientsPermis;
    }
}



sa classe test
class AbstractProduitTest {


    CremeGlacee cg = new CremeGlacee(3.0f, CremeGlacee.Saveur.CHOCOLAT);
    @BeforeEach
    void setUp() {
        CremeGlacee cg = new CremeGlacee(3.0f, CremeGlacee.Saveur.CHOCOLAT);
    }


    @Disabled
    void prepare() {
        fail("methode à venir");
    }


    @Test
    void testCalculTaxe() {
        try{
            cg.calculeTaxe(15);
        }catch (AssertionError ae) {
            ae.getStackTrace();
        }
    }
    @Disabled
    @Test
    void testPrepare() {
        fail("methode à venir");
    }
}


ma classe cremeglacé
public class CremeGlacee extends AbstractProduit {
    public enum Saveur {VANILLE, PISTACHE, CHOCOLAT}

    private Saveur saveur;

    public CremeGlacee(float prix, Saveur saveur) {
        super("cr�me glac�e", prix);
        this.ingredientsPermis.addAll(Arrays.asList("CREME", "SUCRE", "OEUF", "VANILLE", "PISTACHE", "CHOCOLAT"));
        this.saveur = saveur;
    }

    @Override
    public void prepare(List<String> ingredients) {
        // NOP
    }

    static boolean estMajuscule(char ch){
        int ascii = (int) ch;
        //[A..Z]
        if((ascii>=65 && ascii<=90)
                //les lettres accentuées
                || (ascii>=192 && ascii<=223))
            return true;
        return false;
    }

    /**
     * verifie que les ingredient enté sont permit
     * @param ingredient les ingredients avec lesquelles on va comparé avec ingredientPermis pour savoir si il sont permit ( ils doivent etre en majuscule)
     * @return vrai si l'ingredient est permis
     */

    public boolean valideIngredient(String ingredient) {
        boolean retVal = false;

        // ingredient pas null et non vide (pas de "")
        // IMPORTANT :les noms d'ingrédients tout en majuscule

        assert ingredient != null: "est null";
        assert ingredient != "": "est null";
        // assert estMajuscule(ch ) =false: "est miniscule";
        //On cherche si l'ingrédient recu en paramètre est permis
        if (ingredientsPermis.contains(ingredient)) {
            retVal = true;
        }

        return retVal;
    }


    // il y avait une erreur ici
    // prend le toString de son parent abstract
    // le super devait etre placé pres return
    @Override
    public String toString() {
        return super.toString() +" à saveur de " + saveur; }
    }

sa classe test
<code java>
class CremeGlaceeTest {



    CremeGlacee cg = new CremeGlacee(3.0f, CremeGlacee.Saveur.CHOCOLAT);

    @BeforeEach
    void setUp() {
        CremeGlacee cg = new CremeGlacee(3.0f, CremeGlacee.Saveur.CHOCOLAT);
    }

    @Test
    void testToString() {
        String test =" créme glacée coutant 3.0$ à saveur de Chocolat";
        if (!(cg.toString().equals(test))){
            fail();
        }
    }

    @Disabled
    @Test
    void prepare() {
        fail("methode à venir");
    }
    @Disabled
    @Test
    void valideIngredient() {
        fail("methode à venir");
    }
}
0