日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python3.7界面设计_基于selenium+Python3.7+yaml+Robot Framework的UI自动化测试框架

發(fā)布時間:2025/5/22 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3.7界面设计_基于selenium+Python3.7+yaml+Robot Framework的UI自动化测试框架 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前端自動化測試框架

項目說明

本框架是一套基于selenium+Python3.7+yaml+Robot Framework而設(shè)計的數(shù)據(jù)驅(qū)動UI自動化測試框架,Robot Framework 作為執(zhí)行器,本框架整體特點為:用例與代碼分離;用例驅(qū)動測試的執(zhí)行;分層設(shè)計、腳本模塊化;自動準(zhǔn)備測試條件和數(shù)據(jù)、事后清理;支持失敗多次重試、且在每次重試前都會還原一次測試環(huán)境,保證重試的成功率;支持郵件呈現(xiàn)測試結(jié)果;可靈活挑選項目和用例執(zhí)行。

框架特點說明

數(shù)據(jù)驅(qū)動

封裝一個測試腳本,通過不同的數(shù)據(jù)來驅(qū)動,保證測試覆蓋率

用例執(zhí)行前初始化,執(zhí)行后釋放資源

執(zhí)行測試數(shù)據(jù),并進(jìn)行結(jié)果判斷,測試失敗或者異常時,會產(chǎn)生相關(guān)日志和截圖

用例與代碼分離

代碼中不含有測試用例

測試用例采用robot格式撰寫

用例按功能點分類

每個用例都是獨立的,不互相依賴也不互相影響

可按項目、模塊、測試點挑選執(zhí)行用例

運行結(jié)束后,還原測試環(huán)境,清理臟數(shù)據(jù)

分層設(shè)計

操作對象、頁面元素、業(yè)務(wù)邏輯、測試數(shù)據(jù)相互剝離,靈活調(diào)用

封裝底層操作組件

按頁面封裝和分類頁面元素

封裝基礎(chǔ)邏輯,組合業(yè)務(wù)邏輯實現(xiàn)功能點

腳本模塊化

不同功能腳本模塊化,各模塊間保持獨立性和可融合性

封裝基礎(chǔ)方法,如隨機郵箱等

封裝通用模塊,如文件讀寫、壓縮文件、郵件發(fā)送、日志等

模塊支持自主開啟和關(guān)閉

失敗多次重試

可自主開啟和關(guān)閉失敗自動重試功能

重試開始在每輪測試結(jié)束之后

每次重試前后會初始化環(huán)境和還原環(huán)境

只重試失敗用例

每次重試結(jié)束會自動合并重試報告

重試結(jié)束會自動合并出總報告

報告可選擇自動壓縮并郵件發(fā)送

測試結(jié)束后,也可手動啟動失敗重試和合并報告

技術(shù)棧

selenium

Python3.7

Robot Framework

yaml

AutoItLibrary

logging

SSHLibrary

databaselibrary

環(huán)境部署

安裝python3.7,并將Python的安裝目錄添加到系統(tǒng)環(huán)境變量的Path路徑中

命令行窗口執(zhí)行pip install -r requirements.txt 安裝工程所依賴的庫文件

AutoItLibrary安裝

安裝autoit-v3-setup.exe(V3.3.14.5),安裝過程中一定要選x64,不然加載AutoItLibrary還是會是紅色

pip install robotframework-autoitlibrary

在Python安裝目錄(\Python37\Lib\site-packages\win32com\client)下,修改dynamic.py文件,在import pythoncom后,加 pythoncom.CoInitialize() 。(目的是解決在ride中導(dǎo)入AutoItLibrary時,報(-2147221008, '尚未調(diào)用 CoInitialize。', None, None)的錯誤。)

將相關(guān)瀏覽器的驅(qū)動,比如谷歌瀏覽器的驅(qū)動chromedriver.exe放在python的安裝目錄(\Python37)下

將自定義庫,比如randomGenerator.py放在python目錄(\Python37\Lib\site-packages)下

在Python安裝目錄(\Python37\Lib\site-packages\robotide\contrib\testrunner)下,修改testrunner.py文件,將'latin1' if IS_WINDOWS修改為'mbcs' if IS_WINDOWS。(目的是解決RIDE控制臺中文顯示亂碼的問題),修改后的內(nèi)容和位置具體如下:

for _ in myqueuerng:

try:

# DEBUG result += self._queue.get_nowait()

# .decode(utils.SYSTEM_ENCODING, 'replace')

