[JAVA] Traitons le test unitaire comme la respiration (Apex trigger edition)

Avant

Saleforce a une convention selon laquelle les classes ne peuvent pas être déployées sans une couverture de 75% ou plus.

Grande convention. Mais implémentez des tests unitaires "pour passer la couverture" Il existe de nombreux cas où diverses contre-indications ont été commises.

"A quoi sert le test unitaire? A quoi servent les règles?"

Découvrir une telle scène est une série de remèdes.

C'est embarrassant pour ceux qui étudient comment écrire correctement le TDD et les tests unitaires. J'ai décidé d'écrire sur la façon de guérir le test unitaire avec les souhaits suivants.

Classe d'exécution cible

Supposons que vous ayez une classe comme celle-ci qui commence après la mise à jour dans le déclencheur d'un objet appelé Dto1__c.

public with sharing class DtoHandler{
    public static void execute(Dto__c dto){
        if(dto.a == 'x'){
            //Traitement à insérer dans l'objet dto2
           insert new Dto2();
        }
    }
}

Avant la guérison

C'était comme ça.

@isTest static void testExecute(){
    Dto__c dto = new Dto(a='x', b='y');
    insert dto;
    update dto:
}

Oh, oh! La couverture augmente car elle se déplace comme ça avec un déclencheur.

trigger DtoTrigger on Dto__c (after update) {
    DtoHandler.execute(Trigger.New);
    munyamunya();
}

Eh bien, le fait que le test unitaire n'échoue pas signifie que le déclencheur sera exécuté sans échec. Il semble que je puisse garantir cela. (collatéral?) Ceci est un test de déclenchement, alors utilisons testDtoTrigger ().

Donc, si testExecute () est le test unitaire courant, munyamunya () est également exécuté? Je veux dire, que savez-vous en mettant simplement à jour les données? C'est tout.

Après la guérison


/*
 *Méthode de test DtoTrigger
 */
@isTest static void testDtoTrigger(){
    Test.startTest();
    Dto__c dto = new Dto(a = 'x');
    insert dto;
    //DtoTrigger.Exécuter la mise à jour du déclencheur
    //attendre: aucune erreur ne se produit lors de l'exécution de la mise à jour
    dto.a = 'y';
    update dto;
    Test.stopTest();
}
/*
 *méthode de test de la méthode d'exécution
 */
@isTest static void testExecute(){
    Test.startTest();

    //génération dto
    Dto__c dto = new Dto(a='y');

    //a = 'x'Sinon, l'enregistrement ne sera pas inséré
    DtoHandler.execute(dto);
    Dto2__c dto2_1 = [SELECT Id FROM Dto2__c];
    System.assertEquals(0,dto2_1.size());

    //a = 'x'Dans le cas de, l'enregistrement dto2 est inséré
    dto.a = 'y';
    DtoHandler.execute(dto);
    Dto2__c dto2_2 = [SELECT Id FROM Dto2__c];
    System.assertEquals(1,dto2_2.size());

    Test.stopTet();
}

Comment guérir

Tweet

Les gens qui ne sont pas habitués au TDD ou qui veulent faire du TDD mais la vitesse n'est pas suffisante. .. Qui dit Si vous continuez à corriger le malheureux test unitaire comme celui-ci, Je pense que c'est plus facile à comprendre si vous écrivez à partir d'un test unitaire. Puisqu'il existe de bonnes règles, faisons-en bon usage.

Recommended Posts

Traitons le test unitaire comme la respiration (Apex trigger edition)
Introduisons le framework Spock et écrivons un test unitaire comme un test
[rails] Faisons un test unitaire avec Rspec!
Quels sont les effets secondaires? ~ Faisons un petit test unitaire facilement ~