算法入门到放弃: 我为什么要研究算法?我又不是开发?我是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脚本的时候,会在继续优化这个算法。