随着被测对象版本的变化,测试脚本也需要修改。但是脚本通常需要适配多个版本的被测对象。我们可以通过多版本自适应技术,将版本间差异定义到配置文件中,让脚本的测试逻辑无需感知这个差异:
class MultiVerMgr():
########### USER CONFIG ###########
#format: key:version:value
#version format: num.num.num...
vars = {
'apple':{'2014.5.17':1.68, '2014.6.27':1.89, '2014.6.29':1.45},
'orange':{'2013.5.8':3.25, '2014.5.17':3.87},
'banana':{'2014.5.17':5.24, '2014.6':6.58, '2014.9.8':6.50},
'wine':{'2014.9.2':18, '2015':24},
#baseline ver is 0
'pineapple':{'0':29},
}
#default version in this running
VERSION = '2014.6.27'
###################################
@staticmethod
def cmpver(ver1, ver2):
if ver1 == ver2:
return 0
ver1info = ver1.split('.')
ver1len = len(ver1info)
ver2info = ver2.split('.')
ver2len = len(ver2info)
for i in range(min(ver1len, ver2len)):
if int(ver1info[i]) > int(ver2info[i]):
return 1
elif int(ver1info[i]) < int(ver2info[i]):
return -1
if ver1len > ver2len:
return 1
return -1
@staticmethod
def getValueOfClosestVer(ver, datas):
#reverse sort datas by ver
sortedDatas = [(k, datas[k]) for k in sorted(datas.keys(), cmp=MultiVerMgr.cmpver, reverse=True)]
#find the first ver litter than current ver
for item in sortedDatas:
if MultiVerMgr.cmpver(ver, item[0]) > 0:
log.debug(item[0])
return item[1]
#not found, return the last one(least one)
log.debug(sortedDatas[-1][0])
return sortedDatas[-1][1]
#store values when first found
cachevars = {}
@staticmethod
def getValue(key, ver = VERSION):
#fast find in cache
if key in MultiVerMgr.cachevars.keys():
log.debug('from cache')
return MultiVerMgr.cachevars[key]
if not key in MultiVerMgr.vars.keys():
log.error('not exist')
MultiVerMgr.cachevars[key] = None
return None
values = MultiVerMgr.vars[key]
if ver in values.keys():
log.debug('matched')
MultiVerMgr.cachevars[key] = values[ver]
return values[ver]
log.info('not matched')
value = MultiVerMgr.getValueOfClosestVer(ver, values)
MultiVerMgr.cachevars[key] = value
return value
if __name__ == '__main__':
print MultiVerMgr.getValue('apple')
print MultiVerMgr.getValue('orange')
print MultiVerMgr.getValue('banana')
print MultiVerMgr.getValue('wine')
print MultiVerMgr.getValue('pineapple')
print MultiVerMgr.getValue('orange')
print MultiVerMgr.getValue('pig')
运行后的结果是:
D:matched
1.89
I:not matched
D:2014.5.17
3.87
I:not matched
D:2014.6
6.58
I:not matched
D:2014.9.2
18
I:not matched
D:0
29
D:from cache
3.87
E:not exist
None
可以看到,MultiVerMgr自动选择了最接近当前版本(如果存在比当前版本小的版本,则选择其中最大的;否则选择所有版本中最小的)的数据。