# .decode('UTF-8','ignore')

result += encoding.console_decode(self._queue.get_nowait(),

'mbcs' if IS_WINDOWS

else 'UTF-8')

安裝UI元素定位工具(根據(jù)實際需要選裝)

火狐瀏覽器插件

Try XPath

xPath Finder

ChroPath

谷歌瀏覽器插件

ChroPath

框架目錄結(jié)構(gòu)圖及相關(guān)說明

1、代碼目錄結(jié)構(gòu)圖如下

2、目錄結(jié)構(gòu)說明

Config ===========> 配置文件

pycode ===========> python公共方法、模塊封裝,工具類等

rfcode ==========> 存放項目/系統(tǒng)的測試用例、公共配置、界面元素、業(yè)務(wù)邏輯操作等等

logs ==========> 日志文件

Report ==========> 測試報告

common_Run.py ===========> 測試用例總執(zhí)行模塊

testfile ============> 存放測試過程的操作文件

requirements.txt ============> 相關(guān)依賴包文件

run_test.bat =============> 測試啟動按鈕,測試過程中,若有失敗則自動進(jìn)行失敗重試

retry.bat ============> 測試結(jié)束后,再次進(jìn)行失敗重試手動啟動按鈕

代碼設(shè)計與功能說明

1、定義運行配置文件 config.yml

該文件主要控制測試的執(zhí)行方式、模塊的功能開關(guān)、測試用例的篩選、郵件的配置以及日志的配置,具體如下:

config.yml配置信息

---

#待執(zhí)行的產(chǎn)品項目, Cloud -云項目; rfcode -執(zhí)行所有的項目

ProductItem: Cloud

#待執(zhí)行的測試套件(標(biāo)簽), all -所有的測試套件: debug -調(diào)試中套件; login -登錄功能 ; filter -賬號篩選: P1 -一級用例

testSuite: P1

#測試報告標(biāo)題

testReportTitle: Cloud_Report

#失敗重試開關(guān), 0 -關(guān), 1 -開 ,開啟后默認(rèn)重試一次

retry_switch: 0

#失敗重試次數(shù)

retryTime: 1

#發(fā)送測試報告郵件開關(guān), 0 -關(guān), 1 -開

emailSwitch: 1

#郵件配置

#發(fā)件郵箱

smtp_server: smtp.126.com

server_username: XXXtest@126.com

server_pwd: XXXXXX

#收件人(列表)

msg_to:

- XXX1@qq.com

- XXX2@126.com

#郵件主題

msg_subject: '[XX項目][測試環(huán)境-develop][jira號][自動化測試報告]'

#日志級別(字典),由高到低: CRITICAL 、 ERROR 、 WARNING 、 INFO 、 DEBUG

log:

file_name: test.log

backup: 5

console_level: DEBUG #控制臺日志級別

file_level: DEBUG #文件日志級別

pattern: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'

2、測試用例的設(shè)計

測試用例以robot格式的文件保存,平時只需維護(hù)測試數(shù)據(jù)和期望結(jié)果,維護(hù)成本低。測試用例的數(shù)據(jù)格式如下:

3、用例執(zhí)行腳本

按照測試用例,組合業(yè)務(wù)邏輯,實現(xiàn)功能點測試,以供測試用例循環(huán)調(diào)用

4、測試執(zhí)行主程序common_Run.py(收集測試用例,批量執(zhí)行并生成測試報告,并發(fā)送報告到郵件)

# coding: utf-8

import os,sys

import time

from config import BASE_PATH,Config

from global_model.log import logger

from global_model.format_change import formatChange

from email_model.run_sendEmail import sendEailMock

def batch_Call(basePath, product_item, testCase_tag):

'''

首次執(zhí)行測試:

param robot_testSuite: robot testSuite路徑;

param product_item: 執(zhí)行的待測產(chǎn)品項目;

param testCase_tag: 執(zhí)行的測試用例標(biāo)簽;

param testCaseReportPath: 測試報告路徑;

'''

try:

logger.info(u'=======================首次測試執(zhí)行開始!正在初始化數(shù)據(jù)庫!=============================')

pybot_result_list = []

output_dir = "-d " + basePath + "/Report/primo_report"

output_xml = "-o output.xml"

output_log = "-l log.html"

output_report = "-r report.html"

productItem = "-s " + product_item

caseTag = "-i " + testCase_tag

pybot_cmd = "pybot " + output_dir + " " + output_xml + " " + output_log + " " + output_report + " " + productItem + " " + caseTag + " " + basePath

