自動(dòng)化框架設(shè)計(jì)及落地的那些事

前言

近期做了一個(gè)web UI 自動(dòng)化的項(xiàng)目,框架用的是Python+PyTest+Selenium+BDD。以這個(gè)框架為學(xué)習(xí)的入口,整理出這份文檔,想給大家詮釋出項(xiàng)目在做UI自動(dòng)化時(shí)的一些實(shí)操流程,目的是想給那些想學(xué)習(xí)自動(dòng)化框架搭建的同學(xué)一些思考方向,當(dāng)然在實(shí)際項(xiàng)目中我們或許會(huì)面對(duì)更為復(fù)雜的場(chǎng)景,并不止我所講到的這些,歡迎大家一起交流。

如果你也不曾接觸這個(gè)框架,想要練練手,建議可以先:

了解一下Python 基礎(chǔ),明白類與對(duì)象,封裝與繼承

了解 PyTest 以及 PyTest-BDD框架的運(yùn)行機(jī)制

了解Selenium基礎(chǔ)知識(shí),比如元素定位,元素等待,基本操作方法等


1 測(cè)試框架選型

1.1 對(duì)框架的需求分析

在項(xiàng)目中當(dāng)我們的產(chǎn)品趨于穩(wěn)定進(jìn)入迭代優(yōu)化的時(shí)候,每次發(fā)版前可能會(huì)伴隨著越來(lái)越多的不會(huì)頻繁變動(dòng)的需求需要做回歸測(cè)試,這個(gè)時(shí)候我們會(huì)考慮引入自動(dòng)化。通常項(xiàng)目對(duì)UI自動(dòng)化框架的需求分析是基于非常了解當(dāng)前項(xiàng)目的情況下進(jìn)行的,包括了解項(xiàng)目里自動(dòng)化的人員能力情況,投入的資源情況,項(xiàng)目本身的需求,被測(cè)系統(tǒng)的實(shí)現(xiàn)等等。對(duì)框架的需求分析可能包含但也不限于以下幾種,因項(xiàng)目而異:

能支持項(xiàng)目所需的瀏覽器、系統(tǒng)

代碼復(fù)用率高

測(cè)試業(yè)務(wù)與數(shù)據(jù)配置等解藕,降低維護(hù)成本。比如元素發(fā)生變化時(shí),只需要更新一下yml配置文件即可

有日志追蹤,可快速的定位問(wèn)題

運(yùn)行時(shí)的穩(wěn)定性

測(cè)試用例集能靈活的選取,如冒煙測(cè)試用例集,回歸測(cè)試用例集等

支持?jǐn)U展,如發(fā)郵件等

有的項(xiàng)目可能還需支持瀏覽器多tab頁(yè)簽

支持切換環(huán)境

可以批量運(yùn)行用例并生成測(cè)試報(bào)告

CI/CD

項(xiàng)目測(cè)試人員能力層次不同,對(duì)框架的上手難易程度有要求

1.2 測(cè)試方案確定

結(jié)合自身項(xiàng)目對(duì)UI自動(dòng)化測(cè)試框架的需求的分析,自動(dòng)化測(cè)試方案的確定我們可以從三個(gè)方面入手:控制方案、執(zhí)行方案、結(jié)果上報(bào)方案,同時(shí)還應(yīng)該考慮這三部分所普適的編程語(yǔ)言,從這些方面入手去找到適合自己項(xiàng)目需求的框架或工具,想要了解更多可以參看另一篇文章:自動(dòng)化框架和工具有哪些?開(kāi)篇已經(jīng)提到本項(xiàng)目的框架客戶結(jié)合自身項(xiàng)目情況已經(jīng)確定,編程語(yǔ)言是Python,下面簡(jiǎn)單描述下著手確定UI自動(dòng)化測(cè)試方案的三個(gè)方面:

控制方案

