天天看點

python selenium unittest_python+selenium+unittest——ui自動化的輕量級選擇

最近項目部分趨于穩定,部分功能進入了維護階段,但每次的小改動都需要進行回歸測試,回歸的用例不多但也算是重複勞動浪費資源。為了節約這部分人力,我考慮引入web的ui自動化。之前在其他項目中用的都是java+selenium+testng這樣的架構選型,由于testng提供了友善的參數化功能友善多組測試資料分類整合運作自動化,是以廣受歡迎。然而,本次的自動化由于其業務的特殊性,其難點在于對業務自動化的實作,而非資料的組織,同時為了更快地實作這部分自動化解放生産力我決定選擇一組更輕量的結構來實作。 相對于java,python可以更快地實作一個自動化case,下面介紹下過程。

一、建構一個python環境

1.安裝python環境

如果你是mac系統,那麼python自帶,不用操心。但萬惡的windows總是要人操心的。 先安裝python,注意安裝2.x就好了,相容性更好一些。可以配置下環境變量,友善使用。然後再安裝pip,pip官方解釋:A tool for installing and managing Python packages. 也就是說pip是個python下用來安裝第三方工具包的工具。

2.安裝selenium

pip install -U selenium

python selenium unittest_python+selenium+unittest——ui自動化的輕量級選擇

3.安裝火狐驅動

這裡遇到這個問題,使用以下測試代碼運作後打開了火狐浏覽器但是一直卡住最後退出。

python selenium unittest_python+selenium+unittest——ui自動化的輕量級選擇

報錯如下:

python selenium unittest_python+selenium+unittest——ui自動化的輕量級選擇

原來firefox47以上就需要第三方驅動了,由于網絡限制官網很難下到,建議google後安裝,至此環境準備妥當。

二、建立一個自動化case

1.unittest原理和使用方法

unittest中最核心的四個概念是:test case, test suite, test runner, test fixture。下面這張圖是網上找的unittest類圖:

python selenium unittest_python+selenium+unittest——ui自動化的輕量級選擇

一個TestCase的執行個體就是一個測試用例。可以包括setUp,測試代碼主體testMethod,還有tearDown。 TestSuite相當于testcase的集合,而且TestSuite也可以嵌套TestSuite。-

testsuite中可以指定多個testcase的執行順序。

TestLoader用來加載TestCase到TestSuite中的,其中有幾個loadTestsFrom__()方法,就是從各個地方尋找TestCase,建立它們的執行個體,然後add到TestSuite中,再傳回一個TestSuite執行個體。

TextTestRunner是來執行測試用例的,其中的run(test)會執行TestSuite/TestCase中的run(result)方法。 測試的結果會儲存到TextTestResult執行個體中,包括運作了多少測試用例,成功了多少,失敗了多少等資訊。

對一個測試用例環境的搭建和銷毀,是一個fixture。

以下是我的工程目錄:

python selenium unittest_python+selenium+unittest——ui自動化的輕量級選擇

以下是一個簡單case:可以看到這個類繼承了TestCase 并且重寫了setUp,tearDown和主體run方法test_sms。

python selenium unittest_python+selenium+unittest——ui自動化的輕量級選擇

2.如何組織testcase

使用testsuit組織testcase非常友善,他可以組織同一檔案中的多個case,也可以組織多個不同檔案中的case。如果要滿足基本的使用,僅需要幾行代碼,如下:

suite = unittest.TestSuite()

suite.addTest(SmsTest("test_sms"))

suite.addTest(ClickTest("test_click"))

suite.addTest(DragTest("test_drag"))

這裡使用了testsuit的addTest方法添加了三個case,這三個case會順序執行。如果使用下面的TestLoader就無法順序執行case。

suite.addTests(unittest.TestLoader().loadTestsFromName(’sms.test_sms'))

suite.addTests(unittest.TestLoader().loadTestsFromName(’drag.test_drag'))

3.簡單易用的報告生成

測試報告是必須的,unittest除了提供文本報告形式,還可以生成html形式的直覺報告,可以一目了然的觀察testcase的執行情況,他會把console中打出的日志彙集起來,在需要排查問題的時候直接檢視。 使用以下代碼可以生成文本測試報告。

with open('UnittestTextReport.txt', 'a') as f:

runner= unittest.TextTestRunner(stream=f, verbosity=2)

runner.run(suite)

python selenium unittest_python+selenium+unittest——ui自動化的輕量級選擇

引入HTMLTestRunner,這是一個第三方的unittest HTML報告庫。需要下載下傳一個HTMLTestRunner.py,并放在python的lib庫下。

with open('HTMLReport.html', 'w') as f:

runner= HTMLTestRunner.HTMLTestRunner(stream=f,

title='CaptchaTest Report',

description='generated by HTMLTestRunner.',

verbosity=2

)

runner.run(suite)

生成的測試報告如下,可以看到有fail,pass和error三種類型。fail指的是case失敗,而error指的是諸如找不到元素等異常導緻的失敗。

python selenium unittest_python+selenium+unittest——ui自動化的輕量級選擇
python selenium unittest_python+selenium+unittest——ui自動化的輕量級選擇

三、有趣的點

事實上,本次實作的自動化難點在于業務,出于項目的保密性,這部分不能分享,倒是可以分享一個有趣的技術實作。目前selenium沒有api可以進行接口的互動,但是往往我們進行ui自動化,有時候是需要從接口中拿一些資料用于界面元素的填充等的。盡管有時候我們可以在代碼中調用一下某個接口也擷取需要的資料,但是,當ui和這個接口強相關的時候——調用了一下這個接口,當下的ui元素會重新整理失效——這種情況下我們就不能簡單的調用接口了。推薦一個好用的代理browsermobproxy。為了實作上述需求,可以在setUp方法中啟動這個代理,擷取頁面元素時代理正在監控并抓取響應的接口請求和傳回資訊。隻需設定一個target接口url, 當代理抓取到目标接口時分離并擷取傳回的目标資料,就可以供自動化輸入到頁面元素中填充了。源碼參看:

python selenium unittest_python+selenium+unittest——ui自動化的輕量級選擇

本文來自網易實踐者社群,經作者何美玲授權釋出。