Como faço para executar um único teste com o nariz em pilões


152

Eu tenho um aplicativo Pylons 1.0 com um monte de testes no diretório test / funcional. Estou obtendo resultados de teste estranhos e quero apenas executar um único teste. A documentação do nariz diz que eu devo passar um nome de teste na linha de comando, mas recebo ImportErrors, não importa o que eu faça

Por exemplo:

nosetests -x -s sometestname

Dá:

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

Eu recebo o mesmo erro por

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

Qual é a sintaxe correta?

Respostas:


233

nosetests appname.tests.functional.test_controllerdeve funcionar, onde o arquivo é nomeado test_controller.py.

Para executar uma classe e método de teste específicos, use um caminho do formulário module.path:ClassNameInFile.method_name, isto é, com dois pontos separando o caminho do módulo / arquivo e os objetos no arquivo. module.pathé o caminho relativo para o arquivo (por exemplo tests/my_tests.py:ClassNameInFile.method_name).


1
Ahhh, a única combinação que eu não tentei. suspiro . Obrigado!
Ben

2
Isso executará todos os testes em um controlador / módulo de teste. Que tal executar um único método de teste? Algo como appname.tests.functional.test_controller.name_of_test_method.
precisa saber é o seguinte

69
Para executar uma classe e método de teste específicos, use um caminho do formulário module.path:ClassNameInFile.method_name, isto é, com dois pontos separando o caminho do módulo / arquivo e os objetos no arquivo.
James Murty

9
Para qualquer outra pessoa confusa: module.pathé o caminho relativo para o arquivo (por exemplo my_tests.py:ClassNameInFile.method_name), não é o caminho que você usaria em uma importdeclaração
bcoughlan

1
@bcoughlan Adicionei isto à resposta! Isso foi realmente confuso.
schlamar

47

Para mim, usando o Nosetests 1.3.0, essas variantes estão funcionando (mas verifique se você tem __init__.pyna sua pasta de testes):

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

Observe que dois pontos únicos entre o nome do módulo e o nome da classe.


1
Obrigado pela segunda opção, com a ajuda do bash autocomplete, definitivamente a mais conveniente.
Peter Kilczuk 06/02

Vale ressaltar que, para chamar testes parametrizados (aqueles que usam @ parameterized.expand), você deve usar esta sintaxe: test_file.py:ClassNameInFile.MethodName_TestNumber, em que TestNumber pode ser 1, 2, 3, ... um por teste parametrizado
luca

2

Eu tenho que adicionar a extensão de arquivo ".py", ou seja,

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

Talvez seja porque eu não tenho nenhuma classe no arquivo. Sem o .pynariz, estava reclamando:

Não é possível encontrar test_func_xy que pode ser chamado no arquivo / path_to / my_file: o arquivo não é um módulo python

E isso, embora eu tenha um __init__.pyna pasta /path_to/.


0

Eu escrevi este pequeno script, com base nas respostas anteriores:

#!/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"

0

O seguinte funcionou para mim muito bem:

nosetests test_file.py:method_name

Observe que meus testes não estão em uma classe. Os métodos de teste estavam em um único arquivo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.