《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > Linux下SANE Driver自動(dòng)化測試工具的設(shè)計(jì)與實(shí)現(xiàn)
Linux下SANE Driver自動(dòng)化測試工具的設(shè)計(jì)與實(shí)現(xiàn)
來源:微型機(jī)與應(yīng)用2012年第1期
翁省輝1,,喻武龍2
(1.北京理工大學(xué) 珠海學(xué)院 計(jì)算機(jī)學(xué)院,,廣東 珠海 519088,;2.北京理工大學(xué) 珠海學(xué)院 信息
摘要: 目前Linux下沒有專門的SANE Driver測試工具,。為解決此問題,以SANE標(biāo)準(zhǔn)為基礎(chǔ),,結(jié)合對SANE Driver測試工具的具體需求,,提出了一種基于腳本技術(shù)的設(shè)計(jì)和實(shí)現(xiàn)方案。該方案采用一種高效的遍歷算法,,降低了腳本的維護(hù)開銷,,提高了測試的自動(dòng)化程度,。
Abstract:
Key words :

摘  要: 目前Linux下沒有專門的SANE Driver測試工具。為解決此問題,,以SANE標(biāo)準(zhǔn)為基礎(chǔ),,結(jié)合對SANE Driver測試工具的具體需求,提出了一種基于腳本技術(shù)的設(shè)計(jì)和實(shí)現(xiàn)方案,。該方案采用一種高效的遍歷算法,,降低了腳本的維護(hù)開銷,提高了測試的自動(dòng)化程度,。
關(guān)鍵詞: Linux,;SANE Driver;自動(dòng)化測試,;腳本技術(shù)

 SANE(Scanner Access Now Easy)是一個(gè)應(yīng)用程序接口API(Application Programming Interface)[1],,提供了對光柵圖像掃描硬件的標(biāo)準(zhǔn)訪問[2]。Linux對掃描儀的支持就是通過SANE實(shí)現(xiàn)的,。SANE標(biāo)準(zhǔn)中將實(shí)現(xiàn)SANE接口的驅(qū)動(dòng)程序稱為SANE Driver或者SANE后端程序;將調(diào)用SANE接口的應(yīng)用程序稱為SANE前端程序,;將對掃描設(shè)備的各種控制抽象為SANE選項(xiàng),,resolution就是其中一個(gè)SANE選項(xiàng)。
 對掃描儀驅(qū)動(dòng)程序進(jìn)行測試主要包括功能測試和性能測試,。功能測試主要指掃描質(zhì)量,、圖像質(zhì)量是否滿足用戶需求;性能測試主要指掃描效率,,也就是掃描一幅圖像所需的時(shí)間,。嚴(yán)格地說,由于SANE前端程序與SANE后端程序均遵守SANE標(biāo)準(zhǔn),,任何一個(gè)SANE前端程序都可以用來測試SANE后端程序,。但由于目前Linux下沒有專門的SANE Driver測試工具,通常測試人員將掃描應(yīng)用程序用于測試SANE Driver,,而在Linux下常用XSANE作為測試工具,。XSANE應(yīng)用程序是基于GTK的sane圖像處理軟件,它可通過掃描儀和照相機(jī)等設(shè)備獲得圖像,。
 XSANE功能比較強(qiáng)大,,但是由于其主要面向用戶應(yīng)用,作為測試工具則存在一些不足:(1)功能測試時(shí)效率低下,,如果所要測試的選項(xiàng)數(shù)目比較多時(shí),,測試的工作量很大而且容易出錯(cuò),而其所支持的批次掃描生成腳本很復(fù)雜,,而且腳本很難維護(hù),;(2)性能測試時(shí)不能自動(dòng)計(jì)算掃描時(shí)間,,手工計(jì)算工作量大且誤差也較大。此外,,還存在一些其他問題:如不能顯示選項(xiàng)的詳細(xì)信息,、不能動(dòng)態(tài)更新可用的掃描設(shè)備以及不能選擇其他可用設(shè)備等。
 針對以上問題,,本文通過引用腳本技術(shù)[3],,采用一種高效的遍歷算法工具,有效地解決了上述問題,。該工具能夠適用所有采用SANE標(biāo)準(zhǔn)的驅(qū)動(dòng)程序,,且能夠自動(dòng)遍歷所有的選項(xiàng)及其取值。用戶只需根據(jù)測試需要寫好測試腳本,,該工具就可以根據(jù)腳本進(jìn)行多次掃描,。因此可以較大程度地減少SANE Driver測試所需的人員及其時(shí)間。
1 整體架構(gòu)設(shè)計(jì)
 針對XSANE用作測試工具存在的問題以及測試需求,,通過如下設(shè)計(jì)能得到有效解決,。將工具分成5個(gè)功能模塊:更新設(shè)備、列出選項(xiàng),、手動(dòng)掃描,、腳本掃描以及產(chǎn)生腳本。
?。?)更新設(shè)備:支持用戶隨時(shí)更新設(shè)備列表,。
 (2)列出選項(xiàng):可以列出SANE后端所定義的所有選項(xiàng),,且只顯示當(dāng)前設(shè)備所支持選項(xiàng)的相關(guān)信息,,還可以根據(jù)用戶的選擇相應(yīng)地顯示SANE后端的版本號及一些設(shè)置沖突的警告信息。
