2015-01-15 7 views
7

У меня есть набор тестов, который выполняется как часть более крупной структуры сборки, написанной на Python. Некоторые из тестов требуют параметров, которые я хочу передать с использованием переменных среды.nosetests framework: как передать переменные среды в мои тесты?

По-видимому, бегун с носетами имеет параметр env, который делает то, что я хочу, according to the documentation. Кажется, однако, что он не работает, как считалось, что он должен?

Вот минимальный тестовый сценарий, который иллюстрирует проблему:

#!/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'}) 

утверждение не удается, так как параметр env не получить передается к испытанию. Кто-нибудь знает, почему?

NB: Я работал вокруг проблемы путем запуска инструмента консоли 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() 

Однако, это чувствует, как ляп, и я по-прежнему заинтересованы в изучении использовать nose.run() должным образом.

ответ

4

Я не мог заставить env себя вести, но я придумал решение, которое я считаю более слабым, чем открытие подпроцесса. Вы можете изменить переменную os.environ перед вызовом nose.run(), и до тех пор, как тесты выполняются в том же процессе, тесты будут все видеть модифицированный 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

Вы все равно должны восстановить старый 'os.environ 'если вы делаете что-то еще после того, как тесты выполнялись, но это то, что можно учесть в методе, я думаю. Я приму это в качестве ответа. – Mihai

0

Я смотрел на источники носа (core.py и config.py) и проследил обработку аргумента env. Я думаю, что аргумент env не имеет значения, как вы думали. Это не для установки или добавления среды испытуемого. Это зависит только от параметров конфигурации, характерных для носа. Тем не менее, было бы неплохо иметь функцию, которую вы (и я тоже) искали.

0

Я столкнулся с тем же типом ситуации, когда во время тестирования требуется переменная окружения.

Я работал с использованием сценария bash, чтобы сначала задать переменную окружения, запустить тест, а затем unset переменную окружения.

В run_tests.sh:

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

Тогда в 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') 

Для запуска теста, сделать $ bash run_tests.sh

Смежные вопросы