Como posso especificar um único teste em um arquivo com nosetests?

102

Eu tenho um arquivo chamado test_web.py contendo uma classe TestWeb e muitos métodos nomeados como test_something ().

Posso executar todos os testes da classe assim:

$ 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
...

Mas não consigo fazer testes individuais. Isso me dá erros de “teste sem efeito” quando executado no mesmo PWD:

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

Oque pode estar errado aqui?

óptico
fonte
não posso ajudá-lo a menos que você possa postar seus casos de teste ou um SSCCE , eu apenas tentei a sintaxe que você usou com o nariz na minha máquina e funcionou bem.
Jeff Tratner

Respostas:

148

Você deve especificá-lo assim: nosetests <file>:<Test_Case>.<test_method>ou

nosetests test_web.py:TestWeb.test_checkout

Veja a documentação

Vai
fonte
6
Por que diabos a biblioteca usa ':' em vez de '.'? ;)
Omikron
2
Talvez para facilitar a delimitação entre um módulo e uma classe?
Chris
@omikron quando especifiquei o arquivo não tive nenhum erro de importação
gabeio
2
Uau, isso é terrível, bibliotecas python clássicas, sem preocupação com as interfaces existentes
Dagrooms
16

Você também pode especificar um módulo:

nosetests tests.test_integration:IntegrationTests.test_user_search_returns_users
michaeljoseph
fonte
1
Não sei se é uma versão diferente do Python nosetestsou o quê, mas essa sintaxe falha. O que funciona, entretanto, é nosetests tests/test_integration:IntegrationTests.test_user_search_returns_users/.
:,
1
@dwanderson ambos os usos devem funcionar, de acordo com o nose.readthedocs.io/en/latest/usage.html#selecting-tests . Sua falha pode ser causada por testsnão ser um módulo em sua configuração?
michaeljoseph
1
Ahh, isso mesmo, esqueci um __init__.pyno testsdiretório. Bem feito! Obrigado
dwanderson
11

Especificar nomes na linha de comando, como as outras respostas sugerem, funciona e é útil. No entanto, quando estou escrevendo testes, muitas vezes descubro que quero executar apenas o teste no qual estou trabalhando, e os nomes que eu teria que escrever na linha de comando ficam bem longos e complicados de escrever . Nesse caso, prefiro usar um decorador e uma bandeira personalizados.

Eu defino wipd("decorador de trabalho em andamento") assim:

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

Isso define um decorador @wipdque definirá o wipatributo nos objetos que ele decora. Por exemplo:

import unittest
class Test(unittest.TestCase):

    @wipd
    def test_something(self):
        pass

Em seguida, -a wippode ser usado na linha de comando para restringir a execução do teste àqueles marcados com @wipd.

Nota sobre os nomes ...

Estou usando o nome @wipddo decorador em vez de @wipevitar este tipo de problema:

import unittest
class Test(unittest.TestCase):

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

    def test_something_else(self):
        pass

O importfará com que o wipdecorador de um membro da classe , e todos os testes na classe será selecionado. O attribplug-in verifica a classe pai de um método de teste para ver se o atributo selecionado existe lá também, e os atributos que são criados e testados por attribnão existem em um espaço segregado. Portanto, se você testar com -a fooe sua classe contém foo = "platypus", todos os testes da classe serão selecionados pelo plug-in.

Louis
fonte
3

Para executar vários testes específicos, você pode simplesmente adicioná-los à linha de comando, separados por espaço.

nosetests test_web.py:TestWeb.test_checkout test_web.py:TestWeb.test_another_checkout
Skurpi
fonte
0

Em meus testes, a especificação de testes com nomes de módulos não funciona

Você deve especificar o caminho real para .py:

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

Isso com nose==1.3.7

Stephen
fonte
0

Meu requisito era executar um único teste em um arquivo de teste que estava em outro diretório do Windows - isso foi feito no prompt de comando do anaconda da seguinte maneira:

executou nosetests de:

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

mas test_MyTestFile.py e methodsFile.py estavam em:

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

execute um único teste incluindo o caminho com aspas da seguinte maneira:

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

test_MyTestFile.py tinha esta aparência:

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

métodosFile.py tinha a seguinte aparência:

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