1. 程式人生 > >python+selenium之框架設計

python+selenium之框架設計

get 生成 size ava earch 良好的 形象 aid set

一、自動化測試框架

1.什麽是自動化測試框架

簡單來說,自動化測試框架就是由一些標準,協議,規則組成,提供腳本運行的環境。自動化測試框架能夠提供很多便利給用戶高效完成一些事情,例如,結構清晰開發腳本,多種方式、平臺執行腳本,良好的報告去跟蹤腳本執行結果。

框架具有以下一些優點:

1)代碼復用

2)最大覆蓋率

3)很低成本維護

4)很少人工幹預

5)簡單報告輸出

2.常見的測試框架分類

好多Selenium自動化測試開發人員是有QTP那邊轉過來的,所以,他們在早期設計的框架大致可分為以下幾類:

1)基於模塊的測試框架

2)基於庫(Library)結構測試框架

3)數據驅動測試框架,和QTP很像

4)關鍵字驅動測試框架,也是QTP過來的

5)混合測試框,3 4和綜合

6)行為驅動開發測試框架

這裏我們不一一介紹這些框架,字面意思可以想象一些這些框架的背景和組件,本文只是對框架有一個基本了解。

3.框架基本組件

我們來思考下框架組成部分:

1)需要配置文件管理

2)業務邏輯代碼和測試腳本分離

3)報告和日誌文件輸出

4)自定義的庫的封裝

5)管理、執行腳本方式

6)第三方插件引入

7)持續集成

解釋:

我們需要一個配置文件去控制一些,環境信息,開關,配置文件可以是txt/xml/yaml/properties/ini,一般.properties使用較多在JAVA裏,本文是Python系列,我可能會選擇ini文件。

業務邏輯代碼和測試腳本分離,不像我們剛開始學習Selenium那樣,代碼和腳本在一個類文件裏演示。我們根本沒有用到代碼重構,復用。代碼和用例文件分離後,更加清晰,去多人開發腳本,方便調試。

報告和日誌文件輸出,你執行了多少case,case結果如何,這都需要報告來展示,一般采用第三方插件來實現這個功能,好多報告格式是html,簡單,明了的風格。日誌輸出也很重要,如果發生報錯,腳本執行失敗,通過日誌快速定位發生問題位置。

用戶自定義庫,這個很好理解,我們很多功能需要重復調用,這樣我們就寫成一個公用方法,放到工具包下,每次方便調用,例如瀏覽器引擎類和basepage.py的封裝。

管理和執行腳本的方式,例如Python中單元測試框架unittest使用率非常高。

第三方插件,有時候,我們一些功能,需要借助第三方插件,能夠更好實現,例如AutoIT,來實現文件上傳和下載。還有利用第三方報告插件生成基於html格式的測試報告。

持續集成,git,svn,ant,maven,jenkins,我們會把這整合到jenkins,達到持續集成,一鍵執行測試腳本。

根據以上的特點介紹,我大致用以下圖來描述一下,一個簡單的自動化測試框架,可能包含哪些組成部分。

技術分享圖片

框架的簡單介紹就到這裏,有些人把框架想得太復雜了,框架無非就是一些軟件的集合,達到特定的目的。這裏我們上圖畫出來的框架,就是一個簡單的自動化測試框架,別笑,這確實是一個簡單但又包含必要的組件的自動化測試框架設計實例,如果你學會了這個設計思路和思想,那麽,你已經達到了自動化測試第二個階段的水平:能夠簡單設計自動化測試框架和維護框架的能力。

二、簡單介紹unittest單元測試框架

unittest是一個單元測試框架,是Python編程的單元測試框架。

unittest支持測試自動化,共享測試用例中的初始化和關閉退出代碼,在unittest中最小單元是test,也就是一個測試用例。要了解unittest單元測試框架,先來了解以下幾個重要的概念。
測試固件(test fixture)
一個測試固件包括兩部分,執行測試代碼之前的準備部分和測試結束之後的清掃代碼。這兩部分一般用函數setUp()和tearDown()表示。這裏舉例以下,例如要測試百度搜索selenium這個場景,我們的測試固件可以這樣寫,setUp()裏寫打開瀏覽器,瀏覽器最大化,和打開百度首頁等腳本代碼;在tearDown()裏寫結束搜索後,退出並關閉瀏覽器的代碼。
測試用例(test case)
unittest中管理的最小單元是測試用例,一個測試用例,包括測試固件,和具體測試業務的函數或者方法。一個測試用例中,測試固件可以不寫,但是至少有一個已test開頭的函數。unittest會自動化識別test開頭的函數是測試代碼,如果你寫的函數不是test開頭,unittest是不會執行這個函數裏面的腳本的,這個千萬要記住,所有的測試函數都要test開頭,記住是小寫的哦。
測試套件 (test suite)
很簡單,就是很多測試用例的集合,叫測試套件,一個測試套件可以隨意管理多個測試用例。如果測試用例比作單個學生,測試套件就是好像是班級的概念。
測試執行器 (test runner)
test runner是一個用來執行加載測試用例,並執行用例,且提供測試輸出的一個組建。test runner可以加載test case或者test suite進行執行測試任務。

