Python 在测试中导入dag_生成器模块之前,使用os.environ设置环境变量

Python 在测试中导入dag_生成器模块之前,使用os.environ设置环境变量,python,python-2.7,environment-variables,Python,Python 2.7,Environment Variables,我(对我和我们生活的世界来说,不幸的是)仍然在使用Python 2.7 我正在尝试测试模块中的函数。该函数需要加载某些环境变量。为了避免由于无法加载这些变量(因为它们是通过不同的过程定义的)而出现错误,在运行测试之前,我确保为我需要的env变量提供模拟值。我会这样做: os.environ['gcs\u bucket']='test\u bucket' os.environ['gcp_region']='test_region' os.environ['gcp_project']='test_n

我(对我和我们生活的世界来说,不幸的是)仍然在使用Python 2.7

我正在尝试测试模块中的函数。该函数需要加载某些环境变量。为了避免由于无法加载这些变量(因为它们是通过不同的过程定义的)而出现错误,在运行测试之前,我确保为我需要的env变量提供模拟值。我会这样做:

os.environ['gcs\u bucket']='test\u bucket'
os.environ['gcp_region']='test_region'
os.environ['gcp_project']='test_nonlive'
os.environ['gce_zone']='test_zone'
os.environ['firewall\u rules\u tags']=“a,b”
os.environ['subnetwork\u uri']='https://test.com'
os.environ['service\u account']='test\u service\u account'
问题是,如果在导入测试中使用的模块后运行上述代码:

from orchestrator_template.dag_generator import create_dag
然后测试失败,说明环境变量不存在

但是,如果我先设置它们,然后加载模块,那么一切正常

显然,没有将我的导入放在测试模块的顶部让我感到困扰,因为这是一种糟糕的做法。此外,我不能将此代码推入,因为它违反了样式设置惯例

问题是:导入模块后如何加载这些内容?更重要的是,是否有办法重构
dag_generator.py
,使其不会像这样运行

完整测试模块如下(w.i.p.):

导入操作系统
从日期时间导入日期时间
从模拟导入补丁
从orchestrator_template.plugins.autoscale_dataproc_运算符导入DataprocCompCreateClusterOperator
从orchestrator_template.root导入根目录
从orchestrator_template.utils.config_utils导入生成_opco_配置
def测试生成opco配置()
#给定
预期的工作={
“开始日期”为“2019-11-01”,
“群集配置”:{
“群集属性”:{
'core:fs.gs.implicit.dir.repair.enable':'false',
'spark:spark.Comp.event.repo':'hdfs',
'spark:spark.Comp.metrics.repo':'hdfs'
},
“图片”:蓝色-dp-img-20191203-105432-21,
“初始行动”:[
'gs://europe-west1-composer-dev-f2efa347-bucket/dags/orchestrator_template/scripts/init action.sh'
],
'labels':{'use_case':'fixed'},
'master_config':{'master_machine_type':'n1-standard-8'},
“worker_config”:{
“num_可抢占工人”:1,
“工人数量”:4,
“工人机器类型”:“n1-standard-32”}
},
“默认路径”:“脚本/属性/红色代理”,
“失败时发送电子邮件”:“错误”,
“重试时发送电子邮件”:“错误”,
“名称”:“FixedEventsDaily”,
“opco”:“it”,
“任务”:[{
“args”:[
“--nodes=FixedLineMDCEventModel、TTOpenEvent、TTClosingEvent、FixedEventsWideIT”,
“--nodes=fixedJourneyForecast”,
“--opco_代码=it”,
“--开始日期=20191101”,
'--结束日期=20191101'],
“任务”:“FixedEventsDaily”}]}
#什么时候
作业=生成操作配置(os.path.join(根目录,“测试/配置”))
#然后
断言作业。\uuuu len\uuuu()==1
断言作业[0]==预期的\u作业
#注意!:不要改变执行顺序。必须在导入“创建”dag之前设置以下环境变量`
def set_default_test_vars():
os.environ['gcs_bucket']='test_bucket'
os.environ['gcp_region']='test_region'
os.environ['gcp_project']='test_nonlive'
os.environ['gce_zone']='test_zone'
os.environ['firewall\u rules\u tags']=“a,b”
os.environ['subnetwork\u uri']='https://test.com'
os.environ['opco']='it'
os.environ['service\u account']='test\u service\u account'
设置默认值测试变量()
从orchestrator_template.dag_生成器导入创建_dag
@修补程序(“orchestrator\u template.dag\u generator.list\u files\u from\u gcp”)
def test_初始化_action_属性_为空(来自\u gcp的模拟列表文件):
#给定
dag_id='job_{}{}'。格式(“TestDag”,“1”)
默认参数={
“所有者”:“气流”,
“开始日期”:datetime.strtime('2019-11-01',%Y-%m-%d”),
“失败时发送电子邮件”:“错误”,
“重试时发送电子邮件”:“错误”,
'项目id':“vf开发ca live”,
“catchup”:“False”
}
#什么时候
mock_list_files_from_gcp.return_value=[]
jobs=generate_opco_配置(os.path.join(os.path.dirname(os.path.abspath(__文件__))和“configs”))
dag=创建(dag\U id=dag\U id,作业=作业[0],默认参数=默认参数)
#然后
operator=dag.task_dict[“TestJobDaily”]#类型:DataprocCompCreateClusterOperator
断言运算符.init_actions_uris.\u_len__()不是0
而dag_生成器是:

导入日志
导入操作系统
导入系统
从日期时间导入日期时间
从functools导入reduce
输入气流
从airflow.contrib.hooks.gcs\u hook导入GoogleCloudStorageHook
从airflow.contrib.operators.dataproc_operator导入DataprocClusterDeleteOperator\
DataProcPySparkOperator
从afflow.operators.python_operator导入PythonOperator
从airflow.utils.trigger\u规则导入TriggerRule
从orchestrator_template.plugins.autoscale_dataproc_运算符导入DataprocCompCreateClusterOperator
从orchestrator\u template.plugins.cost\u calculator\u operator导入CostCalculator operator
从orchestrator_template.plugins.stackdriver_logger_operator导入StackdriverLoggerOperator
从orchestrator_template.utils.config_utils导入生成_opco_配置
从orchestrator_template.utils.config_utils导入检索_yaml_路径
从orchestrator_template.utils.config_utils导入stringify_dict_值,生成_uid_路径
sys.path.insert(0,os.path.join(os.path.abspath(os.path.dirname(_文件__)),os.pardir))
bucket_name=os.environ['gcs