2010-07-21 18 views
31

me han directorios que contienen los archivos denominados como: test_foo.pyPython unittest y el descubrimiento

Cada archivo es un caso de prueba.

me gustaría

1) Ejecutar todas las pruebas en un directorio desde la línea de comandos. Estoy usando unittest2, ya que estamos ejecutando Python 2.5.1. De uno de estos directorios traté de escribir esto en la línea de comando:

python -m unittest2 discover -p 'test_*.py' 

y varias variantes diferentes. No obtengo ningún error, pero no pasa nada. Esperaba que todas las pruebas dentro de todos los casos de prueba en ese directorio se ejecutaran y obtuviera resultados.

2) También probé con un script en el directorio en el que hice esto:

loader = unittest2.TestLoader() 
t = loader.discover('.') 

Si puedo imprimir la variable t, puedo ver mis casos de prueba, pero a partir de los documentos que no puedo entender qué hacer con el objeto cargador una vez que lo tengo.

Respuesta

23

Dale cómo se está tratando de utilizar unittest2 desde la línea de comandos en Python < 2.7, creo que puede haber perdido the note on the unittest2 PyPI page:

Nota

uso de la línea de comandos

En Python 2.7 Invoca las características de la línea de comandos unittest (incluida la prueba discover) con python -m unittest <args>. Como unittest es un paquete, y la capacidad de invocar paquetes con python -m ... es nueva en Python 2.7, nosotros no podemos hacer esto para unittest2.

En cambio, unittest2 viene con un script unidad2. Comando uso de la línea:

unit2 discover unit2 -v test_module 

También hay una copia de este script llamado unit2.py, útil para Windows que utiliza archivos de extensiones en lugar de líneas shebang para determinar qué programa para ejecutar archivos con extensiones. Ambos estos scripts están instalados por distutils.

¿Has probado el guión unit2 la que esta nota se recomienda como una alternativa para los pitones mayores para el "paquete de ejecución como script principal" característica de Python 2.7? Tal vez sus fuentes también podrían ser útiles para descubrir exactamente cómo descubrir y ejecutar pruebas desde su propio código, si eso es lo que prefiere hacer.

+0

Gracias Alex! Me perdí esa nota. Y ahora funciona ¿Has usado la nariz? ¿Lo recomiendas? Grandes libros por cierto, gracias por escribirlos. – Aaron

+0

@ Aaron, de nada! Sí, he utilizado la nariz felizmente en el pasado (todavía no sé si la reemplazaré o la reemplazaré con la nueva funcionalidad de prueba de unidad; todavía no estoy familiarizado con esta última). –

42

Me encontré con el mismo problema al ejecutar python -m unittest discover. Aquí hay una buena lista de verificación para verificar su configuración. Nose es más flexible con las configuraciones permitidas, pero no necesariamente mejor.

  1. Asegúrese de que todos los archivos/directorios comienzan con test.Haga no use test-something.py, ya que ese no es un nombre de módulo de python válido. Use test_something.py.

  2. Si está poniendo sus pruebas en un subdirectorio (por ejemplo, test/), asegúrese de crear un archivo test/__init__.py para que python trate el directorio como un paquete.

  3. Todas las definiciones de casos de prueba de clase deben extenderse unittest.TestCase. Por ejemplo

    class DataFormatTests(unittest.TestCase) 
    
+0

¿Hay alguna forma de agregar un script de arranque con el descubrimiento de prueba de unidad? – 010110110101

+0

También nombres de métodos, es decir 'test_does_something (self):' –

+1

Para mí, crear 'tests/__ init __. Py' resuelve el problema. – gzc

47

vez que han descubierto pruebas, puede ejecutar con un corredor de prueba.

import unittest2 
loader = unittest2.TestLoader() 
tests = loader.discover('.') 
testRunner = unittest2.runner.TextTestRunner() 
testRunner.run(tests) 

Al ejecutar el código anterior, los resultados de la prueba se imprimirán en la salida estándar.

+10

Este es el que estaba buscando, y la respuesta más directa a la pregunta original. Parece un poco diferente en 2.7; 'test_loader = unittest.defaultTestLoader.discover ('.')'; luego 'test_runner = unittest.TextTestRunner()'; luego 'test_runner.run (test_loader)' y estás bien. – Paul

+3

Este es el enfoque recomendado si necesita invocar mediante programación un corrector de prueba, por ejemplo desde un script personalizado o una instancia de 'Command'. –

Cuestiones relacionadas