方巍,吳伶琳
(1.江蘇省太倉高級中學,太倉215411;2.蘇州健雄職業技術學院人工智能學院,太倉215411)
隨著軟件在社會各個領域中發揮的作用不斷增大,軟件產品的質量越來越受到企業和用戶的重視。然而軟件迭代的周期縮短導致軟件測試的速度跟開發脫節,如何較大幅度地提升軟件測試的效率成為人們研究的熱點問題。與傳統的人工測試相比,合理地運用自動化測試技術能節約大量的人力、物力,能夠縮短測試周期,從而較好地解決這一問題。
與手工測試類似,自動化測試也需要制定測試計劃,根據軟件需求規格說明書分析測試需求,使用黑盒、白盒等方法設計測試用例,在搭建好測試環境的基礎上使用相關語言編寫自動化腳本,執行測試并記錄缺陷等。當然在執行自動化腳本之前也需要進行手工測試,為更好地發現缺陷奠定堅實的基礎。
根據被測軟件的類型不同,可以選擇不同的測試工具。例如針對桌面應用,主流的測試工具有UTF、Auto Runner等;如果測試的是Web系統,Selenium則是一種非常不錯的選擇。
Selenium是一款免費、開源的分布式的自動化測試工具,對商業用戶也沒有任何限制;支持多種平臺,可以在Windows、Linux、Mac和Solaris等多種操作系統上運行;支持多種瀏覽器,包括IE、Firefox、Safari、Opera、Chrome等;使用方便,支持腳本錄制,可以將測試用例分布到不同的測試機器上執行;支持多種語言,包括C、Java、Ruby、Python、C#等。
Python是一門優雅而健壯的編程語言,它繼承了傳統編譯語言的強大性和通用性,同時也借鑒了簡單腳本和解釋語言的易用性[1]。它的特點包括:代碼簡潔、短小,開源、跨平臺,面向對象,可擴展性好等,因此它被應用于數據分析與處理、網絡爬蟲、Web應用開發、人工智能、自動化測試等多個領域。
在自動化測試領域既可以使用Python的標準庫PyUnit作為自動化測試框架,也可以使用Robot Frame?work等自動化測試框架來開展工作,該框架具備良好的可擴展性,支持關鍵字驅動,可以同時測試多種類型的客戶端或者接口,可以進行分布式測試執行。
自動化功能測試工具Selenium可以模仿人類對網頁進行自動化的操作,那么要實現對網頁元素的操作,就要能夠精準地對網頁元素進行定位。可以用于定位的常用的Web頁面元素的屬性有:id、name、class name、link text、XPath和CSS Selector等。下面我們重點介紹常用的四種方法。
如果Web頁面中的id不是動態的,則一個頁面的id是唯一的。該方法通過查找Web頁面上的元素id值來獲取元素,但是對于動態分配Web元素id的情況,這種方法不能使用。
例如:百度首頁搜索框的源代碼如下:
不難發現其id屬性是“kw”,因此可以使用id來進行元素定位。driver表示為創建的一個webdriver對象,代碼為:
element=driver.find_element_by_id("kw")
訪問網頁的時候,我們可以通過超鏈接的方式鏈接到下層的網頁或者其他網站,通過查找網頁的link text屬性,模擬對鏈接文本的單擊操作就可以實現自動的訪問。該定位方法僅適用于文本鏈接的場景,通過元素標簽對應的文本信息來定位元素,相對其他的元素定位方法,適用的場景比較有限[2]。
例如百度首頁上方“新聞”文字的link text屬性是“新聞”,可以使用該屬性來進行元素定位。代碼為:
element=driver.find_element_by_link_text("新聞")
XPath是英文XML Path Language的簡稱,即XML文檔路徑的定位語言。XPath基于XML的樹狀結構進行信息的查找,它使用路徑表達式定位XML文檔中的節點或節點集。通過記錄由根節點到該節點經過的所有節點的tagName等信息,可以形成唯一一條到達該節點的路徑表達式[3]。Selenium可以將這種強大的語言應用在Web頁面元素的定位中,定位的方式通常有絕對路徑和相對路徑兩種。具體如下:
(1)絕對路徑
絕對路徑表達式以“/”開頭,它從樹形結構的根節點開始,沿著樹結構一直到目標節點結束。當元素層級很深的時候,絕對路徑表達式會過長,閱讀性不好,既影響查找的效率又很難進行維護,因此一般不建議使用。
(2)相對路徑
相對路徑表達式以“//”開頭,它從某個節點開始,沿著樹結構一直到目標節點結束。目前常用的瀏覽器谷歌、火狐等都提供了XPath的工具,可以方便地獲取XPath路徑。例如百度搜索框的XPath屬性可以通過定位到該元素,在該元素的HTML代碼使用快捷菜單“Copy->Copy XPath”獲得,其屬性值為“//*[@id="kw"]”。“//”表示當前頁面某個目錄下;“*”是通配符,表示匹配任意的節點;“[@id="kw"]”表示匹配的這個元素的id屬性值等于kw。
層疊樣式表CSS是英文Cascading Style Sheets的簡稱,是一種用來表現HTML或XML等文件樣式的計算機語言,它也可以通過瀏覽器工具查詢相關元素的CSS,從而進行元素定位。例如百度搜索框的CSS屬性可以通過定位到該元素,在該元素的HTML代碼使用快捷菜單“Copy->Copy selector”獲得,其屬性值為#kw。代碼可以寫成:
element=driver.find_element_by_css_selector("#kw")
Selenium庫中有一個WebDriver的API,它能夠使用Chrome、Firefox、IE等瀏覽器進行Web測試,模擬用戶打開瀏覽器,在頁面單擊鼠標,鼠標在某個元素上懸停,進行鍵盤各項操作等。Selenium測試通過模擬用戶在前端的鍵盤鼠標等操作,觸發前端頁面事件,解析網頁文檔獲取相應結果驗證[4]。
鼠標操作除了我們比較熟悉的單擊操作外,還包括右擊、雙擊、懸停和拖動等。在WebDriver中,將這些關于鼠標操作的方法封裝在ActionChains類提供[5]。例如,鼠標懸停的代碼為:
#引入ActionChains類
from selenium.webdriver.common.action_chains import Action?Chains
#定位元素并懸停
above=driver.find_element_by_link_text("文庫")
ActionChains(driver).move_to_element(above).perform()
所有鍵盤中操作的方法由Keys類提供,它既可以模擬鍵盤的輸入,也可以模擬鍵盤按鍵,包括組合鍵(例如Ctrl+N)。模擬百度搜索框中輸入搜索關鍵字“Python”的代碼為:
#引入Keys類
from selenium.webdriver.common.keys import Keys
#模擬輸入框輸入內容
driver.find_element_by_id("kw").send_keys("Python")
由于自動化測試的操作速度比人工快許多,加上目前網頁中普遍使用AJAX技術,頁面元素可能不是同時被加載,就需要設置合適的等待時間,確保元素正確地被識別。WebDriver中有兩種類型的等待:顯式等待和隱式等待。
如果在操作過程中單擊某個鏈接彈出新窗口后,就需要使用switch_to.window( )方法進行切換,從而確保后續的相關操作能順利進行。
WebDriver還可以處理由JavaScript生成的彈框,方法是使用switch_to_alert( )定位到警告框,然后使用相關方法來進行操作,使用的方法包括:
●text:返回警告框中的文字信息
●accept:接受當前警告框
●dismiss:解散當前警告框
●send_keys(KeysToSend):發送文本至當前警告框
自動化測試的過程大致可以分為:分析測試需求、編寫測試用例、搭建測試環境、創建測試腳本、執行測試及測試結果分析等。
不論手工測試或者自動化測試,測試需求都是測試工作開展的首要前提,根據需求確定被測軟件的哪些模塊適合開展自動化功能測試。
自動化測試是在手工測試的基礎上進行的,分析各模塊的功能特點,根據已有的功能測試用例抽取自動化測試用例,并進行補充和完善,盡量細化到具體的頁面和對象[6]。
搭建自動化測試環境首先要下載并安裝Python,并且安裝包管理工具pip;接著需要下載并安裝Python的Selenium包,并且驗證安裝是否成功;最后需要下載瀏覽器的驅動,并放置在Python安裝目錄的根目錄下。需要特別注意的是:瀏覽器、Selenium版本以及瀏覽器驅動的匹配,否則瀏覽器將無法正常啟動。下面在Python自帶的IDLE環境中,以啟動谷歌瀏覽器為例來驗證環境是否搭建成功。代碼如下:
from selenium import webdriver #導入webdriver模塊
driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
執行程序后,如果可以自動啟動谷歌瀏覽器并訪問“百度”首頁,就表示環境搭建成功。
對于較大的系統測試,可以通過對Selenium進行二次封裝搭建測試框架,提高對頁面元素的可視化程度,從而提高測試腳本的編寫效率。測試框架應該是由待測系統功能抽離出的共用部分來構建而成的,不能依賴于具體的應用系統,即測試框架與待測系統盡量是低耦合的,這樣可以使測試框架具有較高的可復用性[7]。為了減少腳本的冗余,降低腳本的維護成本,可以將測試程序中普遍的、共同的腳本提取出來,作為類和接口供其他腳本進行調用。
自動化測試腳本主要圍繞業務流程展開,即由頁面元素、業務邏輯、測試數據等組成,測試數據既可以存放在Excel表中,也可以存放在MySQL等數據庫中。下面以某論壇系統的注冊功能為例,代碼如下:
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("http://172.21.1.7:8081/bbs/")
driver.find_element_by_link_text("register").click();#跳轉至
注冊頁面
time.sleep(2)#停頓2秒
driver.find_element_by_name("userName").send_keys("wull")
#輸入用戶名
driver.find_element_by_name ("password").send_keys
("wull123")#輸入密碼
driver.find_element_by_name ("passconfirm").send_keys
("wull123")#輸入確認密碼
driver.find_element_by_xpath ("http://select[@name='sex']").
send_keys("female")#輸入性別
#輸入電話
driver.find_element_by_xpath ("http://input[@name='phone']").
send_keys("13812345678")
#輸入電郵
driver.find_element_by_xpath ("http://input[@name='email']").
send_keys("12345678@qq.com")
driver.find_element_by_id("submit").click()#提交注冊信息
driver.switch_to_alert().accept()#關閉彈框
driver.close()#關閉瀏覽器
測試腳本是以.py為后綴的文件,如果需要執行之后生成測試報告,需要安裝并調用Unittest的第三方庫HTMLTestRunner,運行代碼后生成的測試報告是HT?ML格式的,可以根據測試報告對測試的結果進行分析。
基于Selenium+Python的自動化測試應用可以減少人工重復多次的驗證活動,降低測試的成本,從而較大幅度地提高軟件測試的效率,保證軟件產品的質量。后期可以進一步優化自動化測試框架,提高控件可視化識別的效率,加快元素定位的效率,并且加強測試用例的管理。