物業系統自主研發接口測試框架

1、自主研發框架整體設計

1.1、什么是測試框架?

在了解什么是自動化測試框架之前,先了解一下什么叫框架?框架是整個或部分系統的可重用設計,表現為一組抽象構件及構件實例間交互的方法;另一種定義認為,框架是可被應用開發者定制的應用骨架。前者是從應用方面,而后者是從目的方面給出的定義。從框架的定義可以了解,框架可以是被重用的基礎平臺;框架也可以是組織架構類的東西。其實后者更為貼切,因為框和架本來就是組織和歸類所用的。

所以自動化測試框架的定義為:由一個或多個自動化測試基礎模塊、自動化測試管理模塊自動化測試統計模塊等組成的工具集合。

框架的定義來分,自動化測試框架可以分為:基礎功能測試框架、管理執行框架;按不同的測試類型來分,可以分為:功能自動化測試框架、性能自動化測試框架;按測試階段來分,可以分為:單元自動化測試框架、接口自動化測試框架、系統自動化測試框架;按組成結構來分,可以分為:單一自動化測試框架、綜合自動化測試框架;按部署方式來分,可以分為:單機自動化測試框架、分布式自動化測試框架。

看到這里,也許大家看完也不清楚上面到底講的是什么。因為沒有實際接觸過,不知道具體功用,只是用一種抽象解釋另一種抽象,另外只是描述了結論,沒有描述推演的過程。

1.2、那么如何打破阻礙呢?

方法如下:

1、工作遇到了什么問題,需要使用XX技術?

2、這個技術能解決當下的工作問題嗎?解決到什么程度呢?

3、這個技術能做什么,不能做什么?

4、具體如何實現的過程?

當前有下面的腳本需要接入到框架中。

要有以終為始的逆向思維方式,從最下面往上面分析。

1.3、框架測試報告初期規劃:

執行時間,執行人,執行環境..

XXX時間:執行了XXX接口,接口執行結果

XXX時間:腳本報錯信息

框架腳本整體執行情況統計

把框架測試結果發給相關責任人

1.4測試框架驅動設計

1、設置全局環境數據結構

2、讀取測試框架配置文件

3、按照配置文件制定內容執行對應的測試腳本

4、創建測試報告,并寫入總體初始化內容

5、若執行完所有的測試腳本,輸出最終的測試報告,否則繼續執行下一個腳本

6、寫入新的測試報告內容

7、保存測試報告。

1.5 測試框架整體結構

本次測試框架分為三個層。分別為驅動層test_driver,報告層test_report,測試腳本層test_script。

其中config.csv是存放的測試腳本及路徑 。

driverV1.py是驅動的執行程序。

report1.py存放的是測試報告

testcase_report1.txt存放的是單個用例不同數據的執行結果。

2、登錄接口自研框架實踐_global+csv+system文件

driver通過讀取config.csv里面的信息,讀取腳本名,再到test_script下面去找對應的腳本執行。

驅動讀取框架配置文件

3、自研框架類圖及流程圖設計梳理

框架整體流程圖:

config.csv內容

3.1 驅動類設計

進行實例化對象

