Nose : Une extension unittest qui simplifie le testing sur Python

-
6
 m de lecture
-

Nose est un framework d'automatisation de test sur Python, basé sur la bibliothèque standard unittest. Découvrez ses avantages, ses caractéristiques, les différences entre les versions 1 et 2, et comment suivre une formation pour le maîtriser !

Le module unittest de Python est utilisé pour le testing unitaire de code source, notamment dans le domaine de la Data Science et du Machine Learning. Toutefois, ce framework par défaut requiert beaucoup de code et impose d’inclure les tests à de larges classes.

En guise d’alternative, il existe plusieurs frameworks d’automatisation de test tels que PyUnit, Pytest, Robot ou Cucumber. Ces outils permettent de simplifier le travail des développeurs sur le code de test.

De son côté, le framework d’automatisation Nose se présente comme une extension de unittest permettant de simplifier le testing. À travers ce dossier, découvrez tout ce que vous devez savoir !

Qu'est-ce que le framework Nose ?

Nose est un framework d’automatisation en Python, créé en 2005 par Jason Pellerin. Son objectif était de proposer les mêmes idiomes de test que py.test, à travers un package plus facile à installer et utiliser.

Bien qu’il soit basé sur unittest, son riche écosystème de plugins permet de simplifier le testing. Ses différents plugins aident à l’exécution de test, au testing parallèle ou multi-process, pour la gestion des logs et le reporting. Il permet aussi d’exécuter des doctests, des tests unitaires ou des tests sans code « boilerplate ».

En outre, les plugins ajoutent la prise en charge des décorateurs, des décorations, des tests paramétrés, des classes et des modules. Un autre avantage est la découverte de cas de tests et la collection automatique.

Qu'est-ce que Nose2 ?

Nose2 est le successeur de Nose, basé sur la branche de plugins de unittest2. Il offre une meilleure API de plugin et simplifie les processus et interfaces internes.

De nombreux plugins sont directement incorporés au module Nose2 et chargés par défaut. Ils aident notamment à la paramétrisation des tests, l’organisation de fixtures de test en couches, la capture de messages de log et le reporting.

L’exécution de test parallèle n’est toujours pas prise en charge, mais le chargement de plugins est très facile. Il suffit d’ajouter des noms de modules à la liste de plugins dans la section [unittest] du fichier de configuration. Il est aussi possible de passer le module de plugin à l’aide de l’argument -plugin sur la ligne de commande.

Malgré le lancement de Nose2 comme successeur officiel, de nombreux développeurs continuent d’opter pour la version 1.3.7. Les deux itérations du framework sont donc utilisées.

Le fonctionnement de la découverte de test avec Nose

La découverte de test avec Nose est régie par plusieurs règles. Comme tous les frameworks d’automatisation Python, Nose exécute automatiquement tous les tests présents dans le dossier parent et ses sous-dossiers.

Les modules ou fichiers sélectionnés par le framework doivent commencer par « ‘test_’ », au même titre que les méthodes. De même, les classes de test renfermant les méthodes doivent commencer par « ‘Test’ ».

Voilà quelques-unes des conventions de nommage utilisées pour le testing avec Nose. L’intégralité des règles est présentée sur le site web officiel de Nose.

Avec Nose2, un plugin implémente la découverte de test automatique. Ce plugin cherche les modules ou fichiers de test dans des packages et directoire dont les noms commencent par « test » et active le hook loadTestsFromModule() pour toutes les découvertes. Ceci permet aux autres plugins de charger les tests.

Définition et fonctionnement des fixtures

Le framework Nose permet les fixtures pour les méthodes setup et teardown au niveau du test, du package, de la classe ou du module. Ceci permet d’éliminer les initialisations inutiles pouvant atténuer les performances si les tests sont effectués fréquemment.

Comme pour les fixtures py.test ou unittest, la méthode setup est toujours exécutée avant un test ou une collection de tests. La méthode teardown se lance si la méthode setup a été exécutée avec succès.

Le statut du test en cours n’est pas pris en compte. Ainsi, Nose étend le modèle de fixture de unittest pour setup et teardown.

Les fixtures peuvent être effectuées à plusieurs niveaux. D’abord, pour les packages regroupant plusieurs tests, les méthodes setup et teardown sont lancées une fois par test run. Ceci évite la création de méthodes setup et teardown lancées une fois par module ou cas de test.

Il est aussi possible de définir les méthodes setup et teardown au niveau du module. Les méthodes respectives seront alors exécutées au commencement et à la fin du module.

Les fixtures peuvent aussi définir setup et teardown au niveau d’une fonction. Comme leurs noms l’indiquent, la setup_function et teardown_function sont exécutées avant et après un appel de fonction de test.

Il n’y a pas de convention de nommage spécifique, mais il est obligatoire d’appliquer la méthode setup avec le décorateur @with_setup importée depuis Nose.

Enfin, une classe de test est une classe définie dans un module de test correspondant à test_Match ou étant une sous-classe de unittest.TestCase. Les fonctions setup et teardown respectives sont exécutées au commencement et à la fin de la classe de méthodes de test. La méthode setup doit être appliquée avec le décorateur @classmethod.

