python代码架构_Python架构
一、自動化測試框架
1.什么是自動化測試框架
簡單來說,自動化測試框架就是由一些標準,協(xié)議,規(guī)則組成,提供腳本運行的環(huán)境。自動化測試框架能夠提供很多便利給用戶高效完成一些事情,例如,結(jié)構(gòu)清晰開發(fā)腳本,多種方式、平臺執(zhí)行腳本,良好的報告去跟蹤腳本執(zhí)行結(jié)果。
框架具有以下一些優(yōu)點:
1)代碼復用
2)最大覆蓋率
3)很低成本維護
4)很少人工干預
5)簡單報告輸出
2.常見的測試框架分類
好多Selenium自動化測試開發(fā)人員是有QTP那邊轉(zhuǎn)過來的,所以,他們在早期設計的框架大致可分為以下幾類:
1)基于模塊的測試框架
2)基于庫(Library)結(jié)構(gòu)測試框架
3)數(shù)據(jù)驅(qū)動測試框架,和QTP很像
4)關鍵字驅(qū)動測試框架,也是QTP過來的
5)混合測試框,3 4和綜合
6)行為驅(qū)動開發(fā)測試框架
這里我們不一一介紹這些框架,字面意思可以想象一些這些框架的背景和組件,本文只是對框架有一個基本了解。
3.框架基本組件
我們來思考下框架組成部分:
1)需要配置文件管理
2)業(yè)務邏輯代碼和測試腳本分離
3)報告和日志文件輸出
4)自定義的庫的封裝
5)管理、執(zhí)行腳本方式
6)第三方插件引入
7)持續(xù)集成
解釋:
我們需要一個配置文件去控制一些,環(huán)境信息,開關,配置文件可以是txt/xml/yaml/properties/ini,一般.properties使用較多在JAVA里,本文是Python系列,我可能會選擇ini文件。
業(yè)務邏輯代碼和測試腳本分離,不像我們剛開始學習Selenium那樣,代碼和腳本在一個類文件里演示。我們根本沒有用到代碼重構(gòu),復用。代碼和用例文件分離后,更加清晰,去多人開發(fā)腳本,方便調(diào)試。
報告和日志文件輸出,你執(zhí)行了多少case,case結(jié)果如何,這都需要報告來展示,一般采用第三方插件來實現(xiàn)這個功能,好多報告格式是html,簡單,明了的風格。日志輸出也很重要,如果發(fā)生報錯,腳本執(zhí)行失敗,通過日志快速定位發(fā)生問題位置。
用戶自定義庫,這個很好理解,我們很多功能需要重復調(diào)用,這樣我們就寫成一個公用方法,放到工具包下,每次方便調(diào)用,例如瀏覽器引擎類和basepage.py的封裝。
管理和執(zhí)行腳本的方式,例如Python中單元測試框架unittest使用率非常高。
第三方插件,有時候,我們一些功能,需要借助第三方插件,能夠更好實現(xiàn),例如AutoIT,來實現(xiàn)文件上傳和下載。還有利用第三方報告插件生成基于html格式的測試報告。
持續(xù)集成,git,svn,ant,maven,jenkins,我們會把這整合到jenkins,達到持續(xù)集成,一鍵執(zhí)行測試腳本。
根據(jù)以上的特點介紹,我大致用以下圖來描述一下,一個簡單的自動化測試框架,可能包含哪些組成部分。
框架的簡單介紹就到這里,有些人把框架想得太復雜了,框架無非就是一些軟件的集合,達到特定的目的。這里我們上圖畫出來的框架,就是一個簡單的自動化測試框架,別笑,這確實是一個簡單但又包含必要的組件的自動化測試框架設計實例,如果你學會了這個設計思路和思想,那么,你已經(jīng)達到了自動化測試第二個階段的水平:能夠簡單設計自動化測試框架和維護框架的能力。
二、簡單介紹unittest單元測試框架
unittest是一個單元測試框架,是Python編程的單元測試框架。
unittest支持測試自動化,共享測試用例中的初始化和關閉退出代碼,在unittest中最小單元是test,也就是一個測試用例。要了解unittest單元測試框架,先來了解以下幾個重要的概念。
測試固件(test fixture)
一個測試固件包括兩部分,執(zhí)行測試代碼之前的準備部分和測試結(jié)束之后的清掃代碼。這兩部分一般用函數(shù)setUp()和tearDown()表示。這里舉例以下,例如要測試百度搜索selenium這個場景,我們的測試固件可以這樣寫,setUp()里寫打開瀏覽器,瀏覽器最大化,和打開百度首頁等腳本代碼;在tearDown()里寫結(jié)束搜索后,退出并關閉瀏覽器的代碼。
測試用例(test case)
unittest中管理的最小單元是測試用例,一個測試用例,包括測試固件,和具體測試業(yè)務的函數(shù)或者方法。一個測試用例中,測試固件可以不寫,但是至少有一個已test開頭的函數(shù)。unittest會自動化識別test開頭的函數(shù)是測試代碼,如果你寫的函數(shù)不是test開頭,unittest是不會執(zhí)行這個函數(shù)里面的腳本的,這個千萬要記住,所有的測試函數(shù)都要test開頭,記住是小寫的哦。
測試套件 (test suite)
很簡單,就是很多測試用例的集合,叫測試套件,一個測試套件可以隨意管理多個測試用例。如果測試用例比作單個學生,測試套件就是好像是班級的概念。
測試執(zhí)行器 (test runner)
test runner是一個用來執(zhí)行加載測試用例,并執(zhí)行用例,且提供測試輸出的一個組建。test runner可以加載test case或者test suite進行執(zhí)行測試任務。
我們舉例來,練習一下test fixture和test case的使用,學習unittest的簡單用法:
1. 新建一個testbaidu.py的文件
2. 導入unittest模塊
3. 當前測試類繼承unittest.TestCase,相當于當前利用unittest創(chuàng)建了一個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):
"""
測試結(jié)束后的操作,這里基本上都是關閉瀏覽器
: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()
復制代碼
解釋:
最后結(jié)尾處的unittest.main(),添加這個是支持在cmd,里面,cd到這個腳本文件所在的目錄,然后python 腳本名.py執(zhí)行,如果不添加這一段,是無法執(zhí)行cmd里面運行腳本的,在PyCharm中,不添加最后一段,也可以通過,右鍵 Run "unittest xxx",來達到執(zhí)行效果。
三、什么是POM
POM,中文字母意思是,頁面對象模型,POM是一種最近幾年非常流行的自動化測試模型,或者思想,POM不是一個框架,就是一個解決問題的思想。采用POM的目的,是為了解決前端中UI變化頻繁,從而造成測試自動化腳本維護的成本越來越大。下圖,形象描述了POM的好處。
從上圖看出,采取了POM設計思路和不采取的區(qū)別,左側(cè)把測試代碼和頁面元素都寫在一個類文件,如果需要更改頁面,那么就要修改頁面元素定位,從而要修改這個類中測試代碼,這個看起來和混亂。右側(cè),采取POM后,主要的區(qū)別就是,把頁面元素和業(yè)務邏輯和測試腳本分離出來到兩個不同類文件。ClassA只寫頁面元素定位,和業(yè)務邏輯代碼操作的封裝,ClassB只寫測試腳本,不關心如何元素定位,只寫調(diào)用ClassA的代碼去覆蓋不同的測試場景。如果前端頁面發(fā)生變化,只需要修改ClassA的元素定位,而不需要去修改ClassB中的測試腳本代碼。
POM主要有以下優(yōu)點:
1. 把web ui對象倉庫從測試腳本分離,業(yè)務代碼和測試腳本分離。
2. 每一個頁面對應一個頁面類,頁面的元素寫到這個頁面類中。
3. 頁面類主要包括該頁面的元素定位,和和這些元素相關的業(yè)務操作代碼封裝的方法。
4. 代碼復用,從而減少測試腳本代碼量。
5. 層次清晰,同時支持多個編寫自動化腳本開發(fā),例如每個人寫哪幾個頁面,不影響他人。
6. 建議頁面類和業(yè)務邏輯方法都給一個有意義的名稱,方便他人快速編寫腳本和維護腳本。
總結(jié)
以上是生活随笔為你收集整理的python代码架构_Python架构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上坟元宝最简单的折叠方法
- 下一篇: java 假设当前时间_java——推断