2009-05-21 12 views
3

Est-il possible que le cadre de test des unités de nez effectue des tests pendant la phase de compilation d'un module?Tests unitaires avec nez: tests au moment de la compilation?

En fait, je voudrais tester quelque chose avec la structure suivante:

x = 123 
# [x is used here...] 
def test_x(): 
    assert (x == 123) 
del x # Deleted because I don't want to clutter the module with unnecessary attributes 

nosetests me dit que x est indéfini, car il fonctionne apparemment test_x() après avoir importé le module. Existe-t-il un moyen d'avoir le nez effectuer un test pendant la phase de compilation tout en ayant le module libre des ressources inutiles après leur utilisation?

+0

Etes-vous inquiet que la collecte des ordures ne fonctionne pas? –

+0

@ S. Lott: si vous ne faites pas "del x" dans mon exemple, je ne vois pas pourquoi x serait supprimé par le garbage collection, puisqu'il s'agit d'un attribut du module dans lequel il se trouve. Je fais donc confiance aux ordures collection, mais, à moins que je me trompe, ça ne marche pas dans mon exemple. Non? – EOL

Répondre

2

Selon le développeur principal du nez Jason Pellerin, le cadre de test des unités de nez cannot run tests during compilation. C'est une gêne potentielle si le module "construction" et les routines de test ont besoin d'accéder à une certaine variable (qui serait supprimée en l'absence de tests). Une option est de décourager l'utilisateur d'utiliser l'une de ces variables inutilement en ajoutant "__" à son nom (cela fonctionne également pour les variables utilisées dans la construction de classe: elles peuvent être l'une de ces variables "privées"). Une autre option, peut-être plus propre, est de dédier un module à la tâche: ce module contiendrait des variables qui sont partagées par le module "lui-même" (c'est-à-dire sans tests) et ses tests (et qui ne seraient pas partagés). pas pour les tests).

Le problème avec ces options est que les variables qui pourraient être supprimées s'il n'y avait pas de tests sont gardées en mémoire, simplement parce qu'il est préférable que le code de test les utilise. Au moins, avec les deux options ci-dessus, l'utilisateur ne devrait pas être tenté d'utiliser ces variables, et il ne devrait pas non plus avoir besoin de se demander ce qu'elles sont!

2

Une façon simple de gérer ce serait d'avoir un drapeau de test, et écrire:

if not TESTING: 
    del x 

Cependant, vous ne serez pas vraiment tester correctement vos modules que les tests seront en cours d'exécution dans différentes circonstances votre code.

La bonne réponse est que vous ne devriez pas vraiment vous soucier de nettoyer manuellement les variables, sauf si vous avez réellement eu des problèmes de performance majeurs à cause d'eux. Lire sur Premature Optimization, c'est un concept important. Répare les problèmes que tu as, pas ceux que tu pourrais avoir un jour.

+0

Merci pour la réponse! Je ne sais pas comment la variable TESTING que vous suggérez convient aux tests automatisés (du nez) ... Suggérez-vous d'avoir une fonction de configuration du nez qui définit la variable? J'ai essayé de le mettre dans une fonction de setUp() de nez, mais cela n'a pas fonctionné. Je n'appellerais pas toujours la suppression des variables inutiles d'optimisation prématurée: elle indique également aux utilisateurs que certaines variables ne sont plus pertinentes et n'ont aucune influence sur le code qui suit. – EOL

+1

@EOL: si vous voulez que les variables du module restent locales au module, utilisez les initiales _. Ou empaquetez vos tests dans une fonction afin que les variables soient supprimées lorsque la fonction se termine. –

+0

@ S. Lott: merci! J'utilise "_"; ce que je veux vraiment, c'est supprimer les variables qui ne sont plus utilisées (elles sont utilisées pour construire des attributs de classe).Je ne vois pas comment les mettre dans la fonction de test, car ils doivent être utilisés en dehors de cela (pendant la construction de classe) ... Il semble que les variables temporaires utilisées dans la construction de classe et les tests de nez ne fonctionnent pas bien ensemble? – EOL