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?


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


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

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.


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

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.