2010-09-13 27 views
133

J'ai une application Pylons 1.0 avec un tas de tests dans le répertoire test/fonctionnel. Je reçois des résultats de test bizarres et je veux juste faire un seul test. La documentation du nez dit que je devrais être en mesure de fournir le nom d'essai à la ligne de commande, mais je reçois ImportErrors, peu importe ce que je faisComment exécuter un seul test avec le nez dans les pylônes

Par exemple:

nosetests -x -s sometestname 

donne:

Traceback (most recent call last): 
    File "/home/ben/.virtualenvs/tsq/lib/python2.6/site-packages/nose-0.11.4-py2.6.egg/nose/loader.py", line 371, in loadTestsFromName 
    module = resolve_name(addr.module) 
    File "/home/ben/.virtualenvs/tsq/lib/python2.6/site-packages/nose-0.11.4-py2.6.egg/nose/util.py", line 334, in resolve_name 
    module = __import__('.'.join(parts_copy)) 
ImportError: No module named sometestname 

Je reçois la même erreur pour

nosetests -x -s appname.tests.functional.testcontroller 

Quelle est la bonne Synt hache?

Répondre

206

nosetests appname.tests.functional.test_controller devrait fonctionner, où le fichier est nommé test_controller.py. Pour exécuter une classe de test et une méthode spécifiques, utilisez un chemin de la forme module.path:ClassNameInFile.method_name, c'est-à-dire avec un deux-points séparant le chemin du module/fichier et les objets dans le fichier. module.path est le chemin relatif au fichier (par exemple tests/my_tests.py:ClassNameInFile.method_name).

+1

Ahhh, une combinaison que je ne l'ai pas essayé. *soupir*. Merci! – Ben

+2

Cela exécutera tous les tests dans un contrôleur/module de test. Qu'en est-il de l'exécution d'une seule méthode de test? Quelque chose comme 'appname.tests.functional.test_controller.name_of_test_method'. –

+66

Pour exécuter une classe de test spécifique et une méthode, utilisez un chemin de la forme 'module.path: ClassNameInFile.method_name', c'est-à-dire avec un signe deux-points séparant le chemin du module/fichier et les objets du fichier. –

42

Pour moi, en utilisant nosetests 1.3.0 ces variantes travaillent (mais assurez-vous que vous avez __init__.py dans votre dossier tests):

nosetests [options] tests.ui_tests 
nosetests [options] tests/ui_tests.py 
nosetests [options] tests.ui_tests:TestUI.test_admin_page 

Notez que deux points unique entre le nom du module et le nom de la classe.

+1

Merci pour la deuxième option, avec l'aide de bash autocomplete certainement le plus pratique. –

+0

Juste ce que je cherchais, merci! – radtek

+0

Il convient de noter que pour appeler des tests paramétrés (ceux qui utilisent @ parametized.expand), vous devez utiliser cette syntaxe: test_file.py:ClassNameInFile.MethodName_TestNumber, où TestNumber peut être 1, 2, 3, ... one par test paramétré – luca

2

Je dois ajouter l'extension de fichier « .py », qui est,

r'/path_to/my_file.py:' + r'test_func_xy' 

Peut-être que c'est parce que je n'ai pas cours dans le fichier. Sans le .py, le nez se plaignait:

Can't find callable test_func_xy in file /path_to/my_file: file is not a python module

Et ce même si j'ai un __init__.py dans le dossier /path_to/.

0

J'ai écrit ce petit script, sur la base des réponses précédentes:

#!/usr/bin/env bash 

# 
# Usage: 
# 
#  ./noseTest <filename> <method_name> 
# 
# e.g.: 
# 
#  ./noseTest test/MainTest.py mergeAll 
#  
# It is assumed that the file and the test class have the _same name_ 
# (e.g. the test class `MainTest` is defined in the file `MainTest.py`). 
# If you don't follow this convention, this script won't work for you. 
# 

testFile="$1" 
testMethod="$2" 

testClass="$(basename "$testFile" .py)" 

nosetests "$testFile:$testClass.test_$testMethod"