自动化测试工具的设计与实现

发布时间:2024-06-08
sane(scanneraccessnoweasy)是一个应用程序接口api(applicationprogramminginterface)[1],提供了对光栅图像扫描硬件的标准访问[2]。linux对扫描仪的支持就是通过sane实现的。sane标准中将实现sane接口的驱动程序称为sanedriver或者sane后端程序;将调用sane接口的应用程序称为sane前端程序;将对扫描设备的各种控制抽象为sane选项,resolution就是其中一个sane选项。
对扫描仪驱动程序进行测试主要包括功能测试和性能测试。功能测试主要指扫描质量、图像质量是否满足用户需求;性能测试主要指扫描效率,也就是扫描一幅图像所需的时间。严格地说,由于sane前端程序与sane后端程序均遵守sane标准,任何一个sane前端程序都可以用来测试sane后端程序。但由于目前linux下没有专门的sanedriver测试工具,通常测试人员将扫描应用程序用于测试sanedriver,而在linux下常用xsane作为测试工具。xsane应用程序是基于gtk的sane图像处理软件,它可通过扫描仪和照相机等设备获得图像。
xsane功能比较强大,但是由于其主要面向用户应用,作为测试工具则存在一些不足:(1)功能测试时效率低下,如果所要测试的选项数目比较多时,测试的工作量很大而且容易出错,而其所支持的批次扫描生成脚本很复杂,而且脚本很难维护;(2)性能测试时不能自动计算扫描时间,手工计算工作量大且误差也较大。此外,还存在一些其他问题:如不能显示选项的详细信息、不能动态更新可用的扫描设备以及不能选择其他可用设备等。
针对以上问题,本文通过引用脚本技术,采用一种的遍历算法工具,有效地解决了上述问题。该工具能够适用所有采用sane标准的驱动程序,且能够自动遍历所有的选项及其取值。用户只需根据测试需要写好测试脚本,该工具就可以根据脚本进行多次扫描。因此可以较大程度地减少sanedriver测试所需的人员及其时间。
1、整体架构设计
针对xsane用作测试工具存在的问题以及测试需求,通过如下设计能得到有效解决。将工具分成5个功能模块:更新设备、列出选项、手动扫描、脚本扫描以及产生脚本。
(1)更新设备:支持用户随时更新设备列表。
(2)列出选项:可以列出sane后端所定义的所有选项,且只显示当前设备所支持选项的相关信息,还可以根据用户的选择相应地显示sane后端的版本号及一些设置冲突的警告信息。
(3)手动扫描:类似一般的前端程序,主要实现单次扫描,只显示当前设备所支持的选项及其取值。
(4)脚本扫描:是自动化测试的关键。能够读入一个脚本文件,然后对脚本中各选项的组合值进行遍历,每取到一个组合,便扫描一次。
(5)产生脚本:可以将当前设备所支持的选项及其取值范围记录在脚本文档中。该脚本相当于一个脚本模板,以后的脚本可以只在此基础上稍作修改即可。
2、工具的实现
基于以上架构设计在linux系统下用gtk+和c语言来实现整个工具。
2.1更新设备
在用户扫描过程中,可能会有新的扫描设备打开,也可能现有的扫描设备关闭,因此,有必要让用户随时知道可用的设备列表。其设计思路是:在选择更新设备后,调用sane_get_devices来获得可用的设备列表。实现时,为了允许用户在更新设备时进行其他操作,可将更新的操作放至一个新的线程中去实现。当可用设备为0时,应给用户相应的提示。
2.2列出选项
根据测试需要,这里要求给出sane后端的版本号,可用选项的详细信息以及警告信息。关于版本号,sane标准中给出了5个宏,该工具主要直接调用后面的3个宏:即sane_version_major、sane_version_minor、sane_version_build,分别获得sane后端zui大、zui小以及编译版本号。
对于选项的详细信息,sane标准中有一个专门用来描述的结构即sane_option_descriptor。调用sane标准中的sane_get_option_descriptor后便会返回这个结构体,记录这个选项的详细信息。
警告信息主要通过分析结构体sane_option_descriptor中的cap值。由sane标准可知,当sane_cap_soft_select被设置时,sane_cap_soft_detect也会被设置,故cap值不能为5;sane_cap_soft_select和sane_cap_hard_select不能同时被设置,故cap值不能为3。当某一个选项的cap值不为3或5时,可认为这个选项设置是正确的。
实现时,可以将版本信息、选项信息及警告信息分别写至三个文件中,然后根据用户的操作读入相应的文件。
2.3手动扫描
一次完整的扫描过程包括两个部分:配置设备和获取图像。配置设备主要通过sane_control_option来完成。sane_control_option可以用于获取选项的当前参数,也可以用于设置选项的参数。设置完参数后,先调用sane_start,然后一直调用sane_read读图像数据直至sane_read返回状态为sane_status_eof,zui后不管读图像是否成功均要调用sane_cancel。
实现时,当用户选择手动扫描后会创建一个新的线程去执行,配置设备和获取图像均包含在新的线程中。每进行一次用户扫描,都会新建一个线程。同时为了方便测试人员,工具在手动扫描和后面的脚本扫描中均会记录一些重要信息:如图像的原始大小及实际获得的大小、sane_start和sane_read的时间、一些操作的返回信息及图片保存目录和名字等。
2.4脚本扫描
脚本扫描与手动扫描是相互独立的。用户可以只选择手动扫描,也可以只选择脚本扫描。不过,它们之间有着紧密的,其扫描流程都是一样的。手动扫描与脚本扫描的结构体系如图1所示。脚本扫描可以看作是多次的手动扫描,所不同的是,手动扫描是从界面获得选项值,而脚本扫描是从文本获得选项值。
脚本扫描的流程是:首先检查脚本的语法正确性,然后分析脚本,遍历各个选项值的组合,每得到一个组合,便扫描一次,当扫描完成时,再取下一组合扫描直至遍历完所有的组合。
实现时,每扫描一次,均创建一个新线程,下一次扫描要等上一线程结束后才开始。
2.5产生脚本
产生的脚本主要列出设备所支持的选项名字及其取值范围,然后以特定的格式写入脚本中[4]。由于结构体sane_option_descriptor中包括选项的各种信息,因此结构体中的元素title可作为该选项的名字,而选项取值范围可从结构体中的联合体constraint得到。实现时,应允许用户选择保存路径。
2.6遍历算法研究
在对sanedriver测试时,一般会选中一些选项进行全组合或部分组合进行测试。以两个选项为例:mode值为color和gray,resolution值为75和100,测试时就用color75、color100,gray75、gray100四种组合扫描4次。xsane中的批次扫描采用了类似的方法,它将所要扫描的每种组合记录在文本中,然后通过读文本进行扫描。当扫描次数较多时,文本就非常冗长而且很难维护。
测试工具中采用的脚本使用了键值对的形式:
mode=color,gray,binary
resolution=75,100,150,200,300,400,500,600,1200,2400,4800,9600,19200
对于上面的脚本,通常会采用直接循环法:用下面一个结构体:
structoption{
charnames[15];
charvalues[10][20];
}options[maxoptionsnumber];
来存储每一种组合,用一个数组size保存各个选项值的个数。比如上例中,*个选项mode有3个值,故size[0]=3;然后用一个数组index来存储选项的当前值,如mode*个值为color,则可表示为index[0]=color。假如只有mode和resolution两个选项,那么只需2个for循环即可遍历选项的取值。其代码如下:
for(index[0]=0;index[0]for(index[1]=0;index[1]{
for(inti=0;i<2;i++)
pass_option_setting_to_dev
(options[i].names,options[i].values[indexs[i]]);
//pass_option_setting_to_dev为传递参数给设备的函数
...
}
本文介绍的算法思路简单,容易理解。针对上例中的两个选项,采用上述的方法可以很好地解决问题。但是上述的算法中有多少个选项就有多少个for循环,而且该方法只适用于选项个数一定的情况下。因为当选项个数有变动时,都要增加或删除相应的for循环数。而现实中的脚本其选项的个数是不定的,因此上述的算法可扩展性较差,不适合用于脚本扫描。但只要对上述算法稍作修改即可成为一种简单的遍历算法[5]。该算法的脚本仍采用键值对这种简洁的脚本格式,并且可以很好地适应选项个数或者选项值个数的变化
上一个:抹茶巧克力挞如何做 抹茶巧克力挞做法
下一个:什么是平面轴承?

戴尔二手电脑回收价格表查询,我的戴尔笔记本回收大概多少钱
建筑项目合同多少份
万和热水器e3故障风机不停(万和燃气热水器故障e3时好时坏)
我国制造业物流信息化发展中存在的问题
消除腿酸的方法 大腿酸痛怎么缓解
长辈主婚人致辞简短
如何从化学的角度分析普洱茶的口感?普洱茶的口感是由哪些内含物质决定的?
惠州酒店
一般风机故障的原因
普洱茶汤浑浊,可能是它们在作怪