控制方案即是采用一種工具來(lái)實(shí)現(xiàn)控制客戶端進(jìn)行模擬人工操作,大致的操作流程就是打開(kāi)被測(cè)項(xiàng)目的網(wǎng)頁(yè),定位到目標(biāo)位置,進(jìn)行點(diǎn)擊,輸入等操作。目前相關(guān)的工具有:Selenium、Cypress、Playwright、Puppeteer等,詳細(xì)了解這些框架之間的差異,再結(jié)合項(xiàng)目自身對(duì)于UI自動(dòng)化的需求進(jìn)行選取。我們項(xiàng)目選用的是Selenium,很“古早”,項(xiàng)目選中它有一些自身考慮的因素,這里不做好壞的討論。

執(zhí)行方案

自動(dòng)化測(cè)試的執(zhí)行方案的核心在于選取一套最優(yōu)的自動(dòng)化測(cè)試框架,測(cè)試框架我理解主要用于實(shí)現(xiàn)測(cè)試用例的組織和執(zhí)行,以及測(cè)試結(jié)果的生成等,目前基于python的測(cè)試框架主要有Unittest、Pytest、Pytest-BDD、Nose、Robot Framework等,我們項(xiàng)目選用的是PyTest 測(cè)試框架并結(jié)合了PyTest-BDD。BDD(行為驅(qū)動(dòng)開(kāi)發(fā))是一種軟件開(kāi)發(fā)方法論,使用Gherkin語(yǔ)言編寫(xiě)測(cè)試場(chǎng)景,例如”Given-When-Then”的語(yǔ)法結(jié)構(gòu),它將需求和測(cè)試用例結(jié)合起來(lái),以更加清晰地表達(dá)需求和期望行為。

結(jié)果上報(bào)方案

我們項(xiàng)目選用的是Allure,其生成的報(bào)告樣式簡(jiǎn)潔美觀,同時(shí)也支持中文。


2 測(cè)試框架設(shè)計(jì)

2.1 指導(dǎo)思想

測(cè)試框架選型確定之后,我們接下來(lái)考慮的是如何在框架里編排我們的自動(dòng)化代碼、測(cè)試數(shù)據(jù)及配置等。為什么要做編排?這里有什么難點(diǎn)?又有什么辦法可以指導(dǎo)解決的呢?帶著這些疑問(wèn),我們繼續(xù)。

舉個(gè)例子,如果我們想自動(dòng)化實(shí)現(xiàn)一個(gè)簡(jiǎn)單的業(yè)務(wù)測(cè)試流:打開(kāi)百度網(wǎng)站 -> 輸入關(guān)鍵 ->點(diǎn)擊 搜索 ->查看驗(yàn)證結(jié)果。我們把這個(gè)業(yè)務(wù)流涉及到的內(nèi)容全部寫(xiě)進(jìn)一個(gè)Python文件里,包含了打開(kāi)網(wǎng)頁(yè),定位元素,操作,斷言等,看起來(lái)其實(shí)也比較清晰,但是如果以這樣寫(xiě)代碼的方式運(yùn)用到一個(gè)項(xiàng)目里,可能會(huì)有幾十幾百個(gè)頁(yè)面需要測(cè)試,隨著時(shí)間的遷移,測(cè)試套件將持續(xù)的增長(zhǎng),我們的測(cè)試腳本變得越來(lái)越臃腫龐大。那頁(yè)面元素的任何改變都會(huì)讓我們的腳本維護(hù)變得繁瑣復(fù)雜,而且變得耗時(shí)易出錯(cuò)。那怎么解決呢? 在UI自動(dòng)化測(cè)試中,引入了Page Object Model(POM):頁(yè)面對(duì)象模式,POM能讓我們的測(cè)試代碼變得可讀性更好,高可維護(hù)性,高復(fù)用性。為了進(jìn)一步理解POM模式,我們先來(lái)看看非POM和POM結(jié)構(gòu)對(duì)比圖:

