文档章节

参数测试中交叉遍历的实现

李艳青1987
 李艳青1987
发布于 2016/11/17 21:50
字数 912
阅读 18
收藏 1
点赞 0
评论 0

软件测试中常常需要测试函数/脚本/接口的参数取值情况,在参数数目不多,参数取值数目也不多的情况下,可以采取参数间取值交叉遍历的穷举测试。

以下面的参数配置为例。

param1.cfg

param1 0 1
param2 0 1 2
param3 0 1 2 3

 

穷举所有情况,可得2x3x4=24种,下面为python实现。

paramTest1.py

#!/usr/local/bin/python3.5 -u

import os
import sys

def getParam(paramCfgFile):
    dict = {}
    
    for line in os.popen('cat ' + str(paramCfgFile.strip())).readlines():
        args = line.strip().split()
        parameter = args[0]
        dict[parameter] = []
        values = args[1:]
        for value in values:
            dict[parameter].append(value)

    return(dict)

def func(dict):
    paramList = []

    for i in range(len(dict.keys())):
        key = list(dict.keys())[i]
        values = dict[key]
        paramListTemp = paramList[:]
        paramList = []
        for j in range(len(values)):
            value = values[j]
            paramString = str(key) + " " + str(value)
            tempList = [paramString]
            if i == 0:
                paramList.append(tempList)
            else:
                for origList in paramListTemp:
                    tempListTemp = tempList[:]
                    tempListTemp.extend(origList)
                    paramList.append(tempListTemp)
                
    return(paramList)

def printParamList(paramList):
    for i in range(len(paramList)):
        print(">>> Case " + str(i))
        for param in paramList[i]:
            print(param)
        print("")

def main():
    paramCfgFile = sys.argv[1]
    dict = getParam(paramCfgFile)
    paramList = func(dict)
    printParamList(paramList)

###################
## Main Function ##
###################
if __name__ == "__main__":
    main()

 

测试情况如下。

[liyanqing@bogon python]$ ./paramTest1.py param1.cfg
>>> Case 0
param1 0
param3 0
param2 0

... ...

Case 23
param1 1
param3 3
param2 2

 

当参数数目(以及取值数目)较多时,穷举测试中组合情况的个数急剧增加,以至于很快就会达到基本上无法测试的境地,以下面10个参数的配置表为例。

param2.cfg

param1 0 1
param2 0 1 2
param3 0 1 2 3
param4 0 1
param5 0 1 2
param6 0 1 2 3
param7 0 1
param8 0 1 2
param9 0 1 2 3
param10 0 1

 

测试情况如下:

[liyanqing@bogon python]$ ./paramTest1.py param2.cfg

... ...

>>> Case 27647
param6 3
param8 2
param5 2
param1 1
param10 1
param3 3
param4 1
param7 1
param2 2
param9 3

 

穷举测试中情况数目达到了惊人的27648种!这几乎是无法完成的测试。在这种情况下我们只能放弃完全的穷举测试,而采取更加灵活的方式。

在我们日常的测试工作中常采用下面的策略,既保证每个参数每个取值至少能取到一次,并且某个参数取值固定时,其它参数的取值随机选取,这样能够急剧缩小总体的测试用例数目到“num(param1_values) + num(param2_values) + ... + num(paramn_values)”。新测试脚本只需要更改“func”函数即可实现。

paramTest2.py

#!/usr/local/bin/python3.5 -u

import os
import sys
import random

def getParam(paramCfgFile):
    dict = {}
    
    for line in os.popen('cat ' + str(paramCfgFile.strip())).readlines():
        args = line.strip().split()
        parameter = args[0]
        dict[parameter] = []
        values = args[1:]
        for value in values:
            dict[parameter].append(value)

    return(dict)

def func(dict):
    paramList = []

    for i in range(len(dict.keys())):
        key = list(dict.keys())[i]
        values = dict[key]
        for j in range(len(values)):
            value = values[j]
            paramListTemp = []
            paramString = str(key) + " " + str(value)
            paramListTemp.append(paramString)
            for k in range(len(dict.keys())):
                if k != i:
                    otherKey = list(dict.keys())[k]
                    otherValues = dict[otherKey]
                    t = random.randint(0, len(otherValues)-1)
                    otherValue = otherValues[t]
                    paramString = str(otherKey) + " " + str(otherValue)
                    paramListTemp.append(paramString)

            paramList.append(paramListTemp)

    return(paramList)

def printParamList(paramList):
    for i in range(len(paramList)):
        print(">>> Case " + str(i))
        for param in paramList[i]:
            print(param)
        print("")

def main():
    paramCfgFile = sys.argv[1]
    dict = getParam(paramCfgFile)
    paramList = func(dict)
    printParamList(paramList)

###################
## Main Function ##
###################
if __name__ == "__main__":
    main()

 

同样拿10参数的配置文件测试。

[liyanqing@bogon python]$ ./paramTest2.py param2.cfg
>>> Case 0
param3 0
param2 2
param5 1
param7 1
param4 1
param10 0
param9 2
param1 1
param8 2
param6 2
... ...

