【问题标题】:Define variable for testing only in Python仅在 Python 中定义用于测试的变量
【发布时间】:2018-11-01 11:00:27
【问题描述】:

这可能是一个相对简单的问题,但我很难找到答案。

我正在开发一个小型 Python 项目,我想以测试驱动的方式进行。用户主目录中已定义文件夹中的文件操作对程序非常重要,但我希望这些操作发生在单独的临时文件夹中以进行测试。

如果应用程序意识到它作为测试环境的一部分运行,是否有办法在我的应用程序中设置不同的变量?我当前的解决方法(def some_function(self, test=False) 或包含大量 @patch 装饰器)不是很优雅...

我在想一些类似的事情:

def return_home_folder():
    if testing:
        home = os.getcwd() + '/testrun'
    else:
        home = os.path.expanduser('~')
    returnvalue = home + '/appname/'
    return returnvalue

【问题讨论】:

    标签: python testing python-unittest


    【解决方案1】:

    恕我直言,让函数在测试和生产中表现不同并不是一个好主意。测试的全部意义在于预测程序在生产环境中的行为,而改变行为会破坏这一点。

    (单元测试不同于“试运行”,但这是一个单独的问题。)

    我会选择这样的:

    def get_app_folder():
        return os.path.join(os.path.expanduser("~"), "appname")
    
    def test_get_app_folder():
        assert get_app_folder().startswith(os.path.expanduser("~"))
        assert get_app_folder().endswith("appname")
    

    单元测试本身并没有过多的指导性,但它们展示了如何完全解决“测试模式”的需求。

    【讨论】:

      【解决方案2】:

      您可以在环境变量中定义您的环境:

      $ export MY_APP_ENVIRONMENT=test
      

      settings.py 模块中阅读它:

      import os
      
      ENVIRONMENT = os.environ['MY_APP_ENVIRONMENT']
      
      _base_dir_map = {
          'test': os.path.join(os.getcwd(), 'testrun'),
          'prod': os.path.expanduser('~'),
      }
      
      HOME_DIR = os.path.join(_base_dir_map[ENVIRONMENT], 'appname')
      

      然后,在任何地方(测试和应用代码),您都可以使用settings.HOME_DIR

      import os
      from my_app import settings
      
      file_path = os.path.join(settings.HOME_DIR, 'filename')
      
      ...
      

      希望这对你有用,或者让你走上正轨。

      【讨论】:

        猜你喜欢
        • 2011-12-18
        • 2011-04-27
        • 2022-01-18
        • 1970-01-01
        • 2016-08-10
        • 1970-01-01
        • 1970-01-01
        • 2020-11-04
        • 2020-11-29
        相关资源
        最近更新 更多