可以看到非POM結(jié)構(gòu)將所有代碼都寫(xiě)在一個(gè)類中,包括元素,操作方法,業(yè)務(wù)測(cè)試代碼等,這樣很不利于代碼維護(hù),代碼存在冗余,UI頁(yè)面元素發(fā)生變化需要修改很多地方。POM結(jié)構(gòu)則是將測(cè)試業(yè)務(wù)與具體的元素和操作方法等解藕,這樣即便UI頁(yè)面元素變化,我們只需要維護(hù)修改元素即可,調(diào)用的測(cè)試方法可以不用修改。

以這種模式來(lái)思考,我們也還可以分得更細(xì),比如將Selenium的基礎(chǔ)API進(jìn)行封裝為基類,每一個(gè)頁(yè)面的元素和操作方法可以封裝為一個(gè)page類(可以繼承基類),并且元素可以放到另外一個(gè)配置文件來(lái)管理,再通過(guò)業(yè)務(wù)流組織成用例。如果有某個(gè)頁(yè)面的元素需要變更,那么就可以直接更改頁(yè)面元素的配置文件即可,這樣整個(gè)的代碼維護(hù)成本也會(huì)縮減,總的來(lái)說(shuō)POM的核心就是分層思想,主要的分層:

對(duì)象庫(kù)層:Base(基類),封裝page 頁(yè)面一些公共的方法,如查打開(kāi)網(wǎng)頁(yè),找元素方法、點(diǎn)擊元素方法、輸入方法、獲取文本方法、截圖方法等

操作層:page(頁(yè)面對(duì)象),封裝頁(yè)面對(duì)元素的操作,一個(gè)頁(yè)面封裝成一個(gè)對(duì)象,將對(duì)象庫(kù)層封裝的基礎(chǔ)方法和頁(yè)面元素進(jìn)行整合

業(yè)務(wù)層:business(業(yè)務(wù)層),將一個(gè)或多個(gè)操作組合起來(lái)完成一個(gè)業(yè)務(wù)功能。比如百度搜索:需要打開(kāi)百度網(wǎng)頁(yè)、輸入關(guān)鍵字、點(diǎn)擊百度搜索三個(gè)操作

2.2 測(cè)試框架結(jié)構(gòu)

基于上述指導(dǎo)思想,可能大家還處于理論理解階段,到具體項(xiàng)目里如何下手?

以我們項(xiàng)目為例,以POM模型為指導(dǎo)思想,我們將:

Selenium方法(Selenium的基類,對(duì)Selenium的基礎(chǔ)方法進(jìn)行封裝)

頁(yè)面元素 (把頁(yè)面元素單獨(dú)提取出來(lái),放入一個(gè)yml文件中)

頁(yè)面對(duì)象(整合Selenium方法和頁(yè)面元素)

測(cè)試用例 (基于PyTest及PyTest-BDD對(duì)整合的頁(yè)面對(duì)象進(jìn)行測(cè)試用例編寫(xiě))

以上四種維度對(duì)代碼主體進(jìn)行了拆分,加上pytest框架自身的配置文件以及一些測(cè)試數(shù)據(jù)等,我們測(cè)試框架的整體結(jié)構(gòu)就大致出來(lái)了。

主要目錄及文件說(shuō)明:(如果想要練練手,需手動(dòng)按照這個(gè)結(jié)構(gòu),建相關(guān)的文件及目錄)


3 測(cè)試依賴安裝

確定好框架和項(xiàng)目目錄結(jié)構(gòu)之后,我們可以開(kāi)始著手安裝了。項(xiàng)目使用的是Pipenv來(lái)安裝和管理的,Pipenv是python官方推薦的虛擬環(huán)境管理工具,可以把它當(dāng)作是virtualenv,pip,pyenv三者的集合工具。 它能夠自動(dòng)為項(xiàng)目創(chuàng)建和管理虛擬環(huán)境,不用再維護(hù) requirement.txt 了,使用 Pipfile 和 Pipfile.lock 來(lái)代替:從 Pipfile 文件中添加或者刪除包,同時(shí)生成 Pipfile.lock 文件來(lái)鎖定安裝包的版本和依賴信息,避免構(gòu)建錯(cuò)誤。具體安裝方法可以參考:Pipenv: 新一代Python項(xiàng)目環(huán)境與依賴管理工具


