2015-01-15 7 views
7

Ho una suite di test che viene eseguita come parte di un framework di compilazione più grande, scritto in Python. Alcuni test richiedono parametri, che voglio passare usando variabili d'ambiente.framework nosetests: come passare le variabili di ambiente ai miei test?

A quanto pare il runner nosetests ha un parametro env, che fa quello che voglio, according to the documentation. Sembra, tuttavia, che non funziona come dovrebbe?

Ecco uno script di test minima che esemplifica il problema:

#!/usr/bin/env python 
# pip install nose 

import os, nose, unittest 

class Test(unittest.TestCase): 
    def test_env(self): 
     self.assertEquals(os.environ.get('HELLO'), 'WORLD') 

if __name__ == '__main__': 
    nose.run(env={'HELLO': 'WORLD'}) 

L'asserzione fallisce, perché il parametro env non viene passata alla prova. Qualcuno sa perché?

NB: ho lavorato tutto il problema lanciando lo strumento console nosetests:

#!/usr/bin/env python 

import sys, os, nose, unittest, subprocess 

class Test(unittest.TestCase): 
    def test_env(self): 
     self.assertEquals(os.environ.get('HELLO'), 'WORLD') 

if __name__ == '__main__': 
    subprocess.Popen(['nosetests', sys.argv[0]], 
        env={'HELLO': 'WORLD'}).wait() 

Tuttavia, questo si sente come un ripiego, e mi sarebbe ancora interessato a imparare a usare correttamente nose.run().

risposta

4

Non è stato possibile ottenere env allo stesso modo, ma ho trovato una soluzione che considero un po 'meno kludgy dell'apertura di un sottoprocesso. È possibile modificare la variabile os.environ prima di chiamare nose.run(), e fino a quando i test sono in esecuzione nello stesso processo, i test saranno tutti vedere il modificata os.environ:

#!/usr/bin/env python 
import os, nose, unittest 

class Test(unittest.TestCase): 
    def test_env(self): 
     self.assertEquals(os.environ.get('HELLO'), 'WORLD') 

if __name__ == '__main__': 
    os.environ["HELLO"] = "WORLD" 
    nose.run() 
+0

Dovreste ancora per ripristinare il vecchio 'os.environ 'Se stai facendo qualcos'altro dopo l'esecuzione dei test, ma questo è qualcosa che può essere preso in considerazione in un metodo, immagino. Lo accetterò come risposta. – Mihai

0

Ho guardato le fonti naso (core.py e config.py) e tracciato la gestione dell'argomento env. Penso che l'argomento env non sia inteso come pensavi. Non è per l'impostazione o l'aggiunta all'ambiente del candidato. È solo per le opzioni di configurazione specifiche del naso. Tuttavia, sarebbe bello avere la funzione che tu (e anche io) stavamo cercando.

0

Mi sono imbattuto nello stesso tipo di situazione in cui è richiesta una variabile ambientale durante il test.

Ho lavorato su uno script bash per impostare prima la variabile ambientale, eseguire il test e quindi la variabile ambientale unset.

In run_tests.sh:

#!/bin/bash 
export HELLO='WORLD' 
nosetests -v 
unset HELLO 

Poi nel tests/test_env.py:

#!/usr/bin/env python 
import os, unittest 

class Test(unittest.TestCase): 
    def test_env(self): 
     self.assertEquals(os.environ.get('HELLO'), 'WORLD') 

Per eseguire il test, fare $ bash run_tests.sh

Problemi correlati