pybot_result=os.system(pybot_cmd)

return pybot_result

except Exception as e:

logger.exception(u'首次執(zhí)行測試失敗. %s', e)

finally:

logger.info(u'測試項目根目錄為:{0}'.format(basePath))

logger.debug(u'首次執(zhí)行測試報告輸出目錄:{0}'.format(output_dir))

logger.info(u'首次執(zhí)行測試的pybot命令:{0}'.format(pybot_cmd))

logger.info(u'======================首次執(zhí)行測試已完成!用例失敗數(shù)為:{0} 個!========================'.format(pybot_result))

def mergeReport(basePath, report_title, match_report, copy_source_match, copy_target_match, merge_report_output):

'''

合并報告:

param testCaseReportPath: 測試報告路徑;

param report_title: 合并報告的標(biāo)題;

return:

'''

try:

logger.info(u'==========================合并測試報告開始!==================================')

output_dir = "-d " + basePath + "/Report/{0}".format(merge_report_output) # 輸出合并報告目錄

output_xml = "-o output.xml"

output_log = "-l log.html"

output_report = "-r report.html"

# 被合并的報告

merge_report = "--merge " + basePath + "/Report/{0}".format(match_report) + "/output.xml"

title = "--ReportTitle " + report_title

rebot_cmd = r"rebot " + output_dir + " " + output_xml + " " + output_log + " " + output_report + " " + title + " " + merge_report

mergeReport_result = os.system(rebot_cmd)

logger.debug(u'合并報告的結(jié)果為:{0}'.format(mergeReport_result))

# 復(fù)制截圖

testCaseReportPath = basePath + "/Report"

source_files = testCaseReportPath + "/{0}/*.png".format(copy_source_match)

target_dir = testCaseReportPath + "/{0}".format(copy_target_match)

cp_cmd = r"copy " + source_files + " " + target_dir

cp_cmd = cp_cmd.replace("/", "\\")

cope_result = os.system(cp_cmd)

logger.debug(u'復(fù)制截圖的結(jié)果為:{0}'.format(cope_result))

return mergeReport_result

except Exception as e:

logger.exception(u'合并報告異常. %s', e)

finally:

logger.debug(u'輸出合并報告目錄為:{0}'.format(output_dir))

logger.info(u'合并報告rebot命令:{0}'.format(rebot_cmd))

if mergeReport_result != 0:

logger.info(u'======================合并報告中有失敗用例!========================')

else:

logger.info(u'======================沒有失敗重試的報告需合并,或者合并報告中的用例已全通過!========================')

logger.info(u'復(fù)制截圖命令為:{0}'.format(cp_cmd))

if cope_result == 0:

logger.info(u'======================截圖已成功復(fù)制到合并報告中!========================')

else:

logger.info(u'======================報告中沒有需要復(fù)制的截圖!========================')

def cleanLogs(basePath):

'''

刪除硬盤中合并前的測試報告:

param testCaseReportPath: 測試報告路徑;

return:

'''

try:

logger.info(u'==========================清理磁盤報告開始!==================================')

testCaseReportPath = basePath + "/Report"

primo_report_files = testCaseReportPath + "/primo_report/*"

retry_report_files = testCaseReportPath + "/retry_report/*"

merge_files = testCaseReportPath + "/merge/*"

zip_merges_files = testCaseReportPath + "/zip_merges/*"

retry_times_files = testCaseReportPath + "/retry_times/*"

del_cmd = "del " + primo_report_files + " " + retry_report_files + " " + merge_files + " " + zip_merges_files + " " + retry_times_files

del_cmd = del_cmd.replace("/", "\\")

del_cmd = del_cmd + " " + "/s /q /f"

clean_result = os.system(del_cmd)

except Exception as e:

logger.exception(u'清理磁盤報告異常. %s', e)

finally:

logger.info(u'清理磁盤報告命令為:{0}'.format(del_cmd))

logger.debug(u'清理磁盤報告結(jié)果為:{0}'.format(clean_result))

if clean_result == 0:

logger.info(u'======================測試報告清理成功!========================')

else:

logger.info(u'======================測試報告清理失敗!========================')

def run_test(basePath, product_item, testCase_tag, report_title, email_switch, smtp_server, server_username, server_pwd, msg_to, msg_subject, retry_switch, retry_time):