4 詳細(xì)設(shè)計(jì)

這一章節(jié)會(huì)先詳細(xì)介紹主要用到的pytest框架的一些特性,配置文件,頁(yè)面元素,頁(yè)面對(duì)象,Selenium基類封裝等,讓大家能了解到整體框架各個(gè)模塊之間的關(guān)聯(lián)除了開(kāi)發(fā)一些工具外,還離不開(kāi)框架本身的一些特性支撐。

4.1 pytest框架特性

本小節(jié)簡(jiǎn)單介紹我們項(xiàng)目用到的部分pytest特性,想要了解得更深入或更多大家可以到官網(wǎng)看看。

能自動(dòng)收集測(cè)試用例

pytest命令運(yùn)行測(cè)試用例時(shí),框架就會(huì)自動(dòng)發(fā)現(xiàn)當(dāng)前目錄下所有符合規(guī)則的py文件,我們也可以在項(xiàng)目根目錄下的pytest.ini文件中自定義用例收集規(guī)則。因此在編寫(xiě)測(cè)試用例的過(guò)程中需要大家遵守這些規(guī)則,這樣程序才能如期運(yùn)轉(zhuǎn)。

靈活運(yùn)行指定的測(cè)試用例,可以給用例打上各種各樣的標(biāo)簽,如:冒煙測(cè)試,集成測(cè)試,回歸測(cè)試等

pytest.ini文件中自定義一些標(biāo)簽,pytest框架也有自帶的一些標(biāo)簽??梢栽跍y(cè)試用例上方進(jìn)行標(biāo)記使用。

fixture夾具靈活管理環(huán)境,很輕松的就可以進(jìn)行測(cè)試環(huán)境的初始化和清理

下面舉兩個(gè)例子來(lái)簡(jiǎn)明描述fixture在我們項(xiàng)目中使用到的部分方式。

例1:比如用例運(yùn)行之前自動(dòng)進(jìn)行環(huán)境數(shù)據(jù)清理,清除日志文件、下載文件、截圖目錄等,可以在conftest.py文件中定義一個(gè)函數(shù)并標(biāo)記為fixture且autouse為T(mén)rue,這樣的話在每次運(yùn)行之前會(huì)自動(dòng)執(zhí)行該函數(shù)內(nèi)的動(dòng)作。這里scope的值是作用域,可選選項(xiàng)有function,class,module,session。

例2:?比如用例運(yùn)行之前需要獲取瀏覽器driver,運(yùn)行之后需要關(guān)閉瀏覽器driver。可以在conftest.py文件中定義一個(gè)函數(shù)用來(lái)setup獲取driver,并用yield關(guān)鍵字呼喚teardown操作。當(dāng)driver用完也就是整個(gè)會(huì)話結(jié)束前會(huì)執(zhí)行yield語(yǔ)句后面的動(dòng)作driver.quit()。

大家可能好奇,這里沒(méi)有autouse參數(shù),那什么時(shí)候或者怎么調(diào)用這個(gè)定義為fixture的driver函數(shù)呢?很簡(jiǎn)單,直接將fixture名字driver像參數(shù)一樣傳遞給調(diào)用的函數(shù)就可以啦。這里還需說(shuō)明的一點(diǎn)是用例腳本需要使用fixture函數(shù)時(shí),無(wú)需導(dǎo)入conftest.py這個(gè)文件,框架會(huì)自動(dòng)去查找的。

pytest自帶的鉤子函數(shù)

鉤子函數(shù)在pytest稱之為Hook函數(shù),是為了讓用戶更好的去擴(kuò)展開(kāi)發(fā)而預(yù)留的一些函數(shù)。而預(yù)留的這些函數(shù),在整個(gè)測(cè)試執(zhí)行的生命周期中特定的階段會(huì)自動(dòng)去調(diào)用執(zhí)行。如下圖:


