2012-02-19 16 views
6

Sono abbastanza verde con test python, quindi questo potrebbe essere qualcosa che sto facendo male ..Python: AssertionError durante l'esecuzione di test del naso con una copertura

Quando eseguo i miei test, i corridori di test funziona bene e la copertura troppo .. ma tra i due ottengo un errore di asserzione:

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 

per rendere cosa più difficile, sto cercando di testare una linea di comando. Il che significa che ho dovuto dire copertura per coprire le chiamate subprocess.

Penso di aver ottenuto questa parte di lavoro poiché la copertura ora segnala una percentuale di copertura per lo script che viene eseguito. Ma dal momento che ho lavorato in copertura, non posso sbarazzarmi di AssertionError.

Qualche aiuto per capire cosa sarebbe sbagliato sarebbe molto apprezzato. Tutto il mio codice è disponibile su GitHub:

corsa rapida:

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

Grazie

Aggiornamento

Ho eseguito il test su un computer diverso e ho avuto la stessa AssertionError .. Inoltre una nuova TypeError. Anche in questo caso il test viene eseguito correttamente e la copertura sembra anche funzionare correttamente anche con quegli errori ..

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

risposta

3

Per quanto riguarda il NoneType is not callable error, si riportano di seguito alcuni elementi che possono aiutare.

Nel modulo plugintest.py da nose-1.1.2-py2.7.egg/nose/plugins/, linea 174, si può leggere la seguente riga:

from multiprocessing import Manager 

che porta il pacchetto multiprocessing.util da importare, e con esso una funzione di uscita da registrare:

atexit.register(_exit_function) 

Il problema sembra essere che multiprocessing.util caricato in plugintest viene scaricato prima che venga chiamato il numero _exit_function e la sua funzione sia definitiva tra l'altro.

Quindi, se si importa nel file setup.py:

from multiprocessing import util 

L'errore scompare.

A proposito, ho dovuto commentare alcune parti delle prove che sono state fallendo o modificare alcune righe di codice:

  • il comando -m non sembra essere valido;
  • Ho dovuto rinominare duke_conf.yml a duke_conf.yml;
  • i test che verificano se esistono file README.rst e LICENSE non sono riusciti (non ha avuto il tempo di controllare perché);

Spero che sia d'aiuto,