摘? 要:為了實(shí)現(xiàn)對資產(chǎn)管理系統(tǒng)Web端自動化測試,研究了一種基于Selenium的unittest框架并采用數(shù)據(jù)驅(qū)動測試技術(shù)。利用Selenium提供的Webdriver定位元素,應(yīng)用數(shù)據(jù)驅(qū)動模式進(jìn)行測試用例腳本執(zhí)行、用例重啟、測試日志和測試報(bào)告自動生成等關(guān)鍵功能的自動執(zhí)行,執(zhí)行完成后將測試過程和測試結(jié)果以直觀的方式反饋給測試人員。實(shí)踐證明,在Web端使用自動化測試,有效節(jié)省了測試時(shí)間,提高了測試效率。
關(guān)鍵詞:Selenium;unittest;框架;數(shù)據(jù)驅(qū)動
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號: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è)人工成本的提高和軟件測試技術(shù)日益受到重視,自動化測試逐漸成為一種趨勢。Selenium是一套強(qiáng)大的Web應(yīng)用自動化測試的工具集,它可以支持多種瀏覽器環(huán)境。在軟件測試中,為了提高自動化測試執(zhí)行的正確性、高效性、穩(wěn)定性和案例性,測試框架采用分層設(shè)計(jì),應(yīng)用數(shù)據(jù)驅(qū)動構(gòu)建數(shù)據(jù)層、邏輯層、業(yè)務(wù)層三層結(jié)構(gòu),實(shí)現(xiàn)將測試數(shù)據(jù)和測試行為完全分離,減少代碼重復(fù)編寫。同時(shí)使用discover將測試用例按照測試功能進(jìn)行拆分,分散到不同的測試文件中實(shí)現(xiàn)所有的測試用例并行執(zhí)行。
本研究對現(xiàn)有測試框架進(jìn)行了優(yōu)化,主要采用了數(shù)據(jù)驅(qū)動、關(guān)鍵字驅(qū)動、discover方法相結(jié)合的方式。Selenium的數(shù)據(jù)驅(qū)動方式主要實(shí)現(xiàn)數(shù)據(jù)和測試腳本的分離,通過關(guān)鍵字驅(qū)動實(shí)現(xiàn)了業(yè)務(wù)邏輯和應(yīng)用程序的分離,discover方法實(shí)現(xiàn)了測試用例的指執(zhí)行。此外,為了提高測試用例的可維護(hù)性在腳本設(shè)計(jì)中采用了Page Object設(shè)計(jì)思想。
1? Selenium自動化測試
Selenium是一款基于Web的自動化測試工具。它提供了一系列測試函數(shù),用于支持Web自動化測試。這些函數(shù)非常靈活,它們能夠通過多種方式定位界面元素,并可以將預(yù)期結(jié)果與系統(tǒng)實(shí)際結(jié)果進(jìn)行比較。Selenium支持Java、C#、Python等多種語言編寫測試腳本,可以在Firefox、IE、Google Chrome、Opera等主流瀏覽器中執(zhí)行測試腳本。Selenium是開源工具軟件,可以按照測試需求搭建框架[1]。
Selenium包含Selenium IDE、Selenium WebDriver、Selenium Grid等3大組件,如圖1所示。Selenium IDE是瀏覽器的一個(gè)插件,負(fù)責(zé)錄制、回放腳本,模擬用戶對頁面的真實(shí)操作,Selenium WebDriver是一個(gè)瀏覽器自動化框架,它接受命令并將它們發(fā)送到瀏覽器。Selenium Grid用于分布式自動化測試,通過控制多臺機(jī)器、多個(gè)瀏覽器并行執(zhí)行測試用例,一般用于多測試用例[2]。
Selenium的工作原理是:測試工程師開發(fā)基于Selenium的測試腳本→執(zhí)行測試腳本→測試腳本程序→提供測試結(jié)果,可以概括為Selenium Client發(fā)送請求,WebDriver接收請求,然后解析請求,發(fā)送請求給瀏覽器,瀏覽器接受請求并執(zhí)行,最后將結(jié)果返回[3],如圖2所示。
2? Unittest單元測試框架
Unittest是python自帶的單元測試框架,主要適用于單元測試,可以對多個(gè)測試用例進(jìn)行管理和封裝。主要用來組織和執(zhí)行測試用例,將單條測試用例組織在一起執(zhí)行,為了保證測試的連續(xù)性Unittest提供了失敗重啟機(jī)構(gòu),使程序在執(zhí)行一條用例失敗后能繼續(xù)執(zhí)行下一條用例。Unittest還提供了豐富的斷言方法,用以判斷否通過,從而生成最終的測試結(jié)果[4]。
Unittest主要用于單元測試的測試用例設(shè)計(jì),Unittest也可實(shí)現(xiàn)批量執(zhí)行測試等功能,同時(shí)適應(yīng)于當(dāng)前流行的敏捷化測試。在自動化測試中利用單元測試框架,使用一個(gè)類來繼承Unittest的TestCase測試用例,每個(gè)case就是一個(gè)最小的測試單元,用測試容器把多個(gè)測試單元組織起來直接執(zhí)行,最后生成測試報(bào)告。Unittest庫包括:TestCase、TestSuite、TestLoder、TextRunner、TextTestResult、TestFixture,unittest[5]單元測試原理如圖3所示。
3? 資產(chǎn)管理軟件測試需求分析
固定資產(chǎn)管理系統(tǒng)是企業(yè)日常使用的管理系統(tǒng),是現(xiàn)代企業(yè)最基本最重要的工具。固定資產(chǎn)管理系統(tǒng)具有數(shù)據(jù)量大、關(guān)系復(fù)雜、使用周期長、維護(hù)困難等特點(diǎn)。資產(chǎn)日常操作管理功能主要包括固定資產(chǎn)的新增、修改、退出、轉(zhuǎn)移、刪除、借用、歸還、維修、計(jì)算折舊率等日常工作,此外系統(tǒng)還包括用戶管理及系統(tǒng)后臺管理等功能。待測固定資產(chǎn)管理系統(tǒng)功能模塊如圖4所示。
目前,固定資產(chǎn)管理系統(tǒng)大多采用B/S結(jié)構(gòu),也就是瀏覽器—服務(wù)器結(jié)構(gòu),用戶主要通過瀏覽器實(shí)現(xiàn)對資產(chǎn)的管理。待測試系統(tǒng)是一個(gè)典型的B/S結(jié)構(gòu)管理系統(tǒng),通過對系統(tǒng)的需要分析,要對該系統(tǒng)進(jìn)行自動化測試,框架設(shè)計(jì)就要包括用例管理、執(zhí)行控制、測試報(bào)表及測試日志等。通過分析,固定資產(chǎn)管理系統(tǒng)一般開發(fā)、維護(hù)周期長,因此適合自動化測試。
4? 框架、數(shù)據(jù)驅(qū)動和discover方法設(shè)計(jì)
自動化測試框架通常主要包括測試用例管理、執(zhí)行控制器、報(bào)表生成以及測試日志等模塊,模塊相互支持、相輔相成形成自動化測試系統(tǒng);數(shù)據(jù)驅(qū)動將代碼與數(shù)據(jù)進(jìn)行分離,單純由數(shù)據(jù)組成文件,再由文件來驅(qū)動關(guān)鍵字,最終實(shí)際整個(gè)自動化的流程讀取到數(shù)據(jù)。
用例管理:用例管理模塊是框架的基本管理模塊,功能主要是用例的添加、修改、刪除等單元,而這些功能也與用例例的模式,測試數(shù)據(jù)管理、可復(fù)用庫等相關(guān)[6]。
控制器:自動化執(zhí)行控制器用于自動化用例的執(zhí)行,主要功能是用不同的方式執(zhí)行用例。自動化控制器使用比較多的是GUI(用戶圖形界面)以及commandline+文件。
報(bào)表生成:報(bào)表生成模塊主要功能是根據(jù)測試用例執(zhí)行情況生成報(bào)表,一般報(bào)表是以HTML的格式生成,報(bào)表主要內(nèi)容是用例的執(zhí)行情況匯總,同時(shí)根據(jù)用例執(zhí)行情況自動生成相應(yīng)的總結(jié)報(bào)告。報(bào)表生成模塊還能設(shè)置郵件發(fā)送功能,將報(bào)表直接發(fā)送到指定郵箱。
測試日志:測試日志模塊是對用例執(zhí)行過程的記錄,通過日志將用例執(zhí)行過程全貌提供給測試者,使測試人員通過調(diào)查用例失敗信息及追蹤用例執(zhí)行情況了解測試基本情況。
數(shù)據(jù)驅(qū)動處理:測試數(shù)據(jù)的改變引起執(zhí)行結(jié)果的改變叫數(shù)據(jù)驅(qū)動。我們通過腳本循環(huán)執(zhí)行,讀取一文件中不同的內(nèi)容來完成自動化工作。使用數(shù)據(jù)驅(qū)動的模式,可以根據(jù)業(yè)務(wù)分解測試數(shù)據(jù),只需定義變量,使用外部或者自定義的數(shù)據(jù)使其參數(shù)化,從而避免了使用之前測試腳本中固定的數(shù)據(jù)??梢詫y試腳本與測試數(shù)據(jù)分離,使得測試腳本在不同數(shù)據(jù)集合下高度復(fù)用。測試腳本與測試數(shù)據(jù)分離不僅提高了測試覆蓋,還可減少測試腳本的編寫與維護(hù)工作,降低測試成本。根據(jù)固定資產(chǎn)管理系統(tǒng)測試需求對系統(tǒng)登錄模塊進(jìn)行Unittest框架、數(shù)據(jù)驅(qū)動及discover方法設(shè)計(jì)[7]:
1.新建csv讀取文件csvdata.py
Import csv? #導(dǎo)入csv代碼庫
def read():? #將數(shù)據(jù)讀取存放在一個(gè)方法中,方便后面調(diào)用
path=r”D:\test\element1.csv”
stream=open(path,’r’)? #以只讀的形式打開文件
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.建立測試用例文件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)登錄頁面
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é)果分析
引入自動化測試的主要目的是減少重復(fù)工作,提高測試工作效率,而使用自動化測試使回歸測試更簡易方便,從而達(dá)到節(jié)約開發(fā)成本的目的。在固定資產(chǎn)管理系統(tǒng)的自動化測試過程中,共做過5次版本升級,版本升級都會編寫大量的測試用例對系統(tǒng)進(jìn)行驗(yàn)證。資產(chǎn)管理系統(tǒng)自動化測試使用了1 200個(gè)測試用例,為了對比自動化測試與手工測試的耗時(shí)情況。項(xiàng)目組對資產(chǎn)管理系統(tǒng)的系統(tǒng)增加用戶、增加資產(chǎn)信息、資產(chǎn)信息查詢、添加維修信息、維修信息查詢等模塊進(jìn)行了自動化和手工測試耗時(shí)對比,結(jié)果如表1所示。
自動化測試的優(yōu)勢在于在多個(gè)平臺環(huán)境上運(yùn)行相同的用例、大量組合性測試或其他重復(fù)性測試以及任務(wù)周期長的軟件產(chǎn)品開發(fā)項(xiàng)目,對于回歸測試更高效。為了對比自動化測試與手工測試的收益率,使用函數(shù)為:
其中,Thp為手工測試準(zhǔn)備時(shí)間;Thr為手工測試日間;Tap為自動化測試準(zhǔn)備時(shí)間;Tar為自動化測試時(shí)間。
自動化和手工測試收益率對比,結(jié)果如表2所示。
為了對比自動化測試和手工測試收益率,對固定資產(chǎn)管理系統(tǒng)分別進(jìn)行了自動化測試和手工測試,通過對比發(fā)現(xiàn)測試初期,自動化測試收益率較低,但隨著回歸測試次數(shù)的增加,自動化測試的收益率顯著提高。這是因?yàn)樽詣踊瘻y試在前期需要開發(fā)大量復(fù)雜的測試腳本,隨著腳本的完成,自動化測試的優(yōu)勢就很快顯現(xiàn)。
6? 結(jié)? 論
項(xiàng)目根據(jù)固定資產(chǎn)管理系統(tǒng)的用戶需求以Selenium的Unittest框架為基礎(chǔ),利用數(shù)據(jù)驅(qū)動和Page Object設(shè)計(jì)技術(shù)對框架進(jìn)行了優(yōu)化,用優(yōu)化的Web應(yīng)用自動化測試框架對資產(chǎn)管理系統(tǒng)執(zhí)行測試,同時(shí)還進(jìn)行了手工測試,并將兩種測試結(jié)果進(jìn)行對比。
在軟件測試中,當(dāng)回歸測試的次數(shù)一次次增加,自動化測試的收益率顯著提高。自動化測試前期需要投入較多成本開發(fā)腳本,當(dāng)自動化測試框架、腳本設(shè)計(jì)完成后,自動化執(zhí)行用例效率會遠(yuǎn)遠(yuǎn)高于手工測試。通過使用自動化和手工測試兩種方法及結(jié)果進(jìn)行比較,自動化測試效率遠(yuǎn)高于手工測試。
參考文獻(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自動化測試框架的開發(fā)與應(yīng)用 [D].武漢:武漢理工大學(xué),2012.
[4] 易彤,林茂春.基于關(guān)鍵字驅(qū)動的自動化測試研究與實(shí)現(xiàn) [J].電子技術(shù)與軟件工程,2015(5):76.
[5] 高宇.Web自動化測試系統(tǒng)的研究與實(shí)現(xiàn) [D].北京:北京工業(yè)大學(xué),2017.
[6] 陳麗麗,林莉,傅曉娟.基于關(guān)鍵字驅(qū)動的自動化測試框架研究 [J].長春理工大學(xué)學(xué)報(bào),2012,7(7):238-239.
[7] 李國強(qiáng),張虹,王海瑞.軟件測試關(guān)鍵技術(shù)的研究與應(yīng)用 [J].火控雷達(dá)技術(shù),2014,43(2):112-117.
作者簡介:鄭根讓(1970.09—),男,漢族,陜西寶雞人,副教授,碩士,研究方向:軟件技術(shù)與測試、高等職業(yè)教育研究。