?。?)手動(dòng)掃描:類似一般的前端程序,,主要實(shí)現(xiàn)單次掃描,只顯示當(dāng)前設(shè)備所支持的選項(xiàng)及其取值,。
?。?)腳本掃描:是自動(dòng)化測試的關(guān)鍵。能夠讀入一個(gè)腳本文件,,然后對腳本中各選項(xiàng)的組合值進(jìn)行遍歷,,每取到一個(gè)組合,便掃描一次,。
?。?)產(chǎn)生腳本:可以將當(dāng)前設(shè)備所支持的選項(xiàng)及其取值范圍記錄在腳本文檔中。該腳本相當(dāng)于一個(gè)腳本模板,,以后的腳本可以只在此基礎(chǔ)上稍作修改即可,。
2 工具的實(shí)現(xiàn)
 基于以上架構(gòu)設(shè)計(jì)在Linux系統(tǒng)下用GTK+和C語言來實(shí)現(xiàn)整個(gè)工具,。
2.1 更新設(shè)備
 在用戶掃描過程中,可能會(huì)有新的掃描設(shè)備打開,,也可能現(xiàn)有的掃描設(shè)備關(guān)閉,,因此,有必要讓用戶隨時(shí)知道可用的設(shè)備列表,。其設(shè)計(jì)思路是:在選擇更新設(shè)備后,,調(diào)用sane_get_devices來獲得可用的設(shè)備列表。實(shí)現(xiàn)時(shí),,為了允許用戶在更新設(shè)備時(shí)進(jìn)行其他操作,,可將更新的操作放至一個(gè)新的線程中去實(shí)現(xiàn)。當(dāng)可用設(shè)備為0時(shí),,應(yīng)給用戶相應(yīng)的提示,。
2.2 列出選項(xiàng)
 根據(jù)測試需要,這里要求給出SANE后端的版本號,,可用選項(xiàng)的詳細(xì)信息以及警告信息,。關(guān)于版本號,SANE標(biāo)準(zhǔn)中給出了5個(gè)宏,,該工具主要直接調(diào)用后面的3個(gè)宏:即SANE_VERSION_MAJOR,、SANE_VERSION_MINOR、SANE_VERSION_BUILD,,分別獲得SANE后端最大,、最小以及編譯版本號,。
對于選項(xiàng)的詳細(xì)信息,,SANE標(biāo)準(zhǔn)中有一個(gè)專門用來描述的結(jié)構(gòu)即SANE_Option_ Descriptor。調(diào)用SANE標(biāo)準(zhǔn)中的sane_get_option_descriptor后便會(huì)返回這個(gè)結(jié)構(gòu)體,,記錄這個(gè)選項(xiàng)的詳細(xì)信息,。
 警告信息主要通過分析結(jié)構(gòu)體SANE_Option_ Descriptor中的cap值。由SANE標(biāo)準(zhǔn)可知,,當(dāng)SANE_CAP_ SOFT_SELECT被設(shè)置時(shí),,SANE_CAP_SOFT_DETECT也會(huì)被設(shè)置,故cap值不能為5,;SANE_CAP_SOFT_SELECT和SANE_CAP_HARD_SELECT不能同時(shí)被設(shè)置,,故cap值不能為3。當(dāng)某一個(gè)選項(xiàng)的cap值不為3或5時(shí),,可認(rèn)為這個(gè)選項(xiàng)設(shè)置是正確的,。
 實(shí)現(xiàn)時(shí),可以將版本信息,、選項(xiàng)信息及警告信息分別寫至三個(gè)文件中,,然后根據(jù)用戶的操作讀入相應(yīng)的文件,。
