如何在Python中的dev,test,prod中注入不同的环境变量

时间:2019-05-21 20:07:43

标签: python python-unittest

我以前使用过Flask,它提供了一种简单的方法来配置以不同模式运行的应用程序。 (开发,测试,生产...)

class BaseConfig:
    MY_PATH = "Something"

class DevelopmentConfig(BaseConfig):
    MY_PATH = "Something else"

# ...

我正在尝试构建类似的东西,但不使用Flask。这是我能找到的最简单的代码的结构:

-src
  - main.py
  - zip2h5
    - __init__.py
    - foo.py
-test
  - __init__.py
  - test_foo.py

对象Foo.py的方法path在开发人员模式下输出“ path / to / dev”,在测试模式下输出“ path / to / test”。在代码中编写if语句很麻烦,并且很难正确测试。使用环境变量似乎更好。如何以及在哪里设置Flask的配置?

# foo.py
class Foo():

    def __init__(self, name):
        self.name = name

    def path(self):
        return "path/in/dev"

# test_foo.py
class TestFoo(unittest.TestCase):

    def test_path(self):
        boo = Foo("Boo")
        expected = "path/in/test"
        self.assertEquals(boo.path(), expected)

请不要告诉我可以修补此方法。正如我所说的,这只是一个例子。

2 个答案:

答案 0 :(得分:0)

您可以通过os module获得您的流程环境。

您只需在开发和测试用例中为路径注入不同的环境变量即可。我不确定您如何运行测试,但是通常您可以执行类似PATH='path/in/test' tests.sh的操作来完成所需的操作。

我使用dotenv并将.env文件保留在项目根目录中以进行管理。我有一个基础测试类,它加载.env.test而不是.env进行测试配置。

答案 1 :(得分:0)

与Flask一样进行操作。具有多个Config类,然后将env用作参数,例如

class Foo():

    def __init__(self, name, env):
        self.name = name
        self.env = env

    def path(self):
      if self.env == 'TEST':
      #initialize TestConfig class here
         return TestConfigPath

test_foo.py

class TestFoo(unittest.TestCase):

    def test_path(self):
        boo = Foo("Boo")
        expected = "path/in/test"
        self.assertEquals(boo.path(), expected)