目錄:導(dǎo)讀
引言
po模式
優(yōu)勢(shì):
?目錄解釋:
頁面對(duì)象設(shè)計(jì)模式:
base基礎(chǔ)層:
page對(duì)象層:
?test:測(cè)試層
data數(shù)據(jù)層:
?common層:
?untils:
?config層:
run層:
report:
結(jié)語
引言
你是否曾經(jīng)因?yàn)槊看胃鹿δ芏家匦聦懸欢炎詣?dòng)化測(cè)試代碼而感到疲憊不堪?
或者因?yàn)轫撁嬖氐念l繁變動(dòng)而不得不持續(xù)地修復(fù)測(cè)試腳本?
如果你也有這些苦惱,那么PO模式設(shè)計(jì)框架可能是解決之道。它可以讓你以更簡(jiǎn)單、更高效的方式編寫自動(dòng)化測(cè)試代碼,減少反復(fù)勞動(dòng)和錯(cuò)誤率。
在本文中,我們將介紹如何采用PO模式設(shè)計(jì)框架來秒殺繁瑣的自動(dòng)化測(cè)試操作,讓你輕松應(yīng)對(duì)變化萬千的測(cè)試環(huán)境。
po模式
在UI級(jí)的自動(dòng)化測(cè)試中,對(duì)象設(shè)計(jì)模式表示測(cè)試正在交互的web應(yīng)用,程序用戶界面中的一個(gè)區(qū)域,這個(gè)是減少了代碼的重復(fù),也就是說,如果用戶界面發(fā)生了改變,只需要在一個(gè)地方修改程序就可以了。
優(yōu)勢(shì):
1、創(chuàng)建可以跨越多個(gè)測(cè)試用例共享的代碼
2、減少重復(fù)代碼的數(shù)量
3、如果用戶界面發(fā)生變更后,只需要在一個(gè)地方維護(hù)就可以了。
創(chuàng)建ui,在ui的工程中創(chuàng)建對(duì)應(yīng)的包和目錄。utils? ?最后一個(gè)包的名稱
?目錄解釋:
各個(gè)目錄詳解:
(1)base:基礎(chǔ)層,主要編寫底層定位元素的類,它是一個(gè)包。
(2)common:公共類,里面編寫公共使用到的方法。
(3)config:配置文件存儲(chǔ)目錄。
(4)data:存儲(chǔ)測(cè)試使用到測(cè)試數(shù)據(jù)。
(5)page:對(duì)象層,編寫具體的業(yè)務(wù)邏輯,把頁面每一個(gè)操作行為單獨(dú)的寫一個(gè)方法或者是函數(shù)。
(6)report:測(cè)試報(bào)告目錄,主要用來存放測(cè)試報(bào)告。
(7)test:測(cè)試層,里面主要是測(cè)試模塊,也可以說是每個(gè)測(cè)試的場(chǎng)景的代碼。
(8)utils:工具類,存放工具,如文件處理、說明文檔等。
(9)run:運(yùn)行層:整個(gè)自動(dòng)化測(cè)試的運(yùn)行目錄。
頁面對(duì)象設(shè)計(jì)模式:
base基礎(chǔ)層:
在該層中主要編寫了基礎(chǔ)代碼。在該層主要定義了類WebUI,在這個(gè)類中編寫了單個(gè)元素和多個(gè)元素定位的方法。
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:張紅
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import NoSuchElementException
import time as t
class WebUI(object):
def __init__(self,driver):
#webdriver實(shí)例化后的對(duì)象
self.driver=driver
def findElement(self,*args):
'''
單個(gè)元素定位的方式
:param args:
:return: 它是一個(gè)元組,需要帶上具體什么方式定位元素屬性以及元素屬性的值
'''
try:
return self.driver.find_element(*args)
except NoSuchElementException as e:
return e.args[0]
def findsElement(self,*args,index):
'''
多個(gè)元素定位的方式
:param args:
:param index: 被定位的目標(biāo)索引值
:return: 它是一個(gè)元組,需要帶上具體什么方式定位元素屬性以及元素屬性的值
'''
try:
return self.driver.find_elements(*args)[index]
except NoSuchElementException as e:
return e.args[0]
page對(duì)象層:
在這一層的類直接繼承了基礎(chǔ)層的類,以類屬性的方法指明每個(gè)操作元素屬性的值,然后依據(jù)操作步驟編寫對(duì)應(yīng)的方法,(比如關(guān)于登錄的操作:輸入用戶名、輸入密碼,點(diǎn)擊登錄,獲取文本的信息操作會(huì)在實(shí)例中實(shí)現(xiàn)的登錄操作,然后把每個(gè)登錄操作封裝成一個(gè)方法,這樣實(shí)現(xiàn)登錄測(cè)試用例直接調(diào)用,返回失敗信息---其中形式參數(shù)會(huì)在測(cè)試層賦值)
注意:獲取文件信息的方法,要有return返回值否則在測(cè)試層斷言時(shí)獲取不到文本信息,數(shù)據(jù)屬性和方法名字不要一樣
?test:測(cè)試層
在這里首先需要導(dǎo)入對(duì)象層中的類和unittest單元測(cè)試框架,在測(cè)試類中,繼承了unittest.TestCase和對(duì)象層中的類,TestCase是由于在編寫自動(dòng)化測(cè)試的用例中,用到的測(cè)試固件、測(cè)試斷言和測(cè)試執(zhí)行都是需要它中的方法,而對(duì)象層中的類包含對(duì)象層中的測(cè)試操作步驟的方法,繼承后可以直接進(jìn)行調(diào)用。
注意事項(xiàng):
1、在編寫用例的時(shí)候需要添加備注信息,明確表示該用例是測(cè)試的哪個(gè)點(diǎn),驗(yàn)證的哪個(gè)場(chǎng)景.
2、測(cè)試模塊都是以test_開頭,測(cè)試方法也是以test_開頭的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
|
data數(shù)據(jù)層:
春初測(cè)試使用到的測(cè)試數(shù)據(jù)(主要是把數(shù)據(jù)寫入json文件,yaml文件)
在data下創(chuàng)建json文件
?common層:
common:公共層,里面編寫公共使用到的文件(處理路徑---重點(diǎn)處理的是json文件或者yaml文件)一般時(shí)定義基礎(chǔ)路徑的
1、在這個(gè)層創(chuàng)建public.py? 文件
導(dǎo)入os庫,定義基礎(chǔ)路徑(也就是把基礎(chǔ)路徑處理為將要讀取文件所在文件夾的路徑,這樣方便使用的時(shí)候做路徑拼接)
?untils:
工具層:基本上是對(duì)data里面的(json yaml文件的讀?。?/p>
在untils下創(chuàng)建模塊:operationJson.py,設(shè)置方法readJson()來讀取數(shù)據(jù)
在這個(gè)模塊我們需要導(dǎo)入os來進(jìn)行路徑拼接,Json反序列化用來讀取文件,還有就是導(dǎo)入公共層下的基礎(chǔ)路徑
?config層:
配置文件存儲(chǔ)目錄
run層:
運(yùn)行層,主要是運(yùn)行測(cè)試用例的目錄,我們可以根據(jù)測(cè)試模塊來運(yùn)行,也可以運(yùn)行所有的模塊,該層的內(nèi)容也適用于所有場(chǎng)景(適用的前提是po設(shè)計(jì)模式的目錄結(jié)構(gòu)如上所示)
測(cè)試報(bào)告:
1 import time
2 # 時(shí)間
3 import unittest
4 # 加載測(cè)試模塊
5 import os
6 # 處理路徑
7 import HTMLTestRunner
8 # 生成測(cè)試報(bào)告必須要用的庫
9 def getSuite():
10 # start_dir=加載所有的測(cè)試模塊來執(zhí)行,pattern=通過正則的模式加載所有的模塊
11 '''獲取所有執(zhí)行的測(cè)試模塊'''
12 suite = unittest.TestLoader().discover(
13 start_dir=os.path.dirname(__file__),
14 pattern='test_*.py'
15 )
16 return suite
17
18 # 獲取當(dāng)前時(shí)間
19 def getNowtime():
20 return time.strftime("%y-%m-%d %H_%M_%S",time.localtime(time.time()))
21
22 # 執(zhí)行獲取的測(cè)試模塊,并獲取測(cè)試報(bào)告
23 def main():
24 filename=os.path.join(os.path.dirname(__file__),'report',getNowtime()+"report.html")
25 # 把測(cè)試報(bào)告寫入文件中,b是以二進(jìn)制的方式寫入
26 fp=open(filename,"wb")
27 # HTMLTestRunner實(shí)例化的過程,stream是流式寫入,title是測(cè)試報(bào)告的標(biāo)題,description是對(duì)測(cè)試報(bào)告的描述
28 runner=HTMLTestRunner.HTMLTestRunner(
29 stream=fp,
30 title="UI自動(dòng)化測(cè)試報(bào)告",
31 description="UI自動(dòng)化測(cè)試報(bào)告"
32 )
33 runner.run(getSuite())
34 if __name__=="__main__":
35 main()
report:
主要用于存放測(cè)試報(bào)告
結(jié)語
這篇貼子到這里就結(jié)束了,最后,希望看這篇帖子的朋友能夠有所收獲。
?PO模式教程獲取方式:留言【po模式學(xué)習(xí)】即可文章來源:http://www.zghlxwxcb.cn/news/detail-433402.html
如果你覺得文章還不錯(cuò),請(qǐng)大家 點(diǎn)贊、分享、留言 下,因?yàn)檫@將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!文章來源地址http://www.zghlxwxcb.cn/news/detail-433402.html
到了這里,關(guān)于讓自動(dòng)化測(cè)試秒殺繁瑣操作?試試PO模式設(shè)計(jì)框架的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!