我需要测试所有可能的安装配置。配置保存在有时包含嵌套数组的字典数组中。
以下是配置信息的示例(实际配置要长得多):
config = {'database': 'sqlite',
'useExisting': False,
'userCredentials': {'authType': 'windows',
'user': r'.\Testing',
'password': 'testing'
}
}
对于database
,选项为['sqlite','mysql','oracle']
,对于useExisting
,选项为[True, False]
。我可以弄清楚如何经历这些的所有排列。
但对于userCredentials
,选项可能完全不同。如果authType
为database
,我需要其他参数。我可以创建一个循环并创建所有有效组合的函数,但我如何加入它们?或者有更好的方法来生成配置吗?
userCredentials
也可能有不同的设置。例如,我有两个用户帐户,testing1和testing2。我需要使用两个用户帐户运行测试,最好使用所有可能的配置。我无法弄清楚当它嵌套时如何递归生成所有配置。
答案 0 :(得分:3)
这是你在找什么?它使用intertools.product构建数据库,useExisting和authType的所有组合。如果authType是'database',它将使用其他参数更新userCredentials。根据需要修改:
from itertools import product
def build_config(db,flag,authType,userPass):
config = dict(database=db,useExisting=flag)
config['userCredentials'] = {
'authType': authType,
'user': userPass[0],
'password': userPass[1]
}
if authType == 'database':
config['userCredentials'].update(
dict(extra=1,param=2))
return config
database = ['sqlite','mysql','oracle']
useExisting = [True, False]
authType = ['windows','database']
userPass = [('testing1','pass1'),('testing2','pass2')]
for options in product(database,useExisting,authType,userPass):
config = build_config(*options)
print config