#導入類庫
import csv,os
import datetime
# 試驗1:普通全局變量的使用
import pymysqlglobal glob_url
glob_url='https://svr-6-9009.share.51env.net/prod-api'
print(glob_url)
# 封裝成一個驅動類
class driver_run():#讀取配置文件,獲取py文件名def run_testpy(self):# 設置腳本程序對應的路徑path = "..\\test_script\\"csvfile=open("config.csv",'r')rows=csv.reader(csvfile)# 跳過標題行next(rows)# 逐行讀取配置文件內容for row in rows:print(row[2])self.number=row[0]self.name = row[1]# 判斷是否創建測試用例報告頭部if row[4]=='Y':if row[3] == '1':self.create_testcase_report()# 調用指定的接口腳本文件os.system("python "+path+row[2])# return row[0],row[1]  不能用面向過程的方法,要用面向對象的方法# 調用報告寫入內容方法self.write_report()self.endtime=datetime.datetime.now()# 獲取當前框架程序運行的總時長,如果時長已經大于50分鐘了,# 主動調用登錄接口,重新更新tokenrtime = self.endtime - self.starttime# 判斷時間差是否超過50分鐘if (rtime.seconds // 60) >= 50:# 調用登錄接口os.system("..\\test_script\\loginV4.py")# 定義創建測試報告并寫入頭部公共信息def create_report(self):self.starttime = datetime.datetime.now()# print(self.starttime)# 時間進行格式化starttime = self.starttime.strftime("%Y-%m-%d %H:%M:%S")print(starttime)# 將時間戳寫入txt文件txtReport = open('..\\test_report\\report1.txt', "w")txtReport.write("*****************************************************************""\n")txtReport.write("智慧物業系統接口測試框架"+"\n")txtReport.write(starttime+"         shangshang"+"       "+"\n")txtReport.write("接口測試執行環境說明:"+glob_url+"\n")txtReport.write("*****************************************************************"+"\n")txtReport.close()# 定義創建測試用例報告并寫入頭部公共信息def create_testcase_report(self):starttime = datetime.datetime.now()print(starttime)# 時間進行格式化starttime = starttime.strftime("%Y-%m-%d %H:%M:%S")print(starttime)# 將時間戳寫入txt文件txttestReport = open('..\\test_report\\testcase_report1.txt', "w")txttestReport.write("*****************************************************************""\n")txttestReport.write("該測試用例運行開始時間:"+starttime+"\n")txttestReport.write("接口編號"+self.number+"          ")txttestReport.write('接口名稱'+self.name+"\n")txttestReport.write("*****************************************************************"+"\n")txttestReport.close()def write_report(self):txtReport = open('..\\test_report\\report1.txt', "a")txtReport.write("接口編號:"+self.number+"    接口名稱:"+self.name)# 讀取comresult文件中的測試結果comfile=open("commonresult.txt", 'r')for result in comfile:txtReport.write("       接口測試結果:"+result+"\n")comfile.close()txtReport.close()def write_commonresult(self,result):# 寫入接口測試結果到公共文件中comfile = open("..\\test_driver\\commonresult.txt", 'w')# 把result存入data文件中comfile.write(result)comfile.close()#取出token文件中的token的值def get_token(self):tokenfile=open("..\\test_driver\\token.txt","r")for token in tokenfile:tokenvalue=tokenreturn tokenvalue#連接數據庫進行查詢返回查詢結果def db_connect(self,sql):# 打開數據庫連接db=pymysql.connect(host='vip.51env.net',user='readonly',password='******',port=30001,db='******',charset='utf8')# 用cursor()方法獲取操作游標cursor = db.cursor()# 使用execute方法執行SQL語句cursor.execute(sql)# 使用fetchall()方法獲取一條數據db_result=cursor.fetchall()# 關閉數據庫連接db.close()# 返回查詢結果return db_resultif __name__ == '__main__':#實例化驅動類的對象objdriver=driver_run()# 創建測試報告頭部objdriver.create_report()# 調用接口文件objdriver.run_testpy()

3.2 登錄類

實例化登錄類

# ********************************************************************************
# 登錄接口V5.0腳本實現
# 功能:1、調用圖片驗證碼接口獲取uuid
#      2、將獲取到的uuid傳入登錄接口中
#       3、分別對兩個功能進行面向對象封裝
# 修改內容: 增加token屬性,為其他接口提供驗證
# ********************************************************************************
#  導入類庫
import requests
import json
# 定義一個類:包含兩個方法和一個屬性
from test_driver.driverV1 import driver_run,glob_urlclass login_interface():# 定義一個屬性def __init__(self):self.uuid=''#增加token屬性self.token=''#方法1:獲取驗證碼對應的uuiddef getuuid(self):# 取驗證碼圖片接口uuid# 定義獲取驗證碼接口地址CaptchaURL = 'https://svr-6-9009.share.51env.net/prod-api/captchaImage'# 發送請求response = requests.get(CaptchaURL).json()# 獲取uuid# print(type(response))# 全局uuid引用說明# global uuidself.uuid = response['uuid']# print(self.uuid)# return uuid# 執行登錄接口的測試def login_test(self):# 定義接口地址url = "https://svr-6-9009.share.51env.net/prod-api/login"# 定義接口參數# print("登錄方法中", self.uuid)userinfo = {"username": "admin","password": "admin123","code": "51testing","uuid": self.uuid}# print(type(userinfo))# 將字典類型轉化為json類型userjson = json.dumps(userinfo)# print(type(userjson))# 發送接口請求response = requests.post(url, data=userjson, headers={"Content-Type": "application/json"}).json()# print(response)# print(response["msg"])# 對比實際和預期結果if response["msg"] == '操作成功' and response["username"] == 'admin':result="登錄接口成功"self.token=response["token"]tokenfile=open("..\\test_driver\\token.txt","w")tokenfile.write(self.token)tokenfile.close()else:result="登錄接口失敗"return result# 進行實例化調用
if __name__ == '__main__':# 實例化對象loginObj=login_interface()# 調用其中的方法loginObj.getuuid()result=loginObj.login_test()print(result)# 實例化驅動類對象objdriver=driver_run()# 調用寫入公共文件方法objdriver.write_commonresult(result)

