python接⼝⾃动化多环境配置⽂件的切换,jenkins传参切换环境等第⼀种:通过yaml⽂件切换配置⽂件
因有不同环境的配置⽂件,需要可以通过⼀个参数直接切换不同环境
通过主配置⽂件application.yaml ,切换环境
profiles:
active: TEST #切换配置⽂件TEST ,GD,QH,FJ
不同环境的配置⽂件,如下application_dev.yaml⽂件,可根据需要⾃定义修改:
imgTest:
base_url:
port:
data: test_data1.xlsx #⽤例⽂件
读取yaml⽂件数据代码,通过@property装饰⽅法后,在⾃动化测试中直接调⽤需要的参数即可
#confingread.py
import os
import yaml
class yamlConfig:
DEV ='DEV'#开发环境
TEST ='TEST'#测试环境
PRODGD ='GD'#正式环境1
_instance =None# 保存实例化对象
# 可以实例化时传⼊环境变量或通过读取配置⽂件获取
def__init__(self, env=None, path='config'):
'''
env 未传env参数,默认读取application.yaml⽂件获取变量
'''
# 项⽬根⽬录
< = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
self.path =f'{}/{path}'
#获取读取设置环境的yaml⽂件
self.__conf = self.__load_env(f'{self.path}/application.yaml')
# print(self.__conf['spring']['profiles']['active'])
# 获取环境变量
if env is not None:
self.__env = env
else:
self.__env = self.__conf['profiles']['active']
# 根据环境变量读取对应配置⽂件
if self.__env == yamlConfig.DEV:
self.__conf = self.__load_env(f'{self.path}/application_dev.yaml')
elif self.__env == yamlConfig.TEST:
self.__conf = self.__load_env(f'{self.path}/application_test.yaml')
elif self.__env == yamlConfig.PRODGD:
self.__conf = self.__load_env(f'{self.path}/application_gd.yaml')
else:
raise EnvironmentError('Environment error')
# 单例模式
def__new__(cls,*args,**kwargs):
def__new__(cls,*args,**kwargs):
if not cls._instance:
cls._instance =object.__new__(cls)
return cls._instance
# 读取yaml⽂件
@staticmethod
def__load_env(env_file_name):
file=open(env_file_name,'r', encoding='utf-8')
yml = yaml.safe_load(file)
return yml
def__str__(self):
return f'读取的数据:{self.__conf}'
# 获取环境变量
@property
def env(self):
return self.__env
# 是否是test环境
@property
def is_test(self):
return yamlConfig.TEST == v
# 获取图⽚配置
@property
def imgtest(self):
return self.__conf['imgTest']
# 图⽚base_url
@property
def get_img_base_url(self):
return self.imgtest['base_url']
# 获取图⽚url端⼝
@property
def get_img_port(self):
return self.imgtest['port']
# 获取配置中excel⽤例名
@property
def get_test_data_config(self):
return self.imgtest['data']
# 项⽬根⽬录
@property
def get_project_dir(self):
# ⽤例路径
@property
def get_excel_data_dir(self):
return os.path._project_dir,'data', _test_data_config) # 测试报告⽬录
@property
def get_report_dir(self):
return os.path._project_dir,'report')
# 创建allure报告环境配置⽂件
def create_allure_env_file(self):
file_path =f'{_report_dir}/tmp/environment.properties' with open(file_path,'w')as f:
f.write(f'ENV={v}')
f.write(f'ENV={v}')
f.close()
if __name__ =='__main__':
conf = yamlConfig()
conf1 = yamlConfig()
print(id(conf))
print(id(conf1))
_project_dir, _bucket_name, _img_base_url) print(_img_url))
第⼆种通过pytest 传参切换环境
pytest_addoption 可以让⽤户注册⼀个⾃定义的命令⾏参数
#conftest.py
import os
import pytest
import yaml
from common.logger import logger
# 注册⾃定义参数到配置对象
def pytest_addoption(parser):
parser.addoption("--env", action="store",
default="TEST",
help="将命令⾏参数 ’--env' 添加到 pytest 配置中")
# 从配置对象中读取⾃定义参数的值
@pytest.fixture(scope="session")
def get_env(request):
logger.info('从配置对象读取⾃定义参数')
ption("--env")
# 将⾃定义参数的值写⼊配置⽂件
@pytest.fixture(scope="session",autouse=True)
def set_env(get_env):
logger.info('⾃定义参数写⼊配置⽂件')
root = os.path.dirname(os.path.abspath(__file__))
with open(root+"/config/application.yaml")as f:
ym = yaml.load(f)
ym['profiles']['active']= get_env
with open(root+"/config/application.yaml","w")as f:
yaml.dump(ym,f)
print('\n --env:', get_env)
if __name__ =="__main__":
pytest.main(['-s',f'--env=DEV'])
第三种通过命令⾏参数传参
# 获取命令⾏参数
@staticmethod
def args_get():
evn =(Common.DEV, Common.TEST, Common.PRODFJ, Common.PRODQH, Common.PRODGD) print('获取命令⾏参数')
parser = argparse.ArgumentParser()
parser.add_argument("--evn",)
args = parser.parse_args()
param =vars(args)
v ={}
for key, value in param.items():
# 判断命令⾏传的参数是否符合
if value in evn:
v[key]= value
else:
print(f'所传参数{value}错误,不改变环境变量')
v[key]=None
print(f'args参数:{v}')
return v
# 将命令⾏参数写⼊配置⽂件
def set_evn(self, args):
print(f'判断命令⾏参数是否为空{args}')
('evn')is not None:
print(f'开始将命令⾏参数写⼊配置⽂件:{args}')
with _project_dir +"/config/application.yaml")as f:
ym = yaml.load(f, Loader=yaml.FullLoader)
ym['profiles']['active']= ('evn')
with _project_dir +"/config/application.yaml","w")as f:
yaml.dump(ym, f)
print('成功写⼊ --env:', ('evn'))
我是将⽅法写在公共模块中,然后再⽤例执⾏前调⽤
然后通过jenkins 参数化的⽅式传参切换环境
from common import com
from common.logger import Log
import pytest
if __name__ =="__main__":
print('程序⼊⼝ runtest.py')
# 检测是否存在上⽉⽇志
Log().clean_log()
# 检查命令⾏是否传参,有写⼊配置⽂件
com.set_evn(com.args_get())
# 获取报告dir
reportDir = _report_dir
pytest.main(["-sq","--alluredir", reportDir +"/tmp",'--clean-alluredir',f'--junitxml={reportDir +"/l"}']) # 在allure中⽣成环境信息⽂件python单例模式
推荐----对上⾯的修改
在配置⽂件读取代码中, 获取环境信息
.从命令⾏获取环境参数,如果为空,则获取配置⽂件中的环境参数 —参考下⾯获取环境信息代码
.通过环境信息选择对应配置⽂件,如配置⽂件名为 confing_evn.yaml ,其中evn是环境信息,根据传⼊的不同获取不同的⽂件
class Config:
def__init__(self):
# 项⽬根⽬录
< = _project_root
# config 配置⽂件路径
config_path =f'{}/config/'
# 命令⾏获取环境信息
args_evn = self.args_get
# 获取环境信息
if ('env')is not None:
# 命令⾏参数不为空时获取
self.__env = ('env').lower()
print(f'读取命令⾏所传变量----------------{self.__env}')
else:
# 获取环境信息
self.__conf_evn = common.load_yaml(config_path +'config.yaml')
self.__env = self.__conf_evn['env']
# 通过环境信息选择对应配置⽂件
try:
self.file_name = config_path +f'config_{self.__env}.yaml'
print(f'read_config.py中的配置数据:{fig_data}')
except FileNotFoundError:
raise FileNotFoundError(f'{self.__env}参数错误,不到配置⽂件')
@property
def get_env(self):
return self.__env
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论