'''

失敗自動重試:

param robot_testSuite: robot testSuite路徑;

param testCase_tag: 執(zhí)行的測試用例標(biāo)簽;

param testCaseReportPath: 測試報告路徑;

param report_title: 合并報告的標(biāo)題;

'''

#清理環(huán)境

cleanLogs(basePath)

#首次執(zhí)行

run_result = batch_Call(basePath, product_item, testCase_tag)

#失敗重試

retryFunction = retry_switch

if retryFunction == 1:

try:

if run_result != 0:

logger.info(u'======================失敗用例重試第 1 次!========================')

output_dir = "-d " + basePath + "/Report/retry_report"

retry_xml = "-R " + basePath + "/Report/primo_report/output.xml"

pybot_cmd = "pybot " + retry_xml + " " + output_dir + " " + basePath

logger.info(u'第 1 次失敗重試命令為:{0}'.format(pybot_cmd))

retry_result=os.system(pybot_cmd)

logger.info(u'======================失敗用例重試第 1 次已完成!用例失敗數(shù)為:{0} 個!========================'.format(retry_result))

retryTimes = retry_time

n = 2

while (retryTimes >=2 and retry_result != 0):

logger.info(u'======================失敗用例重試第 {0} 次!========================'.format(n))

output_dir = "-d " + basePath + "/Report/retry_times"

retry_xml = "-R " + basePath + "/Report/retry_report/output.xml"

pybot_cmd = "pybot " + retry_xml + " " + output_dir + " " + basePath

logger.info(u'第 {0} 次失敗重試命令為:{1}'.format(n, pybot_cmd))

retry_result=os.system(pybot_cmd)

logger.info(u'======================失敗用例重試第 {0} 次已完成!用例失敗數(shù)為:{1} 個!========================'.format(n, retry_result))

logger.info(u'======================正在合并重試報告!========================')

merge_report_output = 'retry_report'

match_report = 'retry_*'

copy_source_match = 'retry_times'

copy_target_match = 'retry_report'

mergeReport(basePath, report_title, match_report, copy_source_match, copy_target_match, merge_report_output)

logger.info(u'======================失敗用例重試第 {0} 次合并報告已完成!========================'.format(n))

n = n + 1

retryTimes = retryTimes-1

except Exception as e:

logger.exception(u'失敗重試異常. %s', e)

else:

logger.info(u'======================本次測試的失敗重試功能已關(guān)閉!========================')

#合并報告

merge_report_output = 'merge'

match_report = '*_report'

copy_source_match = 'retry_report'

copy_target_match = 'merge'

report_result = mergeReport(basePath, report_title, match_report, copy_source_match, copy_target_match, merge_report_output)

logger.debug(u'======================最終測試結(jié)果為: {0} !========================'.format(report_result))

if report_result == 0:

ReportResult = u'測試通過!'

else:

ReportResult = u'測試不通過!失敗用例數(shù)為:{0} 個'.format(report_result)

#發(fā)送report到郵件

emailFunction = email_switch

if emailFunction == 1:

#將字符中的反斜杠轉(zhuǎn)成正斜杠

fileUrl_PATH = basePath.replace('\\','/')

logger.debug(u'基礎(chǔ)路徑的反斜杠轉(zhuǎn)成正斜杠為:{0}'.format(fileUrl_PATH))

fileUrl='file:///{0}/Report/merge/report.html'.format(fileUrl_PATH)

logger.info(u'html測試報告的url為:{0}'.format(fileUrl))

save_fn=r'{0}\Report\zip_merges\report.png'.format(basePath)

logger.debug(u'轉(zhuǎn)成圖片報告后保存的目標(biāo)路徑為:{0}'.format(save_fn))

formatChange_obj = formatChange()

formatChange_obj.html_to_image(fileUrl, save_fn)

email_folder_dir = basePath + "/Report/merge" #待壓縮文件夾

logger.debug(u'待壓縮文件夾為:{0}'.format(email_folder_dir))

email_target_dir = basePath + "/Report/zip_merges" #壓縮文件保存路徑

sendEailMock_obj = sendEailMock()

sendEailMock_obj.send_email(email_folder_dir, email_target_dir, smtp_server, server_username, server_pwd, msg_to, msg_subject, ReportResult, save_fn)

else:

logger.info(u'======================本次測試的郵件功能已關(guān)閉!========================')

if __name__ == '__main__':

c = Config()

ProductItem = c.get('ProductItem')

testSuite = c.get('testSuite')

testReportTitle = c.get('testReportTitle')

emailSwitch = c.get('emailSwitch')