3.3 獲取用戶信息接口

代碼:

# **********************************************************
# 獲取登錄用戶信息接口V3.0腳本實現
# 功能:常量參數傳遞
# 問題1:引用登錄接口類
# 問題2:運行登錄接口類,并獲取最新的token
# 問題3:用面向對象的方法將獲取到的最新的token傳入獲取用戶信息接口
# ***********************************************************
# 引入登錄接口類
from test_driver.driverV1 import glob_url,driver_run
# 導入類庫
import requests# **************************************************class GetUserInfo():def getuser_test(self,token):# 定義接口地址url=glob_url+'/getInfo'header={'Authorization':'Bearer '+token}# 發送請求并獲取self.response=requests.get(url,headers=header).json()print(self.response)def getuser_check(self):# 進行檢查點的驗證# 提取msgmsg=self.response['msg']# print(msg)# 通過assert斷言進行msg的驗證# 提取電話phone=self.response['user']['phonenumber']# print(phone)# 提取郵箱email=self.response['user']['email']# print(email)# 提取用戶名username=self.response['user']['userName']# print(username)#對assert進行異常捕獲try:assert msg == '操作成功'assert phone=='13800138000'assert email=='13800138000@139.com'assert username=='admin'except:result="獲取用戶信息接口測試失敗"else:result = "獲取用戶信息接口測試成功"return  resultif __name__ == '__main__':objdriver=driver_run()token=objdriver.get_token()print(token)#實例化獲取用戶信息對象類objgetuser=GetUserInfo()objgetuser.getuser_test(token)result=objgetuser.getuser_check()# 將測試執行結論放入comresult.txt中objdriver.write_commonresult(result)

3.4 創建商鋪接口

#創建商鋪接口V1.0接口腳本實現
#功能:常量參數傳遞
#*************************************************************************
# 導入類庫
import datetime
import jsonimport requests
import pymysqlfrom test_driver.driverV1 import glob_url, driver_runclass createhouse_interface():def createhouse_test(self,token):# 打開測試用例報告文件txttestReport = open('..\\test_report\\testcase_report1.txt', "a")# 定義接口地址url=glob_url+'/baseconfig/House'for i in range(1,3):# 傳入接口參數,獲取實際返回值self.code='05-09-'+str(i)housedata={"block": "01","code": self.code,"buildingsquare": "100","usesquare": "50","state": "empty","floor": "12","rentFee": "12000","remark": "test"}housejson=json.dumps(housedata)# 傳入token參數header = {'Authorization': 'Bearer ' + token,"Content-Type":"application/json"}# 比對結果1:接口返回值response=requests.post(url,data=housejson,headers=header).json()print(response['msg'])# 比對結果:直接比對接口返回msgself.msg=response['msg']if self.msg=='新建成功':result='創建商鋪接口測試用例'+self.code+"接口測試用例成功"else:result = '創建商鋪接口測試用例' + self.code + "接口測試用例失敗"# 將接口測試用例的執行結果及數據內容寫入對應的測試用例報告中# 寫入是第幾次測試,測試商鋪編號,測試結論txttestReport.write('測試用例編號:'+str(i))txttestReport.write("    創建商鋪的編號為:"+self.code)txttestReport.write("    測試用例執行結果:"+result+"\n")txttestReport.write("*****************************************************************" + "\n")#共執行多少條數據txttestReport.write("共執行" + str(i) +"條測試用例"+ "\n")# 獲取系統時間,來寫入結束時間endtime = datetime.datetime.now()# 時間進行格式化endtime = endtime.strftime("%Y-%m-%d %H:%M:%S")# 時間格式進行格式化txttestReport.write('該接口測試執行結束時間:'+endtime+"\n")txttestReport.close()#連接后臺數據庫進行ID的檢查,并給出測試結論def createhouse_checkCode(self):id='5c7100ce60d044768223daf1546b3b61'sql="SELECT * FROM `config_house` WHERE id ='"+id+"'"dbresult=objdriver.db_connect(sql)print(dbresult)db_code=dbresult[0][1]print(db_code)# #判斷是否執行成功if db_code==self.code and self.msg=='新建成功':result="創建商鋪列表接口測試通過"print(self.code)else:result="創建商鋪列表接口測試失敗"print(self.code)return resultif __name__ == '__main__':objdriver = driver_run()token = objdriver.get_token()print(token)# 實例化創建商鋪接口類對象objcreatehouse = createhouse_interface()objcreatehouse.createhouse_test(token)# 調用數據庫檢查點result=objcreatehouse.createhouse_checkCode()# 將測試執行結論放入comresult.txt中objdriver.write_commonresult(result)

