Comment spécifier un seul test dans un fichier avec nosetests?

102

J'ai un fichier appelé test_web.py contenant une classe TestWeb et de nombreuses méthodes nommées comme test_something ().

Je peux exécuter tous les tests de la classe comme ceci:

$ nosetests test_web.py 
...
======================================================================
FAIL: checkout test
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/me/path/here/test_web.py", line 187, in test_checkout
...

Mais je n'arrive pas à exécuter des tests individuels. Celles-ci me donnent des erreurs «Aucun test de ce type» lorsqu'elles sont exécutées dans le même PWD:

$ nosetests test_web.py:test_checkout
$ nosetests TestWeb:test_checkout

Qu'est-ce qui ne va pas ici?

opstastique
la source
ne peut pas vous aider à moins que vous ne puissiez poster vos cas de test ou un SSCCE , j'ai juste essayé la syntaxe que vous avez utilisée avec le nez sur ma machine et cela a bien fonctionné.
Jeff Tratner

Réponses:

148

Vous devez le spécifier comme ceci:, nosetests <file>:<Test_Case>.<test_method>ou

nosetests test_web.py:TestWeb.test_checkout

Voir la documentation

Volonté
la source
6
Pourquoi diable la bibliothèque utilise ":" au lieu de "."? ;)
omikron
2
Peut-être pour faciliter la délimitation entre un module et une classe?
Chris
@omikron quand j'ai spécifié le fichier, je n'ai eu aucune erreur d'importation
gabeio
2
Wow, c'est terrible, les bibliothèques python classiques, pas un souci pour les interfaces existantes
Dagrooms
16

Vous pouvez également spécifier un module:

nosetests tests.test_integration:IntegrationTests.test_user_search_returns_users
Michaeljoseph
la source
1
Je ne sais pas si c'est une version différente de Python ou nosetestsou quoi, mais cette syntaxe échoue. Ce qui fonctionne, cependant, c'est nosetests tests/test_integration:IntegrationTests.test_user_search_returns_users/.
:,
1
@dwanderson, les deux utilisations devraient fonctionner, selon nose.readthedocs.io/en/latest/usage.html#selecting-tests . Votre échec pourrait être causé par le fait que vous n'étiez testspas un module dans votre configuration?
michaeljoseph
1
Ahh, c'est vrai, j'ai oublié un __init__.pydans l' testsannuaire. Bien joué! Merci
dwanderson
11

Spécifier des noms sur la ligne de commande comme le suggèrent les autres réponses fonctionne et est utile. Cependant, lorsque je suis en train d'écrire des tests, je trouve souvent que je veux exécuter uniquement le test sur lequel je travaille, et les noms que je devrais écrire sur la ligne de commande deviennent assez longs et difficiles à écrire . Dans ce cas, je préfère utiliser un décorateur et un drapeau personnalisés.

Je définis wipd("décorateur de travaux en cours") comme ceci:

from nose.plugins.attrib import attr
def wipd(f):
    return attr('wip')(f)

Cela définit un décorateur @wipdqui définira l' wipattribut sur les objets qu'il décore. Par exemple:

import unittest
class Test(unittest.TestCase):

    @wipd
    def test_something(self):
        pass

Puis -a wippeut être utilisé sur la ligne de commande pour restreindre l'exécution du test à ceux marqués par @wipd.

Note sur les noms ...

J'utilise le nom @wipddu décorateur plutôt que @wippour éviter ce genre de problème:

import unittest
class Test(unittest.TestCase):

    from mymodule import wip    
    @wip
    def test_something(self):
        pass

    def test_something_else(self):
        pass

Le importfera du wipdécorateur un membre de la classe , et tous les tests de la classe seront sélectionnés. Le attribplugin vérifie la classe parente d'une méthode de test pour voir si l'attribut sélectionné existe également, et les attributs créés et testés par attribn'existent pas dans un espace séparé. Donc, si vous testez avec -a fooet que votre classe contient foo = "platypus", alors tous les tests de la classe seront sélectionnés par le plugin.

Louis
la source
3

Pour exécuter plusieurs tests spécifiques, vous pouvez simplement les ajouter à la ligne de commande, séparés par un espace.

nosetests test_web.py:TestWeb.test_checkout test_web.py:TestWeb.test_another_checkout
Skurpi
la source
0

Dans mes tests, spécifier des tests avec des noms de module ne fonctionne pas

Vous devez spécifier le chemin réel vers .py:

nosetests /path/to/test/file.py:test_function

Ceci avec nose==1.3.7

Stephen
la source
0

Mon exigence était d'exécuter un seul test dans un fichier de test qui se trouvait dans un autre répertoire Windows - cela a été fait à partir de l' invite de commande anaconda comme suit:

a effectué nos tests de:

(base) C:\Users\ABC\Documents\work\

mais test_MyTestFile.py et methodsFile.py étaient dans:

 (base) C:\Users\ABC\Documents\work\daily\

exécutez un test unique en incluant le chemin avec des guillemets comme suit:

(base) C:\Users\ABC\Documents\work>nosetests "daily\\test_MyTestFile.py:MyTestClass.test_add_integers"

test_MyTestFile.py ressemblait à ceci:

import methodsFile
import unittest

class MyTestClass(unittest.TestCase):

    def test_add_integers(self):
        assert methodsFile.add(5, 3) == 8

    def test_add_integers_zero(self):
        assert methodsFile.add(3, 0) == 3

methodsFile.py ressemblait à ceci:

def add(num1, num2):
        return num1 + num2
Grant Shannon
la source