Comment exécuter un seul test avec Nose in Pylons

152

J'ai une application Pylons 1.0 avec un tas de tests dans le répertoire test / fonctionnel. J'obtiens des résultats de test étranges et je veux juste exécuter un seul test. La documentation du nez dit que je devrais être capable de passer un nom de test sur la ligne de commande mais j'obtiens ImportErrors quoi que je fasse

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

J'obtiens la même erreur pour

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

Quelle est la syntaxe correcte?

Ben
la source

Réponses:

233

nosetests appname.tests.functional.test_controllerdevrait fonctionner, où le fichier est nommé test_controller.py.

Pour exécuter une classe et une méthode de test spécifiques, utilisez un chemin du formulaire module.path:ClassNameInFile.method_name, c'est-à-dire avec un signe deux-points séparant le chemin du module / fichier et les objets dans le fichier. module.pathest le chemin relatif du fichier (par exemple tests/my_tests.py:ClassNameInFile.method_name).

Antoine Leclair
la source
1
Ahhh, la seule combinaison que je n'ai pas essayée. soupir . Merci!
Ben le
2
Cela exécutera chaque test 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.
ryonlife
69
Pour exécuter une classe et une méthode de test spécifiques, utilisez un chemin du formulaire module.path:ClassNameInFile.method_name, c'est-à-dire avec un signe deux-points séparant le chemin du module / fichier et les objets dans le fichier.
James Murty
9
Pour toute autre personne confuse: module.pathest le chemin relatif du fichier (par exemple my_tests.py:ClassNameInFile.method_name), pas le chemin que vous utiliseriez dans une importdéclaration
bcoughlan
1
@bcoughlan J'ai ajouté ceci à la réponse! C'était vraiment déroutant.
schlamar
47

Pour moi, en utilisant Nosetests 1.3.0, ces variantes fonctionnent (mais assurez-vous d'avoir __init__.pydans votre dossier de 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 simples entre le nom du module et le nom de la classe.

Kee
la source
1
Merci pour la deuxième option, avec l'aide de bash autocomplete certainement la plus pratique.
Peter Kilczuk
Il convient de noter que pour appeler des tests paramétrés (ceux qui utilisent @ parameterized.expand), vous devez utiliser cette syntaxe: test_file.py:ClassNameInFile.MethodName_TestNumber, où TestNumber pourrait être 1, 2, 3, ... un par test paramétré
luca
2

Je dois ajouter l'extension de fichier ".py", c'est-à-dire

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

C'est peut-être parce que je n'ai aucune classe dans le fichier. Sans le .py, le nez se plaignait:

Impossible de trouver le test_func_xy appelable dans le fichier / chemin_à / mon_fichier: le fichier n'est pas un module python

Et cela bien que j'en ai un __init__.pydans le dossier /path_to/.

langlauf.io
la source
0

J'ai écrit ce petit script, basé sur les 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"
tfga
la source
0

Ce qui suit a très bien fonctionné pour moi:

nosetests test_file.py:method_name

Notez que mes tests n'étaient pas dans une classe. Les méthodes de test étaient dans un seul fichier.

Raptor
la source