4、框架報告+測試用例報告

愿每個測試都能成為測試開發,提高職業技能,成為前1%的存在,為社會創造更大的價值,為公司節約更多的成本,為自己和家庭謀求更高的收入,所有人不受職業年齡限制,越老越吃香,直至財富自由;愿測試技術越來越進步,軟件質量進一步得到提高,效率提高。愿祖國更加美好,人民更加幸福。多喜樂,常安寧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43675.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis 主從復制,集群與高可用

雖然Redis可以實現單機的數據持久化,但無論是RDB也好或者AOF也好,都解決不了單點宕機問題,即一旦單臺 redis服務器本身出現系統故障、硬件故障等問題后,就會直接造成數據的丟失 此外,單機的性能也是有極限的,因此需要使用另外的技…

捷配生產筆記-細間距芯片的表面處理工藝:OSP與沉金工藝的重要性

在現代電子制造領域,隨著技術的進步,電子設備變得越來越小型化和高性能化。細間距芯片作為實現這一目標的關鍵組件,其制造工藝要求極為嚴格。在這些要求中,表面處理工藝尤為關鍵,因為它直接影響到芯片的焊接質量和長期…

江蘇云服務器適用于哪些場景?

云服務器主要是指一中基于云計算技術的虛擬化服務器,用戶能夠通過互聯網網絡進行遠程訪問和管理,與傳統的物理服務器相比較,云服務器更具有可擴展性與靈活性,所以云服務器受到越來越多的企業所使用,同時在各個領域中都…

實驗7 數據查詢(2)

一、實驗目的 學習SQL語言的定義、操縱功能熟悉通過SQL語言對數據庫進行查詢操作,包括單表查詢、多表查詢、嵌套查詢、集合查詢 二、實驗軟件 MySQL三、實驗內容和要求 給定四個關聯表,其定義和數據加載如下: 學生表 Student create tab…

Cesium中實現圖層組

圖層組 某天領導找我,說業務中可能存在多個影像服務為一個圖層組,并且需要同時加載和同時在圖層列表中上下移動的需求。 例如一些專題地圖,包含所有學校、醫院、公交站等圖層,而這些圖層都是單獨發布的。 在 Cesium 中確實存在…

前端與嵌入式開發通信之QWebChannel(Qt)

前端與嵌入式開發通信之QWebChannel 最近開發中需要用到和c開發的操作臺進行通信的的需求,就找到了這個技術,記錄一下 首先需要安裝導入 qwebchannel npm i qwebchannel import { QWebChannel } from "qwebchannel"; 初始化qwebchannel并封…

myeclipse開發ssm框架項目圖書管理系統 mysql數據庫web計算機畢業設計項目

摘 要 隨著計算機的廣泛應用,其逐步成為現代化的標志。圖書館的信息量也會越來越大,因此需要對圖書信息、借書信息、還書信息等進行管理,及時了解各個環節中信息的變更,要對因此而產生的單據進行及時的處理,為了提高高…

vue3 兩個組件之間傳值

Props 父組件可以通過 props 將數據傳遞給子組件。這是最常見的組件間通信方式 <!-- 父組件 --><template><ChildComponent :message"parentMessage" /></template><script>import ChildComponent from ./ChildComponent.vue;export…

Linux-shell編程入門基礎

文章目錄 前言Shell編程bash特性shell作用域變量環境變量$特殊變量$特殊狀態變量 $特殊符號(很重要)其他內置shell命令shell語法的子串截取統計 指令執行時間練習shell特殊擴展變量父子shell的理解內置和外置命令區別 數值計算雙括號(())運算letexprexpr模式匹配 bcawk中括號 s…

MySQL InnoDB事務隔離的幾種級別

MySQL InnoDB是一種支持事務的存儲引擎&#xff0c;提供了多種事務隔離級別&#xff0c;分別是&#xff1a;讀未提交&#xff08;READ UNCOMMITTED&#xff09;&#xff0c;讀已提交&#xff08;READ COMMITTED&#xff09;&#xff0c;可重復讀&#xff08;REPEATABLE READ&am…

