劉維維
(中興通訊股份有限公司終端事業(yè)部,上海 200120)
計(jì)算機(jī)學(xué)科一個(gè)重要分支就是人工智能,人工智能技術(shù)是目前最熱門的科技話題之一,在很多方面都有相關(guān)應(yīng)用,如人臉識(shí)別手機(jī)解鎖、語音文字相互轉(zhuǎn)換、智能家居、無人駕駛等等。
在移動(dòng)終端測試領(lǐng)域,傳統(tǒng)測試模式為手工測試,自動(dòng)化測試是通過機(jī)器如機(jī)械手工具,提供大量的輸入和輸出數(shù)據(jù)訓(xùn)練AI,最終由AI 根據(jù)特定需求自動(dòng)生成測試用例并執(zhí)行測試,并對(duì)測試結(jié)果進(jìn)行分析。自動(dòng)化測試大大減少了人工測試工作量,大幅提高了工作效率。AI 訓(xùn)練主要是界面自動(dòng)化執(zhí)行與數(shù)據(jù)采集,關(guān)鍵是機(jī)器識(shí)別UI 的準(zhǔn)確度與效率問題。結(jié)合人工智能的圖像識(shí)別與AI 訓(xùn)練技術(shù)能更好地監(jiān)控與記錄測試過程中的數(shù)據(jù)、表格及圖像,快速分析手機(jī)中存在的性能問題及程序缺陷。因此,人工智能在自動(dòng)化測試方面應(yīng)用廣泛[1]。
基于人工智能技術(shù)建立自動(dòng)化測試模型,可使自動(dòng)化測試更高效、識(shí)別更準(zhǔn)確。
移動(dòng)自動(dòng)化測試技術(shù)是產(chǎn)品研發(fā)過程中必不可少的環(huán)節(jié),隨著敏捷開發(fā)應(yīng)用越來越廣,自動(dòng)化測試技術(shù)在整個(gè)研發(fā)周期以及各個(gè)迭代過程中的比重也越來越大。
移動(dòng)終端測試類型包括軟件測試、硬件測試、結(jié)構(gòu)測試等,本文主要針對(duì)軟件測試。軟件系統(tǒng)測試又分為功能測試、穩(wěn)定性測試、兼容性測試、壓力測試、啟動(dòng)時(shí)間測試、平滑性測試、跑分測試等。
軟件系統(tǒng)測試一般是用戶對(duì)各種測試工具的操作過程,如功能測試是在操作系統(tǒng)界面首先檢查各類控件信息,然后通過系統(tǒng)間的交互查看控件狀態(tài)等;穩(wěn)定性測試,如monkey,則是測試用戶在各種場景點(diǎn)擊操作對(duì)系統(tǒng)的影響,如是否產(chǎn)生黑屏、閃退、無響應(yīng)、耗電等結(jié)果;兼容性測試則是在系統(tǒng)安裝指定軟件后,通過點(diǎn)擊卸載界面進(jìn)行特定的卸載操作;跑分測試則是安裝第三方軟件對(duì)移動(dòng)終端進(jìn)行測評(píng),需要用戶安裝、啟動(dòng)、抓取界面數(shù)據(jù)等。
任何自動(dòng)化測試實(shí)現(xiàn)原理均包括以下3 個(gè)過程:①用戶行為模擬的測試執(zhí)行過程;②測試異常指標(biāo)抓取監(jiān)控過程;③移動(dòng)終端界面結(jié)果數(shù)據(jù)收集過程。
由于移動(dòng)終端測試通常是大數(shù)據(jù)量的反復(fù)、長期測試,人工審查難免出現(xiàn)錯(cuò)誤,自動(dòng)化測試不斷面臨新的挑戰(zhàn),如自動(dòng)化測試腳本維護(hù)時(shí)間過長、控件元素定位不準(zhǔn)確、上手使用難度較大等等,同時(shí)面臨大量的數(shù)據(jù)處理與分析工作。有效解決這些問題,確保高質(zhì)量的最終產(chǎn)品是很多企業(yè)提高軟件質(zhì)量的主要工作[2-3]。
隨著人工智能、大數(shù)據(jù)的快速發(fā)展,移動(dòng)自動(dòng)化也得到發(fā)展,Python 語言成為主流的自動(dòng)化編程語言。
Python 是一門免費(fèi)、開源、簡單易用易學(xué)的跨平臺(tái)高級(jí)動(dòng)態(tài)編程語言,其語法簡單,代碼可讀性強(qiáng),非常適合初學(xué)者。Python 語言科學(xué)計(jì)算、數(shù)據(jù)處理、數(shù)據(jù)分析等功能適應(yīng)移動(dòng)終端自動(dòng)化測試發(fā)展趨勢。
Python 在移動(dòng)自動(dòng)化測試方面已有很多應(yīng)用。由于Python 帶有os 庫,可與手機(jī)連接,很多公司在此平臺(tái)上進(jìn)行終端自動(dòng)化測試腳本編寫及開發(fā)自動(dòng)化測試框架,如airtest。
Python 語言目前是最受歡迎的自動(dòng)化編程語言,豐富的第三方庫既避免了重復(fù)開發(fā),又增加了語言張力,目前98%的人工智能開發(fā)用的是Python 語言編程。
人工智能編程思路是:在Python 的標(biāo)準(zhǔn)庫(pdb、urllib、httplib、hash、os、threading)基礎(chǔ)上,采用第三方Python 開源庫requests、numpy、matplotlib,opencv 等實(shí)現(xiàn)數(shù)據(jù)分析功能。本文嘗試從人工智能編程思路出發(fā),基于Python 語言闡述其在自動(dòng)化測試用戶模擬過程中應(yīng)用[4]。
在產(chǎn)品研發(fā)測試過程中,各類產(chǎn)品紛繁交錯(cuò),版本迭代也很頻繁,傳統(tǒng)的手機(jī)UI 自動(dòng)化測試方法是通過dump UI 采取自動(dòng)化測試腳本分析定位到界面上的控件元素,然后根據(jù)元素屬性取出具體業(yè)務(wù)數(shù)值,最后獲得界面坐標(biāo)以執(zhí)行自動(dòng)化測試過程。
(1)通過坐標(biāo)點(diǎn)擊方法實(shí)現(xiàn)用戶模擬分析如下:由于版本迭代,系統(tǒng)交錯(cuò)存在很多差異化需求,僅通過定位坐標(biāo)往往會(huì)出現(xiàn)自動(dòng)化腳本更新頻繁導(dǎo)致效率較差問題。此類測試包含功能測試、穩(wěn)定性測試等。
(2)UI 元素屬性識(shí)別方法:是一種傳統(tǒng)的測試方法,為UIdump 界面信息通過傳統(tǒng)的空間元素屬性識(shí)別控件。但在游戲、Octane、BasemarkOS、BaseMarkX 等方面,傳統(tǒng)的空間元素屬性識(shí)別方法往往不適用。
(3)圖像匹配識(shí)別方法:Airtest 的測試框架是用圖像匹配度進(jìn)行用戶模擬操作,這個(gè)方法有一定的局限性,僅僅能操控手機(jī),但是無法提取出圖像上的文字供數(shù)據(jù)采集。
高效準(zhǔn)確地進(jìn)行鑒權(quán)測試需要圖像文字識(shí)別技術(shù)支持,采用圖像文字識(shí)別技術(shù)可先對(duì)期望結(jié)果頁面進(jìn)行截屏,從而對(duì)測試結(jié)果進(jìn)行分析。
傳統(tǒng)的圖像識(shí)別方法通過圖像匹配算法進(jìn)行識(shí)別,采用BSD 發(fā)行的OpenCV 計(jì)算機(jī)視覺庫,其提供Python、Ru?by、MATLAB 等語言接口,圖片檢測、圖片識(shí)別和圖片數(shù)據(jù)功能均由OpenCV 提供相應(yīng)的接口實(shí)現(xiàn)。
基于OpenCV 和Python 的用戶行為模擬測試模型核心是利用OpenCV 和Python 識(shí)別圖片。該測試模型主要由圖像信息采集、文字區(qū)域檢測、特征值提取和數(shù)據(jù)處理等模塊完成。文字區(qū)域檢測采用mser 算法,特征值提取通過tesseract ocr 識(shí)別文字將待測圖片進(jìn)行處理得到待驗(yàn)證數(shù)據(jù),數(shù)據(jù)處理模塊將該數(shù)據(jù)與校驗(yàn)庫中的值進(jìn)行對(duì)比,找到最相近的值作為識(shí)別的最終值,但該模型準(zhǔn)確度不高[5]。
隨著人工智能的發(fā)展,深度神經(jīng)網(wǎng)絡(luò)成為主流的圖像識(shí)別技術(shù),其中尤以卷積神經(jīng)網(wǎng)絡(luò)最為出名。卷積神經(jīng)網(wǎng)絡(luò)是以自動(dòng)化特征提取的機(jī)器學(xué)習(xí)模型。本文基于卷積神經(jīng)網(wǎng)絡(luò)的電子信息圖像文字處理技術(shù)構(gòu)建卷積網(wǎng)絡(luò)結(jié)構(gòu),研發(fā)算法流程,挖掘卷積神經(jīng)網(wǎng)絡(luò)的文字識(shí)別優(yōu)勢[6-7]。
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)是一種前饋型神經(jīng)網(wǎng)絡(luò),在大型圖像處理方面有出色表現(xiàn),已廣泛應(yīng)用于圖像文字識(shí)別方面。因此,本文采用卷積神經(jīng)網(wǎng)絡(luò)(CNN)實(shí)現(xiàn)文字圖像識(shí)別功能。
采用Python 編寫CNN 文字圖像識(shí)別功能可實(shí)現(xiàn)更少的代碼行。目前卷積神經(jīng)網(wǎng)絡(luò)流行框架是Caffe、Torch、Tensorflow,適用于機(jī)器學(xué)習(xí)和深度學(xué)習(xí)等,如Tensorflow、Keras、Caffe、Theano 等在Python 中都可進(jìn)行調(diào)用,而且由于Python 語言簡單性,它們?cè)赑ython 中使用也更加容易。
Keras 是一個(gè)簡約、高度模塊化的神經(jīng)網(wǎng)絡(luò)庫,應(yīng)用模塊(keras.applications)提供帶有預(yù)訓(xùn)練權(quán)值的深度學(xué)習(xí)模型,這些模型可用來進(jìn)行預(yù)測、特征提取和微調(diào)[8]。
卷積神經(jīng)網(wǎng)絡(luò)層級(jí)結(jié)構(gòu)如圖1 所示。
數(shù)據(jù)輸入層(Input layer):該層主要對(duì)原始圖像數(shù)據(jù)進(jìn)行預(yù)處理,包括去均值、歸一化、白化等。
卷積計(jì)算層(CONV layer):局部關(guān)聯(lián)與窗口滑動(dòng)。

