pyunit扩展:多版本自适应

随着被测对象版本的变化,测试脚本也需要修改。但是脚本通常需要适配多个版本的被测对象。我们可以通过多版本自适应技术,将版本间差异定义到配置文件中,让脚本的测试逻辑无需感知这个差异:


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自动选择了最接近当前版本(如果存在比当前版本小的版本,则选择其中最大的;否则选择所有版本中最小的)的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值