2012-02-19 10 views
6

estoy bastante verde con las pruebas de pitón, así que esto podría ser algo que estoy haciendo mal ..Python: AssertionError cuando se ejecutan pruebas de la nariz con una cobertura

Cuando ejecuto mis pruebas, los corredores de prueba funciona bien y la cobertura también .. pero entre los dos me sale un error de aserción:

Traceback (most recent call last): 
    File "/usr/local/bin/coverage", line 9, in <module> 
    load_entry_point('coverage==3.5.1', 'console_scripts', 'coverage')() 
    File "/usr/local/lib/python2.7/dist-packages/coverage/cmdline.py", line 657, in main 
    status = CoverageScript().command_line(argv) 
    File "/usr/local/lib/python2.7/dist-packages/coverage/cmdline.py", line 526, in command_line 
    self.coverage.stop() 
    File "/usr/local/lib/python2.7/dist-packages/coverage/control.py", line 389, in stop 
    self.collector.stop() 
    File "/usr/local/lib/python2.7/dist-packages/coverage/collector.py", line 262, in stop 
    assert self._collectors[-1] is self 
AssertionError 

para hacer lo más difícil, estoy tratando de probar una utilidad de línea de comandos. Lo que significa que tuve que decirle a la cobertura que cubra las llamadas de subproceso.

Creo que obtuve esta pieza en funcionamiento ya que ahora la cobertura informa un% de cobertura para el script que se está ejecutando. Pero desde que obtuve cobertura trabajando no puedo deshacerme del AssertionError.

Alguna ayuda para entender lo que está mal sería muy apreciada. Todo el código está disponible en GitHub:

carrera rápida:

cd /tmp/ && git clone git://github.com/h3/django-duke-client.git 
cd django-duke-client && chmod a+x run_tests && ./run_tests 

Gracias

actualización

He corrido la prueba en un equipo diferente y me dio la misma AssertionError .. Además de una nueva TypeError. Una vez más las pruebas se ejecuta correctamente y cobertura también parece funcionar correctamente, incluso con esos errores ..

... 
Ran 9 tests in 1.324s 

OK 
Traceback (most recent call last): 
    File "/usr/local/bin/coverage", line 9, in <module> 
    load_entry_point('coverage==3.5.1', 'console_scripts', 'coverage')() 
    File "/usr/local/lib/python2.7/dist-packages/coverage/cmdline.py", line 657, in main 
    status = CoverageScript().command_line(argv) 
    File "/usr/local/lib/python2.7/dist-packages/coverage/cmdline.py", line 526, in command_line 
    self.coverage.stop() 
    File "/usr/local/lib/python2.7/dist-packages/coverage/control.py", line 389, in stop 
    self.collector.stop() 
    File "/usr/local/lib/python2.7/dist-packages/coverage/collector.py", line 262, in stop 
    assert self._collectors[-1] is self 
AssertionError 
Error in atexit._run_exitfuncs: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs 
    func(*targs, **kargs) 
    File "/usr/lib/python2.7/multiprocessing/util.py", line 284, in _exit_function 
    info('process shutting down') 
TypeError: 'NoneType' object is not callable 
Error in sys.exitfunc: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs 
    func(*targs, **kargs) 
    File "/usr/lib/python2.7/multiprocessing/util.py", line 284, in _exit_function 
    info('process shutting down') 
TypeError: 'NoneType' object is not callable 

Name        Stmts Miss Branch BrPart Cover Missing 
------------------------------------------------------------------------------ 
dukeclient/__init__     53  53  2  0  4% 1-93 
dukeclient/commands/__init__   41  33  6  2 26% 1-9, 12, 14-15, 17, 24-28, 34-43, 46-63 
... 

Respuesta

3

En cuanto a la NoneType is not callable error, se adjunta a continuación algunos elementos que pueden ayudarle.

En su módulo plugintest.py de nose-1.1.2-py2.7.egg/nose/plugins/, línea 174, se puede leer la siguiente línea:

from multiprocessing import Manager 

que lleva el paquete multiprocessing.util a ser importados, y con ella una función de salida a ser registrados:

atexit.register(_exit_function) 

El problema parece ser que multiprocessing.util que se carga en plugintest se descarga antes de llamar al _exit_function, y su función es definitiva iones por cierto.

Por lo tanto, si importa en su archivo setup.py:

from multiprocessing import util 

desaparezca el error.

Por cierto, tuve que comentar algunas partes en las pruebas que estaban fracasando o cambiar algunas líneas de código:

  • el comando -m no parece ser válido;
  • Tuve que cambiar el nombre duke_conf.yml a duke_conf.yml;
  • las pruebas que comprueban si los archivos README.rst y LICENSE existen están fallando (no tuve tiempo de comprobar por qué);

Espero que ayude,

Cuestiones relacionadas