數據結構(Java):Stack相關OJ習題

1、括號匹配問題 . - 力扣&#xff08;LeetCode&#xff09; 1.1 思路分析 根據棧的先進后出原則&#xff0c;我們可以這樣解決問題&#xff1a; 遍歷字符串&#xff0c;遇見左括號就將左括號push入棧&#xff1b;遇見右括號就pop出棧&#xff0c;將出棧的元素和該右括號比較…

最簡單的vue3組件之間傳值

localStorage 是 HTML5 引入的一個 Web Storage API 的一部分&#xff0c;它允許網頁在用戶的瀏覽器上存儲數據。localStorage 提供了一種持久化的本地存儲方案&#xff0c;數據不會因為瀏覽器關閉而丟失&#xff0c;除非用戶或腳本顯式地刪除它們。 localStorage 是一種非常實…

批量提取網頁表格內容至excel文件

問題背景 將網頁的表格內容&#xff08;5237個股票信息&#xff09;復制粘貼到excel文件中 網址&#xff1a;A股上市公司名單-A股上市公司名錄-A股上市公司大全-商業計劃書-可研報告-中商產業研究院數據庫-中商情報網 實現代碼 # 導入包 import pandas as pd import time# 創…

Android中為什么不直接activity調用到view,使用viewrootimpl去與底層溝通,而要追加一個phonewindow來管理呢?

在Android的架構設計中&#xff0c;Activity、PhoneWindow 和 ViewRootImpl 各自扮演著不同的角色&#xff0c;它們之間的協作是為了實現一個更加靈活、可擴展和易于管理的UI系統。不直接從Activity調用到View&#xff0c;而是引入PhoneWindow來管理&#xff0c;主要有以下幾個…

超越傳統:3D生物打印如何利用擴散創造奇跡?

超越傳統&#xff1a;3D生物打印如何利用擴散創造奇跡&#xff1f; 組織工程和再生醫學領域迫切需要能夠模擬人體組織結構和功能的體外模型和組織替代物。然而&#xff0c;傳統的體外模型和組織替代物往往難以滿足高度特異性、復雜性和功能性的要求。3D生物打印技術應運而生&a…

Base64文件流查看下載PDF方法-CSDN

問題描述 數票通等接口返回的PDF類型發票是以Base64文件流的方式返回的&#xff0c;無法直接查看預覽PDF發票&#xff0c; 處理方法 使用第三方在線工具&#xff1a;https://www.jyshare.com/front-end/61/ 在Html代碼框中粘貼如下代碼 <embed type"application/pd…

技術開發分享:商品詳情APP原數據實時接口代碼解析

商品詳情app端原數據實時接口代碼解析主要包括以下幾個步驟&#xff1a; 獲取商品ID&#xff1a;首先需要從淘寶的分享鏈接中提取商品ID&#xff0c;可以通過正則表達式匹配的方式獲取。 構建請求URL&#xff1a;根據商品ID構建請求URL&#xff0c;通常包括淘寶的商品詳情API地…

未來互聯網的新篇章:深度解析Web3技術

隨著技術的不斷演進&#xff0c;Web3正逐漸成為引領未來互聯網發展的關鍵驅動力。本文將深入探討Web3技術的核心概念、關鍵特征以及其對未來互聯網生態的深遠影響&#xff0c;旨在幫助讀者全面理解和把握這一新興技術的發展方向和潛力。 1. Web3的基本概念和演進 Web3并非簡單…

為什么鍵盤上F和J這兩個鍵有兩個凸起的橫線呢?

不知道小伙伴們有沒有注意過&#xff0c;我們常用的電腦鍵盤上&#xff0c;為什么F和J這兩個鍵總是有兩個凸起的橫線的呢&#xff1f; 首先&#xff0c;讓我們來回顧一下這位陪伴我們多年的老朋友——鍵盤。從最初的打字機到現在的機械鍵盤、薄膜鍵盤&#xff0c;鍵盤的形態和…

新書速覽|Vue.js 3.x+Express全棧開發:從0到1打造商城項目

《Vue.js 3.xExpress全棧開發&#xff1a;從0到1打造商城項目》 1 本書內容 《Vue.js 3.xExpress全棧開發 : 從0到1打造商城項目》是一本詳盡的全棧開發教程&#xff0c;旨在通過Vue.js和Express框架引導讀者從零開始構建一個完整的電商項目。內容覆蓋電商項目的基本結構&…