我有一个测试套件,它作为更大的构建框架的一部分执行,用Python编写.一些测试需要参数,我想使用环境变量传递参数.
根据文档显然,nosetests runner有一个env参数,可以满足我的需求.但是,似乎它不应该像它应该的那样工作?
这是一个最小的测试脚本,可以解释这个问题:
#!/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'})
Run Code Online (Sandbox Code Playgroud)
断言失败,因为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()
Run Code Online (Sandbox Code Playgroud)
然而,这感觉就像一个kludge,我仍然有兴趣学习nose.run()正确使用.
我也无法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()
Run Code Online (Sandbox Code Playgroud)
我解决这个问题的方法是使用python-dotenv pip 模块。我发现这比必须手动设置然后取消设置测试启动程序 shell 脚本中的每个变量更清晰、更易于管理。
第一次运行:
pip install python-dotenv
Run Code Online (Sandbox Code Playgroud)
现在,创建一个.env.test在项目根目录中调用的文件,并在其中列出环境变量(每行一个)。例如:
FOO=bar
BAZ=qux
Run Code Online (Sandbox Code Playgroud)
在名为 的文件中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))
Run Code Online (Sandbox Code Playgroud)
现在,只要你有一个测试文件,你所要做的就是调用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")
Run Code Online (Sandbox Code Playgroud)