2015-03-27 6 views
5

Problemacome caricare file di risorse durante l'esecuzione di python unittest utilizzando processo contorto

Come parte del pitone unittest, alcuni file di input JSON devono essere caricati che esiste sotto la directory 'dati' che risiede nella stessa directory di prova il file py.

"pkg_resources" è utilizzato per questo scopo.

Funziona bene quando l'unittest è in esecuzione con Python. Ma fallisce quando si esegue con una prova contorta.

Il mio progetto ha una serie di test misti sia con test di python unittest sia con test di twisted.trial.unittest. quindi, vi è la necessità di eseguire entrambi i tipi di test con una prova a spirale in generale.

La directory '_trial_temp' viene aggiunta nel percorso quando si eseguono testcases con versione di prova. per favore, fammi sapere che c'è un modo per gestire questo?

struttura di directory Esempio:

myproject/ 
└── tests 
    ├── data 
    │ └── input.json 
    ├── trialTest.py 

trialTest.py

import unittest 
import inspect 
import pkg_resources 

class Test(unittest.TestCase): 
    def test_01_pathTest(self): 
     dataDirExists =  pkg_resources.resource_exists(inspect.getmodule(self).__name__, 'data') 
     print 'data exists: %s' % (dataDirExists) 

if __name__ == '__main__': 
    unittest.main() 

prova corsa utilizzando pitone e la sua uscita:

cd myproject 
python tests/trialTest.py 
data exists: True 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.000s 

OK 

prova di funzionamento utilizzando Python e la sua uscita:

cd myproject 
/usr/local/bin/trial tests/trialTest.py 
trialTest 
    Test 
    test_01_pathTest ... data exists: False 
                [OK] 

------------------------------------------------------------------------------- 
Ran 1 tests in 0.013s 

PASSED (successes=1) 
+0

Qual è il valore restituito da 'inspect.getmodule (self)' in questi due casi? –

+0

python: , prova:

risposta

4

Nel primo esempio, __name__ sarà impostato su __main__, e la directory tests verrà aggiunto automaticamente al sys.path. Funziona più o meno per caso; se sposti la tua chiamata unittest.main in un altro modulo, non sarai in grado di importarla nello stesso modo, e data potrebbe non apparire.

Nel secondo esempio, si trial, a seconda della presenza di un file __init__.py nella directory tests, impostare __name__ a uno o trialTesttests.trialTest; o forse anche myproject.tests.trialTest.

Si dovrebbe rinominare il modulo per test_trialtest.py in modo che sia scoperto da codice del modulo-piedi del processo correttamente, e quindi richiamare con un nome del modulo piuttosto che un nome di file. Ciò significa che dovresti avere una chiara idea di quale sia il nome del modulo myproject/tests/test_trialtest.pysupposto. myproject dovrebbe essere il sys.path? La directory principale?

Fondamentalmente, pkg_resources dipende intimamente dai dettagli degli spazi dei nomi in cui il codice viene caricato ed eseguito, quindi è necessario fare attenzione che tutto sia impostato in modo coerente.Se si assicura che tutto sia importato allo stesso modo, con lo stesso nome (mai come __main__, ad esempio), questo dovrebbe essere totalmente coerente tra trial e stdlib unittest; non c'è nulla di veramente speciale nel processo qui eccetto che lo stai eseguendo (trial stesso) `come lo script principale piuttosto che lo script di test come script principale.

+0

Grazie. Come hai detto, il contatto con un file __init__.py nella directory di test risolve questo problema. –

-1

posizionare un __init__.py nella directory test risolve il problema.

[[email protected] myproject]$ touch tests/__init__.py 
[[email protected] myproject]$ tree 
. 
├── tests 
   ├── data 
   │   └── input.json 
   ├── __init__.py 
   ├── trialTest.py 
   └── trialTest.pyc 

[[email protected] myproject]$ trial tests/trialTest.py 
tests.trialTest 
    Test 
    test_01_pathTest ... currModule: <module 'tests.trialTest' from '/home/durai/Worskspace/myproject/tests/trialTest.pyc'> 
currModule: tests.trialTest 
data exists: True 
                [OK] 

------------------------------------------------------------------------------ - 
Ran 1 tests in 0.016s 

PASSED (successes=1) 
Problemi correlati