我們舉例來,練習一下test fixture和test case的使用,學習unittest的簡單用法:
1. 新建一個testbaidu.py的文件
2. 導入unittest模塊
3. 當前測試類繼承unittest.TestCase,相當於當前利用unittest創建了一個test case,這個test case是能夠被unittest直接識別。
4. 寫setUP(),主要是打開瀏覽器和打開站點
5. 寫一個test_search()用例寫搜索的代碼
6. 寫tearDown(),主要是瀏覽器退出操作

相關腳本代碼如下:

# coding=utf-8  
import time  
import unittest  
from selenium import webdriver  
  
  
class BaiduSearch(unittest.TestCase):  
  
    def setUp(self):  
        """ 
        測試固件的setUp()的代碼,主要是測試的前提準備工作 
        :return: 
        """  
        self.driver = webdriver.Chrome()  
        self.driver.maximize_window()  
        self.driver.implicitly_wait(8)  
        self.driver.get("https://www.baidu.com")  
  
    def tearDown(self):  
        """ 
        測試結束後的操作,這裏基本上都是關閉瀏覽器 
        :return: 
        """  
        self.driver.quit()  
  
    def test_baidu_search(self):  
        """ 
        這裏一定要test開頭,把測試邏輯代碼封裝到一個test開頭的方法裏。 
        :return: 
        """  
        self.driver.find_element_by_id(kw).send_keys(selenium)  
        time.sleep(1)  
        try:  
            assert selenium in self.driver.title  
            print (Test Pass.)  
        except Exception as e:  
            print (Test Fail., format(e))  
  
if __name__ == __main__:  
    unittest.main()  

解釋:

最後結尾處的unittest.main(),添加這個是支持在cmd,裏面,cd到這個腳本文件所在的目錄,然後python 腳本名.py執行,如果不添加這一段,是無法執行cmd裏面運行腳本的,在PyCharm中,不添加最後一段,也可以通過,右鍵 Run "unittest xxx",來達到執行效果。

三、什麽是POM

POM,中文字母意思是,頁面對象模型,POM是一種最近幾年非常流行的自動化測試模型,或者思想,POM不是一個框架,就是一個解決問題的思想。采用POM的目的,是為了解決前端中UI變化頻繁,從而造成測試自動化腳本維護的成本越來越大。下圖,形象描述了POM的好處。

技術分享圖片

從上圖看出,采取了POM設計思路和不采取的區別,左側把測試代碼和頁面元素都寫在一個類文件,如果需要更改頁面,那麽就要修改頁面元素定位,從而要修改這個類中測試代碼,這個看起來和混亂。右側,采取POM後,主要的區別就是,把頁面元素和業務邏輯和測試腳本分離出來到兩個不同類文件。ClassA只寫頁面元素定位,和業務邏輯代碼操作的封裝,ClassB只寫測試腳本,不關心如何元素定位,只寫調用ClassA的代碼去覆蓋不同的測試場景。如果前端頁面發生變化,只需要修改ClassA的元素定位,而不需要去修改ClassB中的測試腳本代碼。

POM主要有以下優點:

1. 把web ui對象倉庫從測試腳本分離,業務代碼和測試腳本分離。

2. 每一個頁面對應一個頁面類,頁面的元素寫到這個頁面類中。

3. 頁面類主要包括該頁面的元素定位,和和這些元素相關的業務操作代碼封裝的方法。

4. 代碼復用,從而減少測試腳本代碼量。

5. 層次清晰,同時支持多個編寫自動化腳本開發,例如每個人寫哪幾個頁面,不影響他人。

6. 建議頁面類和業務邏輯方法都給一個有意義的名稱,方便他人快速編寫腳本和維護腳本。

四、框架內封裝日誌類和瀏覽器引擎類

python+selenium之框架設計