2.3 手動(dòng)掃描
 一次完整的掃描過程包括兩個(gè)部分:配置設(shè)備和獲取圖像。配置設(shè)備主要通過sane_control_option來完成,。sane_control_option可以用于獲取選項(xiàng)的當(dāng)前參數(shù),,也可以用于設(shè)置選項(xiàng)的參數(shù)。設(shè)置完參數(shù)后,,先調(diào)用sane_start,,然后一直調(diào)用sane_read讀圖像數(shù)據(jù)直至sane_read返回狀態(tài)為SANE_STATUS_EOF,最后不管讀圖像是否成功均要調(diào)用sane_cancel,。
 實(shí)現(xiàn)時(shí),,當(dāng)用戶選擇手動(dòng)掃描后會(huì)創(chuàng)建一個(gè)新的線程去執(zhí)行,配置設(shè)備和獲取圖像均包含在新的線程中,。每進(jìn)行一次用戶掃描,,都會(huì)新建一個(gè)線程。同時(shí)為了方便測試人員,,工具在手動(dòng)掃描和后面的腳本掃描中均會(huì)記錄一些重要信息:如圖像的原始大小及實(shí)際獲得的大小,、 sane_start和sane_read的時(shí)間、一些操作的返回信息及圖片保存目錄和名字等,。
2.4 腳本掃描
 腳本掃描與手動(dòng)掃描是相互獨(dú)立的,。用戶可以只選擇手動(dòng)掃描,也可以只選擇腳本掃描,。不過,,它們之間有著緊密的聯(lián)系,其掃描流程都是一樣的,。手動(dòng)掃描與腳本掃描的結(jié)構(gòu)體系如圖1所示,。腳本掃描可以看作是多次的手動(dòng)掃描,所不同的是,,手動(dòng)掃描是從界面獲得選項(xiàng)值,,而腳本掃描是從文本獲得選項(xiàng)值。
腳本掃描的流程是:首先檢查腳本的語法正確性,,然后分析腳本,,遍歷各個(gè)選項(xiàng)值的組合,每得到一個(gè)組合,,便掃描一次,,當(dāng)掃描完成時(shí),再取下一組合掃描直至遍歷完所有的組合,。

 實(shí)現(xiàn)時(shí),,每掃描一次,均創(chuàng)建一個(gè)新線程,,下一次掃描要等上一線程結(jié)束后才開始,。
2.5 產(chǎn)生腳本
 產(chǎn)生的腳本主要列出設(shè)備所支持的選項(xiàng)名字及其取值范圍,,然后以特定的格式寫入腳本中[4]。由于結(jié)構(gòu)體SANE_Option_Descriptor中包括選項(xiàng)的各種信息,,因此結(jié)構(gòu)體中的元素title可作為該選項(xiàng)的名字,,而選項(xiàng)取值范圍可從結(jié)構(gòu)體中的聯(lián)合體constraint得到。實(shí)現(xiàn)時(shí),,應(yīng)允許用戶選擇保存路徑,。
2.6 遍歷算法研究
 在對SANE Driver測試時(shí),一般會(huì)選中一些選項(xiàng)進(jìn)行全組合或部分組合進(jìn)行測試,。以兩個(gè)選項(xiàng)為例:mode值為 Color和Gray,,resolution值為75和100,測試時(shí)就用Color 75,、Color 100,, Gray 75、 Gray 100四種組合掃描4次,。xsane中的批次掃描采用了類似的方法,,它將所要掃描的每種組合記錄在文本中,然后通過讀文本進(jìn)行掃描,。當(dāng)掃描次數(shù)較多時(shí),,文本就非常冗長而且很難維護(hù)。
 測試工具中采用的腳本使用了鍵值對的形式:
 mode=Color,,Gray,,Binary
 resolution=75,100,,150,,200,300,,400,,500,,600,,1 200,2 400,,4 800,,9 600,19 200
 對于上面的腳本,,通常會(huì)采用直接循環(huán)法:用下面一個(gè)結(jié)構(gòu)體:
