一、环境切换
在公司可能存在多套环境,每个环境对应的数据库,redis,域名,用户都不太一样,尽管有配置文件,但是手动改起来也比较麻烦,我们希望在框架层面执行时,只需要指定执行的环境名称即可,他能够自动将各个环境信息切换到当前执行中来。
1、针对各个环境编写配置文件
比如公司有sit环境,uat环境,test环境,dev环境等,指对这些环境分别使用sit/uat/test/dev等来命名,分别在config目录下创建他们几个环境配置文件,文件名称命名为env_xxx_yml,这个xxx就是各个环境对应的名称,每个配置文件的内容格式都是一致的
common:
buyerName: [ 'A','B' ]
buyerPassword: [ 'AP','BP' ]
captcha: '1512'
managerName: M
managerPassword: MP
mobile_code: '123123'
sellerName: S
sellerPassword: SP
http:
basic: http://......
buyer: http://......
manager: http://......
seller: http://......
db:
host: ......
password: ......
port: 3306
username: M
redis:
host: ......
password: F
port: 6379
2、环境信息传递的设计和封装
*执行时如何指定环境名称
整体执行框架执行入口是run.py,那么run.py在未来做持续执行的时,是通过命令行的方式执行的方式进行的。在python里命令行执行脚本时我们可以通过脚本传递外来参数,所有我们设计是把环境名称作为run.py的外来参数,执行时是这样的
python run.py test
python run.py sit
python run.py uat
*代码封装
1、通过sys.argv得到命令行执行时传递的环境名称
2、根据得到的环境名称,拼接形成该环境对应的配置文件名称路径,config/env_test.yml
3、读取该环境文件配置中的所有信息
4、分别将环境中的common写入到common.yml,http写入到http.yml,db写入到db.yml,redis写入到redis.yml
#以后修改环境配置时,只有修改环境文件才能成功
import os
import sys
import pytest
from common.file_load import load_yaml_file, write_yaml
from paths_manager import common_yaml_path, http_yaml_path, redis_yaml_path, db_yaml_path
if __name__ == '__main__':
args = sys.argv
print(args) # ['run.py', 'test']
# 给env_file一个默认值,是为了兼容不传递环境名称时,默认执行test环境
env_file = 'config/env_test.yml'
if len(args)>1:
env_name = args[1]
env_file = f'config/env_{env_name}.yml'
del args[1]
# 读取环境配置文件所有信息
env_info = load_yaml_file(env_file)
# 依次写入到各个配置文件中去
write_yaml(common_yaml_path,env_info['common'])
write_yaml(http_yaml_path, env_info['http'])
write_yaml(redis_yaml_path, env_info['redis'])
write_yaml(db_yaml_path, env_info['db'])
# pytest.main()自动扫描pytest.ini,根据配置执行pytest
pytest.main()
os.system('allure serve report\data')
def write_yaml(filepath,content):
with open(file=filepath,mode='w',encoding='utf-8') as f:
yaml.dump(content,f,Dumper=yaml.Dumper)