





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