我有一个测试套件,它作为更大的构建框架的一部分执行,用Python编写。一些测试需要参数,我想使用环境变量传递参数。
显然,nosetests的跑步者有一个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
参数未传递给测试。有谁知道为什么?
注意:我通过启动控制台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()
然而,这感觉就像一个kludge,我仍然有兴趣学习正确使用nose.run()
。
答案 0 :(得分:6)
我也无法让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()
答案 1 :(得分:1)
我查看了鼻子源(core.py和config.py)并跟踪了env参数的处理。我认为env论证并不像你想的那样。它不是用于设置或添加到被测者的环境。它仅适用于特定于鼻子的配置选项。 然而,拥有你(我也是)正在寻找的功能会很高兴。
答案 2 :(得分:1)
我解决这个问题的方法是使用 python-dotenv pip模块。我发现这比在test launcher shell脚本中手动设置然后取消设置每个变量更干净,更容易管理。
首先,运行:
pip install python-dotenv
现在,在项目根目录中创建一个名为.env.test
的文件,并在其中列出环境变量(每行一个)。例如:
FOO=bar
BAZ=qux
在名为tests/configuration.py
的文件中,放置以下内容:
from dotenv import load_dotenv, find_dotenv
def setup_testing_environment():
load_dotenv(find_dotenv(".env.test", raise_error_if_not_found=True))
现在,只要有测试文件,您只需调用最顶层的configuration.setup_testing_environment()
方法加载测试环境变量即可!
这是一个工作示例 - 创建一个名为./tests/test_env_vars.py
的示例测试文件,其中包含以下内容:
import os
import unittest
from tests.configuration import setup_testing_environment
setup_testing_environment()
class TestEnvironmentVars(unittest.TestCase):
def test_foo_env_var_exists(self):
self.assertEquals(os.getenv("FOO"), "bar")
def test_baz_env_var_exists(self):
self.assertEquals(os.getenv("BAZ"), "qux")
答案 3 :(得分: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