Fig.1 Hierarchical structure of convolutional neural network圖1 卷積神經(jīng)網(wǎng)絡(luò)層級(jí)結(jié)構(gòu)
ReLU 激勵(lì)層(ReLU layer):將卷積層輸出結(jié)果做非線性映射。
池化層(Pooling layer):用于壓縮數(shù)據(jù)和參數(shù)的量,減小過擬合。
全連接層(Full Connection layer):兩層之間所有神經(jīng)元都有權(quán)重連接,通常全連接層在卷積神經(jīng)網(wǎng)絡(luò)尾部。
Image 為原始圖片,F(xiàn) 為濾波器(filter,也稱為kernel)。用這個(gè)filter 對(duì)圖片進(jìn)行處理,覆蓋一塊跟filter 一樣大的區(qū)域之后將對(duì)應(yīng)元素相乘然后求和。計(jì)算一個(gè)區(qū)域之后向其它區(qū)域挪動(dòng),繼續(xù)計(jì)算直到把原圖片的每一個(gè)角落都覆蓋為止,這個(gè)過程就是“卷積”。
通過設(shè)計(jì)特定的filter 與圖片做卷積,就可識(shí)別出圖片中的某些特征,比如邊界。檢測豎直邊界與水平邊界的區(qū)別只用把對(duì)應(yīng)的filter 旋轉(zhuǎn)90°即可。對(duì)于其它特征,理論上只要經(jīng)過精細(xì)設(shè)計(jì)就可設(shè)計(jì)出合適的filter。CNN 原理就是設(shè)置每個(gè)filter 中的參數(shù)。
(1)準(zhǔn)備好需要用的庫。準(zhǔn)備庫Keras,PIL,numpy,opencv,tensorflow,在Python3.5 環(huán)境下可通過pip install 進(jìn)行安裝的庫如表1 所示。

