nosetests框架:如何将环境变量传递给我的测试?

Mih*_*hai 10 python nosetests

我有一个测试套件,它作为更大的构建框架的一部分执行,用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()正确使用.

Ale*_*sky 7

我也无法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)


Tom*_*pin 5

我解决这个问题的方法是使用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)