摘? 要:為了實(shí)現(xiàn)對(duì)資產(chǎn)管理系統(tǒng)Web端自動(dòng)化測(cè)試,研究了一種基于Selenium的unittest框架并采用數(shù)據(jù)驅(qū)動(dòng)測(cè)試技術(shù)。利用Selenium提供的Webdriver定位元素,應(yīng)用數(shù)據(jù)驅(qū)動(dòng)模式進(jìn)行測(cè)試用例腳本執(zhí)行、用例重啟、測(cè)試日志和測(cè)試報(bào)告自動(dòng)生成等關(guān)鍵功能的自動(dòng)執(zhí)行,執(zhí)行完成后將測(cè)試過(guò)程和測(cè)試結(jié)果以直觀的方式反饋給測(cè)試人員。實(shí)踐證明,在Web端使用自動(dòng)化測(cè)試,有效節(jié)省了測(cè)試時(shí)間,提高了測(cè)試效率。
關(guān)鍵詞:Selenium;unittest;框架;數(shù)據(jù)驅(qū)動(dòng)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2021)18-0021-04
Abstract: In order to realize the automatic test of the Web side of the assets management system, a unittest framework based on Selenium is studied and data driven testing technology is adopted. Uses the Webdriver provided by Selenium to locate elements. Data driven mode is applied to automatically execute key functions such as test case script execution, case restart, automatic generation of test log and test report. After execution, the test process and test results are fed back to testers in an intuitive way. Practice has proved that using automatic test on the Web side can effectively save test time and improve test efficiency.
Keywords: Selenium; unittest; framework; data driven
0? 引? 言
隨著軟件產(chǎn)業(yè)人工成本的提高和軟件測(cè)試技術(shù)日益受到重視,自動(dòng)化測(cè)試逐漸成為一種趨勢(shì)。Selenium是一套強(qiáng)大的Web應(yīng)用自動(dòng)化測(cè)試的工具集,它可以支持多種瀏覽器環(huán)境。在軟件測(cè)試中,為了提高自動(dòng)化測(cè)試執(zhí)行的正確性、高效性、穩(wěn)定性和案例性,測(cè)試框架采用分層設(shè)計(jì),應(yīng)用數(shù)據(jù)驅(qū)動(dòng)構(gòu)建數(shù)據(jù)層、邏輯層、業(yè)務(wù)層三層結(jié)構(gòu),實(shí)現(xiàn)將測(cè)試數(shù)據(jù)和測(cè)試行為完全分離,減少代碼重復(fù)編寫。同時(shí)使用discover將測(cè)試用例按照測(cè)試功能進(jìn)行拆分,分散到不同的測(cè)試文件中實(shí)現(xiàn)所有的測(cè)試用例并行執(zhí)行。
本研究對(duì)現(xiàn)有測(cè)試框架進(jìn)行了優(yōu)化,主要采用了數(shù)據(jù)驅(qū)動(dòng)、關(guān)鍵字驅(qū)動(dòng)、discover方法相結(jié)合的方式。Selenium的數(shù)據(jù)驅(qū)動(dòng)方式主要實(shí)現(xiàn)數(shù)據(jù)和測(cè)試腳本的分離,通過(guò)關(guān)鍵字驅(qū)動(dòng)實(shí)現(xiàn)了業(yè)務(wù)邏輯和應(yīng)用程序的分離,discover方法實(shí)現(xiàn)了測(cè)試用例的指執(zhí)行。此外,為了提高測(cè)試用例的可維護(hù)性在腳本設(shè)計(jì)中采用了Page Object設(shè)計(jì)思想。
1? Selenium自動(dòng)化測(cè)試
Selenium是一款基于Web的自動(dòng)化測(cè)試工具。它提供了一系列測(cè)試函數(shù),用于支持Web自動(dòng)化測(cè)試。這些函數(shù)非常靈活,它們能夠通過(guò)多種方式定位界面元素,并可以將預(yù)期結(jié)果與系統(tǒng)實(shí)際結(jié)果進(jìn)行比較。Selenium支持Java、C#、Python等多種語(yǔ)言編寫測(cè)試腳本,可以在Firefox、IE、Google Chrome、Opera等主流瀏覽器中執(zhí)行測(cè)試腳本。Selenium是開(kāi)源工具軟件,可以按照測(cè)試需求搭建框架[1]。
Selenium包含Selenium IDE、Selenium WebDriver、Selenium Grid等3大組件,如圖1所示。Selenium IDE是瀏覽器的一個(gè)插件,負(fù)責(zé)錄制、回放腳本,模擬用戶對(duì)頁(yè)面的真實(shí)操作,Selenium WebDriver是一個(gè)瀏覽器自動(dòng)化框架,它接受命令并將它們發(fā)送到瀏覽器。Selenium Grid用于分布式自動(dòng)化測(cè)試,通過(guò)控制多臺(tái)機(jī)器、多個(gè)瀏覽器并行執(zhí)行測(cè)試用例,一般用于多測(cè)試用例[2]。
Selenium的工作原理是:測(cè)試工程師開(kāi)發(fā)基于Selenium的測(cè)試腳本→執(zhí)行測(cè)試腳本→測(cè)試腳本程序→提供測(cè)試結(jié)果,可以概括為Selenium Client發(fā)送請(qǐng)求,WebDriver接收請(qǐng)求,然后解析請(qǐng)求,發(fā)送請(qǐng)求給瀏覽器,瀏覽器接受請(qǐng)求并執(zhí)行,最后將結(jié)果返回[3],如圖2所示。
2? Unittest單元測(cè)試框架
Unittest是python自帶的單元測(cè)試框架,主要適用于單元測(cè)試,可以對(duì)多個(gè)測(cè)試用例進(jìn)行管理和封裝。主要用來(lái)組織和執(zhí)行測(cè)試用例,將單條測(cè)試用例組織在一起執(zhí)行,為了保證測(cè)試的連續(xù)性Unittest提供了失敗重啟機(jī)構(gòu),使程序在執(zhí)行一條用例失敗后能繼續(xù)執(zhí)行下一條用例。Unittest還提供了豐富的斷言方法,用以判斷否通過(guò),從而生成最終的測(cè)試結(jié)果[4]。
Unittest主要用于單元測(cè)試的測(cè)試用例設(shè)計(jì),Unittest也可實(shí)現(xiàn)批量執(zhí)行測(cè)試等功能,同時(shí)適應(yīng)于當(dāng)前流行的敏捷化測(cè)試。在自動(dòng)化測(cè)試中利用單元測(cè)試框架,使用一個(gè)類來(lái)繼承Unittest的TestCase測(cè)試用例,每個(gè)case就是一個(gè)最小的測(cè)試單元,用測(cè)試容器把多個(gè)測(cè)試單元組織起來(lái)直接執(zhí)行,最后生成測(cè)試報(bào)告。Unittest庫(kù)包括:TestCase、TestSuite、TestLoder、TextRunner、TextTestResult、TestFixture,unittest[5]單元測(cè)試原理如圖3所示。
3? 資產(chǎn)管理軟件測(cè)試需求分析
固定資產(chǎn)管理系統(tǒng)是企業(yè)日常使用的管理系統(tǒng),是現(xiàn)代企業(yè)最基本最重要的工具。固定資產(chǎn)管理系統(tǒng)具有數(shù)據(jù)量大、關(guān)系復(fù)雜、使用周期長(zhǎng)、維護(hù)困難等特點(diǎn)。資產(chǎn)日常操作管理功能主要包括固定資產(chǎn)的新增、修改、退出、轉(zhuǎn)移、刪除、借用、歸還、維修、計(jì)算折舊率等日常工作,此外系統(tǒng)還包括用戶管理及系統(tǒng)后臺(tái)管理等功能。待測(cè)固定資產(chǎn)管理系統(tǒng)功能模塊如圖4所示。
目前,固定資產(chǎn)管理系統(tǒng)大多采用B/S結(jié)構(gòu),也就是瀏覽器—服務(wù)器結(jié)構(gòu),用戶主要通過(guò)瀏覽器實(shí)現(xiàn)對(duì)資產(chǎn)的管理。待測(cè)試系統(tǒng)是一個(gè)典型的B/S結(jié)構(gòu)管理系統(tǒng),通過(guò)對(duì)系統(tǒng)的需要分析,要對(duì)該系統(tǒng)進(jìn)行自動(dòng)化測(cè)試,框架設(shè)計(jì)就要包括用例管理、執(zhí)行控制、測(cè)試報(bào)表及測(cè)試日志等。通過(guò)分析,固定資產(chǎn)管理系統(tǒng)一般開(kāi)發(fā)、維護(hù)周期長(zhǎng),因此適合自動(dòng)化測(cè)試。
4? 框架、數(shù)據(jù)驅(qū)動(dòng)和discover方法設(shè)計(jì)
自動(dòng)化測(cè)試框架通常主要包括測(cè)試用例管理、執(zhí)行控制器、報(bào)表生成以及測(cè)試日志等模塊,模塊相互支持、相輔相成形成自動(dòng)化測(cè)試系統(tǒng);數(shù)據(jù)驅(qū)動(dòng)將代碼與數(shù)據(jù)進(jìn)行分離,單純由數(shù)據(jù)組成文件,再由文件來(lái)驅(qū)動(dòng)關(guān)鍵字,最終實(shí)際整個(gè)自動(dòng)化的流程讀取到數(shù)據(jù)。
用例管理:用例管理模塊是框架的基本管理模塊,功能主要是用例的添加、修改、刪除等單元,而這些功能也與用例例的模式,測(cè)試數(shù)據(jù)管理、可復(fù)用庫(kù)等相關(guān)[6]。
控制器:自動(dòng)化執(zhí)行控制器用于自動(dòng)化用例的執(zhí)行,主要功能是用不同的方式執(zhí)行用例。自動(dòng)化控制器使用比較多的是GUI(用戶圖形界面)以及commandline+文件。
報(bào)表生成:報(bào)表生成模塊主要功能是根據(jù)測(cè)試用例執(zhí)行情況生成報(bào)表,一般報(bào)表是以HTML的格式生成,報(bào)表主要內(nèi)容是用例的執(zhí)行情況匯總,同時(shí)根據(jù)用例執(zhí)行情況自動(dòng)生成相應(yīng)的總結(jié)報(bào)告。報(bào)表生成模塊還能設(shè)置郵件發(fā)送功能,將報(bào)表直接發(fā)送到指定郵箱。
測(cè)試日志:測(cè)試日志模塊是對(duì)用例執(zhí)行過(guò)程的記錄,通過(guò)日志將用例執(zhí)行過(guò)程全貌提供給測(cè)試者,使測(cè)試人員通過(guò)調(diào)查用例失敗信息及追蹤用例執(zhí)行情況了解測(cè)試基本情況。
數(shù)據(jù)驅(qū)動(dòng)處理:測(cè)試數(shù)據(jù)的改變引起執(zhí)行結(jié)果的改變叫數(shù)據(jù)驅(qū)動(dòng)。我們通過(guò)腳本循環(huán)執(zhí)行,讀取一文件中不同的內(nèi)容來(lái)完成自動(dòng)化工作。使用數(shù)據(jù)驅(qū)動(dòng)的模式,可以根據(jù)業(yè)務(wù)分解測(cè)試數(shù)據(jù),只需定義變量,使用外部或者自定義的數(shù)據(jù)使其參數(shù)化,從而避免了使用之前測(cè)試腳本中固定的數(shù)據(jù)??梢詫y(cè)試腳本與測(cè)試數(shù)據(jù)分離,使得測(cè)試腳本在不同數(shù)據(jù)集合下高度復(fù)用。測(cè)試腳本與測(cè)試數(shù)據(jù)分離不僅提高了測(cè)試覆蓋,還可減少測(cè)試腳本的編寫與維護(hù)工作,降低測(cè)試成本。根據(jù)固定資產(chǎn)管理系統(tǒng)測(cè)試需求對(duì)系統(tǒng)登錄模塊進(jìn)行Unittest框架、數(shù)據(jù)驅(qū)動(dòng)及discover方法設(shè)計(jì)[7]:
1.新建csv讀取文件csvdata.py
Import csv? #導(dǎo)入csv代碼庫(kù)
def read():? #將數(shù)據(jù)讀取存放在一個(gè)方法中,方便后面調(diào)用
path=r”D:\test\element1.csv”
stream=open(path,’r’)? #以只讀的形式打開(kāi)文件
data=csv.reader(stream)? #進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換
list=[]? #將讀取的數(shù)據(jù)放到list中
i=0
for row in data:? #使用for循環(huán)進(jìn)行讀取
if i!=0:
list.append(row)
i=i+1
rerurn list
2.建立測(cè)試用例文件csvtest.py
Import ddt
import unittest
import time
from selenium import webdriver
class denglu(unittest.TestCase):
def setUpClass(cls):? #定義setUpClass方法
cls.driver=webdriver.Chrome()
cls.driver=implicitly_wait(30)
def tearDownClass(cls):? #定義tearDownClass方法
cls.driver.quit()
def test_denglu(self):? #定義test_denglu方法
self.driver.get(“http://192.168.X.XXX/test/login”)? #進(jìn)入資產(chǎn)管理系統(tǒng)登錄頁(yè)面
self.driver.find_element_by_name(“username”).send_keys(“zhanguser”)? #輸入用戶名
self.driver.find_element_by_name(“password”).send_keys(“*******”)? #輸入密碼
self.driver.find_element_by_class_name(“uppercase”).click()? #點(diǎn)擊登錄
time.sleep(3)
self.driver.find_element_by_link_text(“資產(chǎn)管理”).click()? #點(diǎn)擊資產(chǎn)管理按鈕
3.建立runtest.py文件
import unittest
test_dir=’./test_case’
discover=unittest.defaultTestLoader.discover(test_dir,pattern=”test*.py”)
if _name_=’__main__’:
runner=unittest.TextTestRunner()
runner.run(discover)
5? 結(jié)果分析
引入自動(dòng)化測(cè)試的主要目的是減少重復(fù)工作,提高測(cè)試工作效率,而使用自動(dòng)化測(cè)試使回歸測(cè)試更簡(jiǎn)易方便,從而達(dá)到節(jié)約開(kāi)發(fā)成本的目的。在固定資產(chǎn)管理系統(tǒng)的自動(dòng)化測(cè)試過(guò)程中,共做過(guò)5次版本升級(jí),版本升級(jí)都會(huì)編寫大量的測(cè)試用例對(duì)系統(tǒng)進(jìn)行驗(yàn)證。資產(chǎn)管理系統(tǒng)自動(dòng)化測(cè)試使用了1 200個(gè)測(cè)試用例,為了對(duì)比自動(dòng)化測(cè)試與手工測(cè)試的耗時(shí)情況。項(xiàng)目組對(duì)資產(chǎn)管理系統(tǒng)的系統(tǒng)增加用戶、增加資產(chǎn)信息、資產(chǎn)信息查詢、添加維修信息、維修信息查詢等模塊進(jìn)行了自動(dòng)化和手工測(cè)試耗時(shí)對(duì)比,結(jié)果如表1所示。
自動(dòng)化測(cè)試的優(yōu)勢(shì)在于在多個(gè)平臺(tái)環(huán)境上運(yùn)行相同的用例、大量組合性測(cè)試或其他重復(fù)性測(cè)試以及任務(wù)周期長(zhǎng)的軟件產(chǎn)品開(kāi)發(fā)項(xiàng)目,對(duì)于回歸測(cè)試更高效。為了對(duì)比自動(dòng)化測(cè)試與手工測(cè)試的收益率,使用函數(shù)為:
其中,Thp為手工測(cè)試準(zhǔn)備時(shí)間;Thr為手工測(cè)試日間;Tap為自動(dòng)化測(cè)試準(zhǔn)備時(shí)間;Tar為自動(dòng)化測(cè)試時(shí)間。
自動(dòng)化和手工測(cè)試收益率對(duì)比,結(jié)果如表2所示。
為了對(duì)比自動(dòng)化測(cè)試和手工測(cè)試收益率,對(duì)固定資產(chǎn)管理系統(tǒng)分別進(jìn)行了自動(dòng)化測(cè)試和手工測(cè)試,通過(guò)對(duì)比發(fā)現(xiàn)測(cè)試初期,自動(dòng)化測(cè)試收益率較低,但隨著回歸測(cè)試次數(shù)的增加,自動(dòng)化測(cè)試的收益率顯著提高。這是因?yàn)樽詣?dòng)化測(cè)試在前期需要開(kāi)發(fā)大量復(fù)雜的測(cè)試腳本,隨著腳本的完成,自動(dòng)化測(cè)試的優(yōu)勢(shì)就很快顯現(xiàn)。
6? 結(jié)? 論
項(xiàng)目根據(jù)固定資產(chǎn)管理系統(tǒng)的用戶需求以Selenium的Unittest框架為基礎(chǔ),利用數(shù)據(jù)驅(qū)動(dòng)和Page Object設(shè)計(jì)技術(shù)對(duì)框架進(jìn)行了優(yōu)化,用優(yōu)化的Web應(yīng)用自動(dòng)化測(cè)試框架對(duì)資產(chǎn)管理系統(tǒng)執(zhí)行測(cè)試,同時(shí)還進(jìn)行了手工測(cè)試,并將兩種測(cè)試結(jié)果進(jìn)行對(duì)比。
在軟件測(cè)試中,當(dāng)回歸測(cè)試的次數(shù)一次次增加,自動(dòng)化測(cè)試的收益率顯著提高。自動(dòng)化測(cè)試前期需要投入較多成本開(kāi)發(fā)腳本,當(dāng)自動(dòng)化測(cè)試框架、腳本設(shè)計(jì)完成后,自動(dòng)化執(zhí)行用例效率會(huì)遠(yuǎn)遠(yuǎn)高于手工測(cè)試。通過(guò)使用自動(dòng)化和手工測(cè)試兩種方法及結(jié)果進(jìn)行比較,自動(dòng)化測(cè)試效率遠(yuǎn)高于手工測(cè)試。
參考文獻(xiàn):
[1] WOODWARD M R. Insights into software testing [J].Software Focus,2001,2(3):93-103.
[2] TEICH J. Hardware/Software Codesign:The Past,the Present,and Predicting theFuture [J].Proceedings of the IEEE,2012,100(s1):1411-1430.
[3] 杜麗潔.基于QTP自動(dòng)化測(cè)試框架的開(kāi)發(fā)與應(yīng)用 [D].武漢:武漢理工大學(xué),2012.
[4] 易彤,林茂春.基于關(guān)鍵字驅(qū)動(dòng)的自動(dòng)化測(cè)試研究與實(shí)現(xiàn) [J].電子技術(shù)與軟件工程,2015(5):76.
[5] 高宇.Web自動(dòng)化測(cè)試系統(tǒng)的研究與實(shí)現(xiàn) [D].北京:北京工業(yè)大學(xué),2017.
[6] 陳麗麗,林莉,傅曉娟.基于關(guān)鍵字驅(qū)動(dòng)的自動(dòng)化測(cè)試框架研究 [J].長(zhǎng)春理工大學(xué)學(xué)報(bào),2012,7(7):238-239.
[7] 李國(guó)強(qiáng),張虹,王海瑞.軟件測(cè)試關(guān)鍵技術(shù)的研究與應(yīng)用 [J].火控雷達(dá)技術(shù),2014,43(2):112-117.
作者簡(jiǎn)介:鄭根讓(1970.09—),男,漢族,陜西寶雞人,副教授,碩士,研究方向:軟件技術(shù)與測(cè)試、高等職業(yè)教育研究。