struct option {
        char names[15],;
        char values[10][20];
} options[MAXOPTIONSNUMBER],;
來存儲(chǔ)每一種組合,,用一個(gè)數(shù)組size保存各個(gè)選項(xiàng)值的個(gè)數(shù),。比如上例中,第一個(gè)選項(xiàng)mode有3個(gè)值,,故size[0]=3,;然后用一個(gè)數(shù)組index來存儲(chǔ)選項(xiàng)的當(dāng)前值,如mode第一個(gè)值為Color,,則可表示為index[0]=Color,。假如只有mode和resolution兩個(gè)選項(xiàng),那么只需2個(gè)for循環(huán)即可遍歷選項(xiàng)的取值,。其代碼如下:
for(index[0]=0,;index[0]<size[0];index[0]++)
  for(index[1]=0,;index[1]<size[1],;index[1]++)
  {
    for(int i=0;i<2,;i++)
    pass_option_setting_to_dev
(options[i].names,,options[i].values[indexs[i]] );
 // pass_option_setting_to_dev為傳遞參數(shù)給設(shè)備的函數(shù)
  ...
   }
 本文介紹的算法思路簡單,,容易理解,。針對上例中的兩個(gè)選項(xiàng),采用上述的方法可以很好地解決問題,。但是上述的算法中有多少個(gè)選項(xiàng)就有多少個(gè)for循環(huán),,而且該方法只適用于選項(xiàng)個(gè)數(shù)一定的情況下。因?yàn)楫?dāng)選項(xiàng)個(gè)數(shù)有變動(dòng)時(shí),,都要增加或刪除相應(yīng)的for循環(huán)數(shù),。而現(xiàn)實(shí)中的腳本其選項(xiàng)的個(gè)數(shù)是不定的,因此上述的算法可擴(kuò)展性較差,,不適合用于腳本掃描,。但只要對上述算法稍作修改即可成為一種簡單高效的遍歷算法[5]。該算法的腳本仍采用鍵值對這種簡潔的腳本格式,,并且可以很好地適應(yīng)選項(xiàng)個(gè)數(shù)或者選項(xiàng)值個(gè)數(shù)的變化,。假設(shè)變量OPT_NUM代表選項(xiàng)的個(gè)數(shù),其代碼如下:
 while(1){
         for( int i=0,;i<OPT_NUM,;i++){
       pass_option_setting_to_dev
(options[i].names,options[i].values[indexs[i]] ),;
      ...
}
int k= OPT_NUM-1,;
while(1){
  if(index[k]<size[k]-1) {
    index[k]++;break;
 }
 else{
  index[k]=0,; k--,;
 }
}
 if(k<0)
       break;
}
3 測試工具對比
 XSANE與自動(dòng)化測試工具對比如表1所示,。

 


 本文以SANE標(biāo)準(zhǔn)為基礎(chǔ),,針對xsane存在的不足,結(jié)合測試需求,,實(shí)現(xiàn)了SANE Driver自動(dòng)化測試工具,。實(shí)際應(yīng)用結(jié)果表明,與原有的測試工具相比,,大大提高了測試效率,,極大地減少了測試人員的工作量。
參考文獻(xiàn)
[1] SANE home page[DB/OL].http://www.sane-project.org,, 2001.
[2] 張安清.基于SANE標(biāo)準(zhǔn)的光柵掃描設(shè)備應(yīng)用程序的開發(fā)[J].小型微型計(jì)算機(jī)系統(tǒng),,2001,22(10):1216-1218.
[3] 凌永發(fā),,張?jiān)粕?,郭秀?軟件自動(dòng)化測試中的腳本技術(shù)[J].云南民族學(xué)院學(xué)報(bào)(自然科學(xué)版),2002,,11(1):544-548.
[4] 蔣云,,趙佳寶.自動(dòng)化測試腳本自動(dòng)生成技術(shù)的研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2007,,17(7):4-7.
[5] 《編程之美》小組.編程之美:微軟技術(shù)面試心得[M].北京:電子工業(yè)出版社,,2008.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載,。