我們可以在conftest.py中去引用和擴(kuò)展這些鉤子,比如我們用到部分鉤子函數(shù):pytest_addoption,用來(lái)添加運(yùn)行時(shí)命令參數(shù);pytest_runtest_makereport,用來(lái)獲取運(yùn)行的測(cè)試結(jié)果。

4.2 配置文件及讀取方法

第二章節(jié)提到配置文件都存放在config目錄下,根據(jù)內(nèi)容的不同,分為多個(gè)配置文件來(lái)進(jìn)行管理的,對(duì)于配置文件這塊我們需要做的是如何實(shí)現(xiàn)調(diào)用或讀取這些文件內(nèi)容:

conf.py文件

控制項(xiàng)目所有目錄配置信息都寫(xiě)在這個(gè)文件里,以下例舉部分:

外部模塊若想要獲取某個(gè)路徑,調(diào)用方式比較簡(jiǎn)單:

conf.ini文件

被測(cè)系統(tǒng)的URL,賬號(hào),密碼以及測(cè)試過(guò)程中用到的需要支持的一些可配置參數(shù),比如收件箱,郵件開(kāi)關(guān)等信息都可以放在這個(gè)文件里。

外部模塊若想要讀取該配置文件的內(nèi)容,我們?cè)趗tils目錄下封裝一個(gè)readconfig的方法,提供讀取conf.ini文件的能力,這樣調(diào)用就比較方便了:

temp_config.yml 文件

存放運(yùn)行結(jié)果的信息,用于運(yùn)行完成后發(fā)送測(cè)試結(jié)果郵件。獲取運(yùn)行的測(cè)試結(jié)果是用到的是上述提到的鉤子(Hooks)方法pytest_runtest_makereport,獲取到結(jié)果后寫(xiě)入到這個(gè)文件中保存。

4.3? 日志管理

可以寫(xiě)一個(gè)logger方法實(shí)現(xiàn)對(duì)日志進(jìn)行處理,可以將運(yùn)行過(guò)程中的日志打印到控制臺(tái)也會(huì)生成日志文件存放到logs目錄下,便于問(wèn)題跟蹤。(網(wǎng)絡(luò)上有很多方法,大家可以找一個(gè)合適的)

4.4 頁(yè)面元素的管理和讀取

頁(yè)面元素的管理

頁(yè)面元素我們是放在page_element目錄下來(lái)管理的,每個(gè)頁(yè)面建一個(gè)對(duì)應(yīng)的yml文件。之所以帶上了元素定位的類型比如id,xpath 等,是因?yàn)槲覀円呀?jīng)將find_element_by_id,find_element_by_xpath等獲取元素的方法在章節(jié)二中提到的lib-pyse.py中進(jìn)行統(tǒng)一封裝了。

頁(yè)面元素讀取

在utils目錄下寫(xiě)了個(gè)readelement.py,封裝了讀取yml文件的類Element,在頁(yè)面對(duì)象讀取元素時(shí)只需要:

4.5 Selenium基類封裝

之所以對(duì)Selenium的基礎(chǔ)方法進(jìn)行封裝,是因?yàn)樵趙eb自動(dòng)化中,因網(wǎng)絡(luò)等原因會(huì)有不穩(wěn)定性,可能經(jīng)常需要等待元素或者做一些異常處理,如果在寫(xiě)測(cè)試的每一個(gè)地方都加上顯示等待又會(huì)使代碼冗余,并且難以維護(hù),所以把一些等待或者異常處理等封裝到selenium的基本方法中,這樣就很方便多次調(diào)用。對(duì)selenium基礎(chǔ)封裝我們是放到lib-pyse.py文件的Pyse類中,里面包含了基本的:獲取瀏覽器driver、打開(kāi)網(wǎng)頁(yè)、獲取元素、判斷元素是否顯示、截圖、點(diǎn)擊、清除、輸入、獲取元素文本、下拉框根據(jù)文本選擇等等一系列的操作,基本都能滿足日常項(xiàng)目需要。

