Framework de tests Python Nose : fonctionnalités internes détaillées

Plugins intégrés du cadre Nose

  1. Plugin attrib : catégorisation des cas de test Permet d'organiser les tests selon des critères personnalisés, comme la durée ou la priorité. Deux approches sont disponibles.

Exemple avec décorateur :

from nose.plugins.attrib import attr

@attr(category='long_running', priority=1)
def test_large_download():
    import urllib
    # Simuler une opération lente
    urllib.urlopen("http://example.com/largefile")

Exécution conditionnelle via ligne de commande :

$ nosetests -a category=long_running

Multiple attributs possibles :

$ nosetests -a priority=1,category=high

Ce mécanisme permet une exécution ciblée des tests selon des règles métier.

  1. Plugin capture : gestion de la sortie standard Par défaut, Nose capture la sortie stdout et stderr durant les tests. Pour désactiver ce comportement :
$ nosetests -s

Cette option est utile lorsqu’on souhaite voir immédiatement les affichages print() ou les logs en temps réel.

  1. Plugin collect : liste des tests à exécuter Utilisez --collect-only pour obtenir une vue d’ensemble des tests sans les exécuter :
$ nosetests --collect-only -v test_module.py
test_module.test_case_1 ... ok
test_module.test_case_2 ... ok

Très pratique pour vérifier le découpage des tests avant l’exécution.

  1. Plugin skip : sauter certains tests Permet d’ignorer des cas de test dynamiquement :
from nose.plugins.skip import SkipTest

@attr(env='dev')
def test_feature_in_dev_only():
    raise SkipTest("Fonctionnalité non disponible en production")

Exécution filtrée :

$ nosetests -a env=dev

Le test sera marqué comme « SKIP » dans les résultats.

  1. Plugin logcapture : journalisation des événements Capture les messages de logging pendant les tests. Configuration avancée via un fichier de configuration :

logging.conf :

[loggers]
keys=root,nose,myapp

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=verboseFormatter

[formatter_verboseFormatter]
format=%(asctime)s | %(levelname)-8s | %(name)s | %(funcName)s:%(lineno)d | %(message)s

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=verboseFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=handlers.RotatingFileHandler
level=INFO
formatter=verboseFormatter
args=('logs/test.log', 'a', 1048576, 5)

[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler

[logger_nose]
level=DEBUG
handlers=consoleHandler,fileHandler
qualname=nose
propagate=0

Utilisaiton :

$ nosetests -v --logging-config=logging.conf

  1. Plugin testid : identification numérique des tests Ajoute un identifiant unique à chaque test :
$ nosetests -v --with-id
#1 tests.test_a ... ok
#2 tests.test_b ... ok

Exécution par ID :

$ nosetests -v --with-id 2
#2 tests.test_b ... ok

  1. Plugin failed : exécution uniquement des tests échoués Après un échec, seul le test raté est relancé :
$ nosetests --failed
#1 test.test_failure ... FAILED

Lorsque tous les tests passent, --failed redevient global.

  1. Plugin xunit : sortie XML compatible JUnit Essentiel pour les pipelines CI/CD (comme Jenkins). Active la génération d’un rapport XML :
$ nosetests --with-xunit --xunit-file=results.xml

Dans Jenkins, configurez "Publish JUnit Test Result Report" avec results.xml.

  1. Options supplémentaires : -i, -e, -I
  • -i REGEX : exécute uniquement les tests dont le nom correspond au motif.
  • -e REGEX : exclut les tests correspondant au motif.
  • -I FILE : ignore un fichier entier.

Exemple :

$ nosetests -v -e test_regression

  1. Compléments pratiques
  • -s : désactive la capture de stdout/stderr.
  • -v : active les détails d’exécution, incluant les messages de log.

Rapports HTML (plugin tiers) Utilisez nose-html-reporting pour générer des rapports visuels :

$ nosetests --with-html --html-file=report.html

Affichage des commentaires en français Utilisez __doc__ pour ajouter des descriptions lisibles :

def test_cancel():
    u'''Tester l’annulation d’une opération'''
    raise SkipTest

@attr(mode='critical')
def test_fail():
    u'''Cas de test qui échoue intentionnellement'''
    print("Échec prévu")
    assert False

Les descriptions apparaissent dans les rapports générés.

Étiquettes: nose Testing Python Unit-Testing logging

Publié le 5 octobre à 02h53