2 votes

TDD : Test unitaire des appels asynchrones

Les gars :

Je travaille sur une application, et la construit avec des tests unitaires.

Cependant, je suis maintenant dans une situation où je dois tester des appels asynchrones. Par exemple,

- (void)testUserInfoBecomesValidWhenUserIsBuiltSuccessfully
{
    if ( ![userBuilder userInfoUpToDate] )
    {
        [userBuilder buildUser];
    }

    STAssertTrue([userBuilder userInfoUpToDate], @"User information is not valid before building the user");
}

Quelle est la pratique générale pour tester ce genre de choses ? userInfoUpToDate est censé être mis à jour de manière asynchrone.

Merci ! William

4voto

Vladimir Points 1462

On est parfois tenté de tester des choses que l'on ne teste pas habituellement en utilisant les tests unitaires. Cela vient essentiellement d'un malentendu et du désir de tout tester. Et puis vous réalisez que vous ne savez pas comment le tester avec les tests unitaires.

Vous feriez mieux de vous demander : qu'est-ce que je teste ici ?

Dois-je tester que les données ne sont pas disponibles tant que la demande n'est pas terminée ?

Vous pouvez alors écrire une version non-asynchrone du test qui vérifiera que les données sont disponibles après la fin de la requête.

Dois-je tester que la réponse a été enregistrée correctement après la demande ?

Vous pouvez également le tester en utilisant des drapeaux dans votre logique.

Vous pouvez effectuer tous les tests logiques sans exécuter de tests asynchrones.

Donc, au fond, je vous demanderais même pourquoi vous pensez avoir besoin de tester l'appel asynchrone ?

Les tests unitaires sont censés s'exécuter rapidement - considérez donc cela comme une raison supplémentaire de ne pas tester les appels asynchrones. Imaginez un système d'intégration continue qui exécute ces tests - il aura besoin de plus de temps.

En lisant vos commentaires sur une autre réponse, je pense qu'il n'est pas du tout courant d'utiliser l'asynchronisme dans les tests. Par exemple, Kent Beck dans son livre TDD mentionne que les tests unitaires simultanés sont possibles mais très rares.

Alors - qu'est-ce que vous voulez vraiment tester et pourquoi ?

2voto

Jon Reid Points 9726

Utilisez une boucle d'exécution, en interrogeant jusqu'à la fin ou jusqu'à ce qu'un délai d'attente soit atteint : https://codely.wordpress.com/2013/01/16/unit-testing-asynchronous-tasks-in-objective-c/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X