【Python】有权重的数据进行随机选取(折半查找)

算法入门到放弃: 我为什么要研究算法?我又不是开发?我是QA而已?为啥.....

背景:

之前有遇到一个问题:自动化测试过程中,测试人员编辑的大量的用例脚本,由于测试周期较短,我们需要着重执行其中重要的脚本(非必需),也就是说对一些脚本配置权重,在执行测试的过程中,让他们执行的可能性增大,并有可能重复执行。那好,你觉得怎么处理才好?

解决:

我的拙见就是:直接上代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@author: jayzhen
@email: jayzhen_testing@163.com
@file: test_random_data
@time: 2018/4/4  11:34
"""
from __future__ import division
import random


# 这个字典:实际中就是配置文件所配置的(A是脚本类名,3是脚本执行的权重)
source = {'A': 3, 'E': 10, 'C': 5, 'D': 1, 'B': 7, 'G': 15, 'W': 30, 'Z': 9}

# 会将权重数据实例化成对象
class Data(object): 
	def __init__(self): 
		self.name = None 
		self.num = None 
		self.weight = None 
	def __str__(self): 
		return str(self.name) + "; " + str(self.weight) + '; ' + str(self.num)
li = []
n = 0  
# 这个循环是处理字典中的数据
for i in source: 
	data = Data() 
	data.name = i # 对应的key(正式是脚本的类名) 
	data.weight = source[i] # 对应的权重 
	data.num = source[i] if n == 0 else source[i] + li[n - 1].num # 这个是高深之处了 
	li.append(data) # 将数据放到list中去 
	n += 1

#简单的打印一下
for i in li: 
	print i

length = len(li)

# 随机取个三个脚本出来
for i in xrange(3): 
	begin = 0 
	end = length - 1 
	tmp = random.randrange(li[length - 1].num) # 随机数 
	print "========"+str(tmp)+"=========="
	# 对list中的对象进行折半查找 
	for n in xrange(length): 
		half = int((begin + end) / 2) # 如果数列是偶数就是中间偏左,奇数就是中间数了 
		if tmp == 0: 
			print str(tmp) + " : "+li[0].name 
			break 
		if li[half].num - li[half].weight < tmp <= li[half].num: 
			print str(tmp) + " : " + li[half].name 
			break 
		if begin > end: 
			break 
		if tmp > li[half].num: 
			begin = half + 1 
			continue 
		if tmp <= li[half].num - li[half].weight: 
			end = half - 1 
			continue
执行结果:
脚本名称:A;	  权重:3;	  权重位:3
脚本名称:C;	  权重:5;	  权重位:8
脚本名称:B;	  权重:7;	  权重位:15
脚本名称:E;	  权重:10;	  权重位:25
脚本名称:D;	  权重:1;	  权重位:26
脚本名称:G;	  权重:15;	  权重位:41
脚本名称:W;	  权重:30;	  权重位:71
脚本名称:Z;	  权重:9;	  权重位:80
========55==========
55 : W
========26==========
26 : D 
========30==========
30 : G
原理(不想打字,手绘图,请谅解)

总结:

这中随机方案最大的优点就是简单,但不是我想出来的,我也记不起来是在哪看到的了。缺点就是算法有待优化,当前得到的随机结果,可能并不是实际工作过程中需要的,因为一组数据数据有可能出现在同一集合(比如:E),这样的话就有问题了,脚本不能重复执行多次啊,所以业务性算法要有独特的角度去完善。在后续的多机运行selenium脚本的时候,会在继续优化这个算法。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值