在頁(yè)面對(duì)象直接可以繼承Selenium基類,這樣就可以直接調(diào)用父類的方法:

4.6 頁(yè)面對(duì)象

頁(yè)面對(duì)象我們是放在page目錄下管理,不同頁(yè)面建不同的模塊文件,封裝一些該頁(yè)面的基本操作。例如百度搜索:打開(kāi)百度網(wǎng)頁(yè)、輸入關(guān)鍵字、點(diǎn)擊百度搜索按鈕、一些校驗(yàn)方法等等

4.7 測(cè)試用例編寫(xiě)

了解了整個(gè)框架的關(guān)聯(lián)及特性,現(xiàn)在我們開(kāi)始著手寫(xiě)一下自動(dòng)化用例。一個(gè)完整的自動(dòng)化測(cè)試用例包含:

測(cè)試準(zhǔn)備(setup):測(cè)試準(zhǔn)備步驟,比如啟動(dòng)瀏覽器,初始化文件目錄數(shù)據(jù)

測(cè)試步驟(test steps):核心測(cè)試步驟,比如百度搜索測(cè)試的打開(kāi)網(wǎng)頁(yè),點(diǎn)擊搜索等業(yè)務(wù)操作流程

斷言(assertions):用例執(zhí)行完成后的期望結(jié)果

測(cè)試清理(teardown):對(duì)執(zhí)行測(cè)試造成的影響進(jìn)行清理和還原,以免影響后續(xù)執(zhí)行,比如關(guān)閉瀏覽器

前面在fixture特性中已經(jīng)用樣例提到了setup和teardown的實(shí)現(xiàn)機(jī)制,也以百度搜索為例詳細(xì)講解了頁(yè)面元素,頁(yè)面對(duì)象等,下面就不再贅述,直接繼續(xù)以百度搜索為例編寫(xiě)測(cè)試用例,我們引入的是BDD方法論:

上面就是整個(gè)測(cè)試業(yè)務(wù)流,整合了頁(yè)面對(duì)象中封裝的方法并加上了一些斷言和截圖。從上面步驟中大家可以看到調(diào)用了一個(gè)名叫search_page的fixture,這個(gè)fixture具體內(nèi)容如下,其實(shí)就是返回實(shí)例化的search頁(yè)面對(duì)象,且在方法中調(diào)用了fixture driver并將driver傳遞給了Search對(duì)象,因此Search頁(yè)面對(duì)象中的一些封裝方法就可以使用到driver做一些瀏覽器操作了。這一頓操作下來(lái),我們又解鎖了PyTest框架的一個(gè)新的知識(shí)點(diǎn):fixture是可以再調(diào)用其他的fixture的。


5 測(cè)試執(zhí)行及結(jié)果處理

5.1 執(zhí)行測(cè)試并生成報(bào)告

我們已經(jīng)了解到了整個(gè)框架的關(guān)聯(lián)及測(cè)試用例的輸出,下面我們進(jìn)入執(zhí)行階段,并在執(zhí)行完成之后生成測(cè)試報(bào)告。

5.2 測(cè)試結(jié)果發(fā)送郵件

測(cè)試執(zhí)行結(jié)束后通常會(huì)將測(cè)試結(jié)果發(fā)送郵件給相關(guān)人員。一般框架會(huì)自帶一些模塊功能來(lái)支持發(fā)送郵件,我們需要進(jìn)行一些組裝。以Python為例:Python內(nèi)置對(duì)SMTP的支持,可以發(fā)送純文本郵件、HTML郵件以及帶附件的郵件。 Python對(duì)SMTP支持有 smtplib 和 email 兩個(gè)模塊,email 負(fù)責(zé)構(gòu)造郵件,smtplib 負(fù)責(zé)發(fā)送郵件。具體實(shí)現(xiàn)細(xì)節(jié)可以參看:Python實(shí)現(xiàn)將測(cè)試結(jié)果報(bào)告打包發(fā)送郵件

