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

时间:2015-01-15 15:06:18

标签: python nosetests

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

4 个答案:

答案 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