smtp_server = c.get('smtp_server')

server_username = c.get('server_username')

server_pwd = c.get('server_pwd')

msg_to = c.get('msg_to')

msg_subject = c.get('msg_subject')

retrySwitch = c.get('retry_switch')

retryTime = c.get('retryTime')

run_test(BASE_PATH, ProductItem, testSuite, testReportTitle, emailSwitch, smtp_server, server_username, server_pwd, msg_to, msg_subject, retrySwitch, retryTime)

5、測試報告呈現(xiàn)

測試概要報告

測試執(zhí)行過程中若有失敗重試時,則報告中會呈現(xiàn)出前一次失敗的結(jié)果和原因,同時也會呈現(xiàn)出重試后成功的結(jié)果,并且最終的報告結(jié)果以最后一次的重試結(jié)果為準(zhǔn)

測試執(zhí)行過程有失敗用例時,報告呈現(xiàn)失敗截圖

報告發(fā)送至郵件時,郵件標(biāo)題呈現(xiàn)測試通過與否,或失敗用例數(shù)

郵件正文直接顯示本次測試概要報告,直觀顯示出執(zhí)行用例數(shù),失敗用例數(shù),失敗的用例模塊等結(jié)果。

項目實戰(zhàn)演示

總結(jié)

以上是生活随笔為你收集整理的python3.7界面设计_基于selenium+Python3.7+yaml+Robot Framework的UI自动化测试框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 丰满熟女人妻一区二区三区 | 粉嫩av一区二区三区天美传媒 | 国产欧美一区二区 | 国产精品av免费观看 | aa视频在线 | www.夜夜骑 | 在线亚洲人成电影网站色www | 国产亚洲精品久 | 亚洲精品国产精品国自产 | 国产欧美一区二区在线观看 | 伊朗做爰xxxⅹ性视频 | 在线免费观看成年人视频 | 亚洲国产日韩一区二区 | 国产99久久久国产精品免费看 | 国产男女猛烈无遮挡免费观看网站 | 九九精品在线播放 | 色综合久久五月 | 亚洲欧美一区二区三区在线观看 | 先锋资源av | 日日操夜夜操狠狠操 | 麻豆精品免费观看 | 黄色大片网站 | 日本免费一级片 | 四虎在线免费 | 日韩av图片| 香蕉大人久久国产成人av | 中国黄色一级毛片 | 黄网免费在线观看 | 免费黄色小说视频 | 久久精品国产一区二区电影 | 无码人妻精品一区二区三区在线 | 激情午夜婷婷 | 欧美鲁鲁 | a视频免费观看 | 激情在线网站 | 超碰网站在线观看 | 欧洲国产精品 | 天天综合天天添夜夜添狠狠添 | 素人fc2av清纯18岁 | 久久国产精品免费 | 少妇xxxxxx| 很很干很很日 | 青青青草国产 | 欧美资源在线 | 日韩欧美亚洲一区二区 | 亚洲最新av网站 | 精品国产一二区 | 蜜臀99久久精品久久久久久软件 | 最新国产一区 | 亚洲成av人影院 | 久久r| 日韩欧美精品免费 | 视色影院| 超碰人人超碰 | 免费黄色一级大片 | 97超碰人人网 | 免费福利小视频 | 久操资源网 | www亚洲一区 | 91无打码 | 国产在线免费 | 久久久久久免费精品 | 肉丝美足丝袜一区二区三区四 | 无人在线观看高清视频 | 毛片官网| 北岛玲一区二区 | 大尺度在线观看 | 久久久国产精 | 日本中文字幕在线播放 | 亚洲精品1区| 国产伦一区二区三区 | 一级理论片 | 日韩经典在线观看 | 久草热线 | 少妇高潮一区二区三区99欧美 | 精品久久久国产 | 成人午夜av在线 | 91久久综合精品国产丝袜蜜芽 | 性xxxxbbbb | 国产精品9 | 欧美人一级淫片a免费播放 西方av在线 | 国产成人一区二区三区别 | 久色视频在线播放 | 欧美成片vs欧美 | 四虎免费网址 | a天堂中文在线观看 | 四虎影视大全 | 伊人色播 | 爱情岛黄色 | 潘金莲裸体一级淫片视频 | 中文字幕永久在线 | 欧美精品一区二区性色a+v | 2018av在线 | 国产级毛片 | 性高潮网站| 精品一区二区在线视频 | 成人v | 色哟哟免费观看 | 国产精品破处 |