最后我們可以將測(cè)試執(zhí)行、生成報(bào)告、發(fā)送郵件的調(diào)用方法進(jìn)行封裝并統(tǒng)一加入到run.py中,這樣只需要執(zhí)行 python run.py即可。


6 實(shí)踐中遇到的問(wèn)題及解決辦法

以上已經(jīng)了解了完整的測(cè)試框架及運(yùn)行流程。只是一些基本的實(shí)現(xiàn)。真正運(yùn)用到項(xiàng)目中,我們經(jīng)常會(huì)遇到一些問(wèn)題,在這里我也想跟大家分享一下我們經(jīng)歷的部分問(wèn)題。

問(wèn)題1:頁(yè)面元素需要一定的操作后才出現(xiàn),無(wú)法獲取元素

例子:比如一些非select類型的下拉框,默認(rèn)只顯示一頁(yè)數(shù)據(jù)(20條),如果超出一頁(yè)數(shù)據(jù)且想要選中最后一個(gè)選項(xiàng),需要滾動(dòng)到最后才能在elements中看到該元素。

解決辦法:那么就先滾動(dòng)到最后,再獲取元素。思路就是滾動(dòng)前先獲取下拉框的列表長(zhǎng)度,如果滾動(dòng)后的列表長(zhǎng)度不等于滾動(dòng)前的,就繼續(xù)滾動(dòng)到最后,直至相等。這里不得不提xpath定位中很好用的一個(gè)方法:last(),比如獲取最后一個(gè)a元素,a[last()]。

問(wèn)題2:同一個(gè)模塊中用例執(zhí)行時(shí)有些前置步驟重復(fù)操作且耗時(shí)

例子:為了保證用例之間隔離獨(dú)立性,在實(shí)現(xiàn)上如果運(yùn)行某個(gè)模塊的測(cè)試用例之前,都需要做一些前置操作,比如打開(kāi)tab頁(yè)面,再打開(kāi)navigator等。但這樣做很浪費(fèi)時(shí)間,因?yàn)樵谠撃K運(yùn)行前一個(gè)用例時(shí)這些操作已經(jīng)做過(guò)了,如果再來(lái)一遍可能又需要耗費(fèi)十幾秒。

解決辦法:運(yùn)用pytest框架的fixture特性,將某些前置操作封裝成fixture方法寫(xiě)入conftest.py中,并設(shè)置scope作用域?yàn)閙odule,這樣一旦模塊中有用例調(diào)用過(guò),其他用例就不會(huì)重復(fù)去操作了。

問(wèn)題3:為了保證測(cè)試之間的獨(dú)立性,一些編輯、刪除操作前的數(shù)據(jù)構(gòu)造是通過(guò)UI新建來(lái)進(jìn)行的,很冗余

例子:比如UI上的業(yè)務(wù)數(shù)據(jù)表單需要覆蓋新建、編輯、刪除等操作,為了保證測(cè)試之間的獨(dú)立性,編輯和刪除之前都會(huì)先重復(fù)調(diào)用在UI上新建的流程,再進(jìn)行編輯、刪除,很冗余且耗時(shí)。

解決辦法:封裝一個(gè)post接口請(qǐng)求方法,通過(guò)接口快速的創(chuàng)建前置數(shù)據(jù),把UI測(cè)試重點(diǎn)放在編輯和刪除操作上。


參考資料

基于一些項(xiàng)目安全因素,我不能將代碼框架分享給大家,但是強(qiáng)推以下鏈接,也是我學(xué)習(xí)參考的部分資料,思路跟我們項(xiàng)目的實(shí)現(xiàn)大體差不多,本文也運(yùn)用了其中的一些知識(shí)點(diǎn),希望能幫助到大家~

基于Selenium與Pytest框架的Web UI自動(dòng)化測(cè)試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

Selenium+Pytest自動(dòng)化測(cè)試框架實(shí)戰(zhàn)

BDD行為驅(qū)動(dòng)簡(jiǎn)介及Pytest-bdd基礎(chǔ)使用

pytest教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容