Table 1 Libraries installed through pip install表1 通過pip install 進(jìn)行安裝的庫
(2)Python 編程環(huán)境中,導(dǎo)入PIL 圖像處理標(biāo)準(zhǔn)庫,包括PIL 引入Keras 的卷積模塊,如Dropout、Conv2D 和Max?Pooling2D。
import keras
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense,Dropout,F(xiàn)latten,Conv2D,MaxPooling2D
from keras.callbacks import EarlyStopping,ModelCheckpoint
from PIL import Image
import numpy as np
(3)數(shù)據(jù)預(yù)處理。在將數(shù)據(jù)輸入神經(jīng)網(wǎng)絡(luò)之前需要將數(shù)據(jù)格式化為經(jīng)過預(yù)處理的浮點(diǎn)數(shù)張量。預(yù)處理流程如下:讀取圖像文件?解碼維RGB 像素網(wǎng)格?轉(zhuǎn)換為浮點(diǎn)張數(shù)?像素縮放為0-1 區(qū)間,如圖2 所示。

Fig.2 Data preprocessing圖2 數(shù)據(jù)預(yù)處理
在TensorFlow API Keras 中有個(gè)比較好用的圖像處理類ImageDataGenerator,它可以將本地圖像文件自動(dòng)轉(zhuǎn)換為處理好的張量。
下面通過代碼解釋如何利用Keras 對(duì)數(shù)據(jù)預(yù)處理,完整代碼如下:

(4)通過Python 代碼設(shè)計(jì)卷積神經(jīng)網(wǎng)絡(luò)。
①搭建卷積神經(jīng)網(wǎng)絡(luò);采用Keras 的序列模型(Se?quential 類建立神經(jīng)網(wǎng)絡(luò)模型)
model=Sequential();
②添加一層卷積層,構(gòu)造64 個(gè)過濾器,每個(gè)過濾器的范圍是3×3×1,過濾器挪動(dòng)步長為1,并用relu 進(jìn)行非線性變換;
model.add(Conv2D(32,kernel_size=(3,),activation=‘relu’,input_shape=input_shape))
model.add(Conv2D(64,(3,3),strides=(1,1),activa?tion=‘relu’))
③添加一層MaxPooling,在2×2 格子中取最大值;
model.add(MaxPooling2D(pool_size=(2,2)))
④設(shè)立Dropout 層,將Dropout 的概率設(shè)為0.5,這個(gè)值可以自行設(shè)置;
model.add(Dropout(0.25))
⑤把當(dāng)前層節(jié)點(diǎn)鋪平;
model.add(Flatten())
⑥構(gòu)造全連接神經(jīng)網(wǎng)絡(luò)層;
model.add(Dense(128,activation=‘relu’))
⑦最后定義損失函數(shù),分類問題的損失函數(shù)選擇采用交叉熵(Cross En-tropy);放入批量樣本進(jìn)行訓(xùn)練;
model.compile(loss=keras.losses.binary_crossentropy,op?timizer=keras.optimizers.Adadelta(), metrics=[‘a(chǎn)c?curacy’])
⑧在測試集上評(píng)價(jià)模型的準(zhǔn)確度。
test_loss=model.evaluate_generator(test_generator)
print(test_loss)
自動(dòng)化測試過程中遇到的自定義控件、圖片、懸浮界面等無法獲得文字信息的場景均可通過文字進(jìn)行識(shí)別與點(diǎn)擊操作,同時(shí)測試結(jié)果中保存的圖片也可用文字識(shí)別收集結(jié)果或進(jìn)行l(wèi)og 整理。
在用戶模擬測試方面,通過圖像獲取封裝文字識(shí)別功能,如果識(shí)別到截圖控件上的文本則對(duì)其進(jìn)行點(diǎn)擊操作。
通過手機(jī)獲取圖像,調(diào)用文字識(shí)別接口識(shí)別出文字,然后通過Python 對(duì)結(jié)果進(jìn)行解析。
人工智能技術(shù)與自動(dòng)化測試技術(shù)結(jié)合可節(jié)省大量的人工成本,使移動(dòng)終端自動(dòng)化測試得到較大發(fā)展,在工業(yè)或商務(wù)領(lǐng)域展現(xiàn)出價(jià)值[9-10]。
首先,軟件測試變得更簡單高效。機(jī)器學(xué)習(xí)擅長通過數(shù)據(jù)訓(xùn)練完成新的數(shù)據(jù)處理,測試人員無需大量手工編寫自動(dòng)化測試用例執(zhí)行測試,只需利用AI 自動(dòng)創(chuàng)建測試用例并執(zhí)行。測試人員主要工作不再是執(zhí)行測試,甚至也不是設(shè)計(jì)自動(dòng)化測試用例,而是提供輸入輸出數(shù)據(jù)來訓(xùn)練AI,最終讓AI 自動(dòng)生成測試用例并執(zhí)行。對(duì)于某些通用測試,只需一個(gè)被驗(yàn)證過的模型,甚至連數(shù)據(jù)也無需提供。
其次,人工智能測試工具可以發(fā)現(xiàn)更多的軟件缺陷。一邊測試一邊時(shí)刻不停地新增數(shù)據(jù)輸入,測試能力會(huì)越來越好,因而能夠發(fā)現(xiàn)更多的缺陷。與此同時(shí),對(duì)于迭代頻繁的軟件開發(fā)而言,當(dāng)一個(gè)軟件缺陷發(fā)現(xiàn)后,測試人員常常需要確定這個(gè)缺陷是什么時(shí)候引入的,這往往需要耗費(fèi)大量的時(shí)間和精力,而人工智能測試工具能夠持續(xù)跟蹤軟件開發(fā)過程,找出其中缺陷被引入的時(shí)間,從而為開發(fā)人員提供有效信息。
最后,基于AI 的測試會(huì)讓測試人員感到困惑,他們可能懷疑AI 測試有效性。要消除這種不信任感,測試人員需掌握數(shù)據(jù)科學(xué)技能,還需了解一些機(jī)器學(xué)習(xí)原理。
對(duì)于軟件測試來說,AI 是一個(gè)工具,一個(gè)很好的助手。而對(duì)于測試人員來說,需要擁抱變化,提升能力,這樣才能更好地發(fā)揮AI 的作用。