>>> Case 28
param6 3
param3 1
param2 2
param5 0
param7 0
param4 1
param10 0
param9 0
param1 1
param8 0

 

测试用例数目缩减到29个,完全在可测范围内。

在实际的操作中,当参数数目(及参数取值数目)比较多时,我们一般执行优化脚本2~3次,以保证在参数随机取值的情况下覆盖尽量多的情况。一般这样测试没有出现crash等严重情况,可以估计认为其它测试出现crash的可能性也不大。

 

© 著作权归作者所有

共有 人打赏支持
李艳青1987
粉丝 4
博文 13
码字总数 16404
作品 0
通州
高级程序员
推荐系统遇上深度学习(五)--Deep&Cross Network模型理论和实践

推荐系统遇上深度学习系列: 推荐系统遇上深度学习(一)--FM模型理论和实践:https://www.jianshu.com/p/152ae633fb00 推荐系统遇上深度学习(二)--FFM模型理论和实践:https://www.jianshu.co...

石晓文
04/22
0
0
【CS231n_2017】2-Image Classification

图像分类   图像分类是计算机视觉的核心问题之一,可以理解为从一组固定的类别中为输入图像贴上对应标签,说明该图像属于哪一类。虽然图像分类问题比较简单,但它有着很多的实际应用,像目...

u013165921
2017/12/07
0
0
数据集的分割与sklearn实现

今天聊一下数据集分割的问题,在使用机器学习算法的时候,我们需要对原始数据集进行分割,分为训练集、验证集、测试集。训练集用于建立模型,验证集用于模型参数的选择,测试集用于评估选定模...

调参的命
2017/10/30
0
0
机器学习面试基础知识 & 扩展-01

视频教程的总结和一些自行补充的内容,旨在尽可能的理解其原理。 本文持续更新地址:http://hellogod.cn: 个人博客机器学习面试基础知识 & 扩展-01 训练/开发/测试集 Tips 训练/开发/测试集...

曹真
2017/10/18
0
0
交叉验证与训练集、验证集、测试集

参考:李航–《统计学习方法》 https://www.jianshu.com/p/7e032a8aaad5 https://zhuanlan.zhihu.com/p/20900216?refer=intelligentunit 训练集、验证集、测试集 如果给定的样本数据充足,我...

chaolei3
02/06
0
0
随机森林的原理分析及Python代码实现

在讲随机森林前,我先讲一下什么是集成学习。集成学习通过构建并结合多个分类器来完成学习任务。集成学习通过将多个学习器进行结合,常可获得比单一学习器更好的泛化性能。 考虑一个简单例子...

Flying_sfeng
2017/03/20
0
0
随机森林的原理分析及Python代码实现

在讲随机森林前,我先讲一下什么是集成学习。集成学习通过构建并结合多个分类器来完成学习任务。集成学习通过将多个学习器进行结合,常可获得比单一学习器更好的泛化性能。 考虑一个简单例子...

Flying_sfeng
2017/03/20
0
0
教程 | 一文简述如何使用嵌套交叉验证方法处理时序数据

  选自toward data science   作者:Courtney Cochrane   机器之心编译   参与:Nurhachu Null、路      本文简要讲解了交叉验证和嵌套交叉验证,并介绍了针对单个时序数据和多个...

机器之心
05/27
0
0
入门 | 如何通过梯度检验帮助实现反向传播

  选自imaddabbura   机器之心编译   参与:刘天赐、路      本文介绍了如何使用梯度检验方法确认反向传播代码是否准确。      在《Coding Neural Network - Forward Propaga...

机器之心
05/09
0
0
sklearn-GridSearchCV,CV调节超参使用方法

GridsearchCV在机器学习调参中使用比较广。 GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,...

huangsheng2
06/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
11分钟前
0
0
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
22分钟前
0
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
28分钟前
0
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
43分钟前
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
50分钟前
0
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
58分钟前
0
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
59分钟前
0
0
安装tensorflow-XXX报错

报错: tensorflow-0.5.0-cp27-none-linux_x86_64.whl is not a supported wheel on this platform. 解决: wget https://bootstrap.pypa.io/get-pip.py sudo python2.7 get-pip.py sudo p......

Yao--靠自己
今天
0
0
JVM学习手册(一):JVM模型

一直从事JAVA开发,天天和JVM打交道,仔细想想对JVM还真的不是特别了解,实在是不应该.周六看了许多资料,也算有点心得,记录一下。 JVM内存模型分为5个区域:方法区,堆,虚拟机栈,本地方法栈,程序计...

勤奋的蚂蚁
今天
0
0
转行零基础该如何学Python?这些一定要明白!

转行零基础学Python编程开发难度大吗?从哪学起?近期很多小伙伴问我,如果自己转行学习Python,完全0基础能否学会呢?Python的难度到底有多大?今天,小编就来为大家详细解读一下这个问题。...

猫咪编程
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部