Le testing paramétré

La version 1.3.7 du framework Nose n’offre pas de prise en charge directe pour le testing paramétré. Il est nécessaire d’utiliser le package « parameterized », anciennement appelé « nose-parameterized ».

Ce package est compatible avec tous les autres frameworks d’automatisation de test en Python. Il s’installe en tapant la commande « pip install parameterized » sur le terminal.

De son côté, Nose2 ne requiert pas l’installation d’un package séparé pour la paramétrisation de test. Davantage de types de tests paramétrés sont pris en charge. Les générateurs de test sont aussi pris en charge par les classes de test, les fonctions de test et les sous-classes TestCase d’unittest.

Le testing parallèle

Comme les autres frameworks de tests populaires, Nose prend en charge le testing parallèle. Le plugin nose.plugins.multiprocess peut être utilisé pour paralléliser le test run sur un nombre de processus configurable.

Cette approche permet d’accélérer les test runs CPU-bound, mais est aussi très bénéfique pour les tests IO-bound sur lesquels la plupart du temps est dépensé à attendre l’arrivée des données. Le site officiel de Nose regroupe toutes les informations approfondies sur le testing parallèle.

Le plugin mp introduit dans la version 0.3 de Nose2 permet la distribution de test sur de multiples processus. Il est toutefois important de vérifier que son usage ne crée pas de conflit.

Nose vs Nose2 : quelles différences ?

Nose et Nose2 présentent plusieurs différences majeures. Tout d’abord, Nose2 est disponible pour les versions Python actuelles tandis que le premier Nose est pris en charge que jusqu’à la version 2.4.

Tout comme unittest2, Nose2 ne prend en charge que les fixtures au niveau du module ou de la classe. Les fixtures au niveau du package ne sont plus prises en charge.

En outre, Nose2 n’a pas besoin d’un importateur custom puisque les modules de test sont importés avec __import__(). La prise en charge des tests paramétrés et générateurs est également étendue aux classes, fonctions et sous-classes TestCase d’unittest.

Alors que Nose utilise des points d’entrée setuptools pour le chargement de plugins, Nose2 ne charge aucun plugin sur le système de test et oblige à lister les plugins dans les fichiers de configuration.

Enfin, toutes les configurations doivent être effectuées via des fichiers de configuration sur Nose2. Ce n’est pas le cas avec la première version, car les paramètres de configuration doivent être disponibles comme options de ligne de commande. Il est donc préférable d’utiliser Nose2 pour effectuer des tests runs répétés, puisque la configuration est stockée sur des fichiers de configuration .cfg plus lisibles.

Comment utiliser Nose pour Pyhton ?

Pour installer le framework Nose, il suffit d’exécuter la commande « pip install nose » dans le terminal. Le package Nose peut être importé en utilisant « import nose » dans le code mais cette étape est optionnelle.

Si vous utilisez des modules spécifiques, il est nécessaire de les importer avec « import Nose.<module_name> » dans le code. Le module Nose étant installé à la fois pour la distribution Python existante et pour nosetests.exe, il est possible d’exécuter les tests avec les commandes « nosetests <file_name.py> » ou « python -m nose <file_name.py> ».

Pour installer Nose2, tapez la commande « pip install nose2 ». Le package Nose2 peut être importé en utilisant « importe nose2 » dans l’implémentation, et un module spécifique du package peut être importé avec « from nose2.<package_name> import <module_name> ».La commande pour exécuter un test avec Nose2 est « nose2 –verbose <filename_without_.py> ».

Conclusion : Nose simplifie l'automatisation de test

Vous connaissez désormais le framework Nose pour le testing. Cette extension de unittest simplifie le testing, et son principal avantage est d’éliminer le besoin de code boilerplate. Ses différents plugins ajoutent la prise en charge des décorateurs, fixtures, du testing paramétré et bien plus encore.

Afin d’apprendre à utiliser Python, ses frameworks et ses bibliothèques de Data Science et Machine Learning, choisissez DataScientest. Nos différentes formations comportent un module dédié à ce langage de programmation.

À travers ces cursus, vous pourrez acquérir toutes les compétences requises pour exercer les professions de Data Analyst, Data Scientist, Data Engineer, Machine Learning Engineer ou Data Product Manager.

Tous nos programmes peuvent être complétés en BootCamp ou formation continue, et notre organisme est éligible au Compte Personnel de Formation pour le financement. Découvrez DataScientest !

Vous savez tout sur Nose. Pour plus d’informations sur le même sujet, découvrez notre dossier complet sur Python et notre dossier sur SciPy.

Facebook
Twitter
LinkedIn

DataScientest News

Inscrivez-vous à notre Newsletter pour recevoir nos guides, tutoriels, et les dernières actualités data directement dans votre boîte mail.
Poursuivre la lecture

Vous souhaitez être alerté des nouveaux contenus en data science et intelligence artificielle ?

Laissez-nous votre e-mail, pour que nous puissions vous envoyer vos nouveaux articles au moment de leur publication !

Newsletter icone
icon newsletter

DataNews

Vous souhaitez recevoir notre
newsletter Data hebdomadaire ?