自主研發接口測試框架

測試任務:將以前完成的所有的腳本統一改寫為unitest框架方式

1、需求原型

1.1?框架目錄結構

V1.0:一般的設計思路分為配置層、腳本層、數據層、結果層,如下圖所示

V 2.0:加入驅動層testdriver

1.2?框架各層需要完成的工作

1、配置層:config

設計配置文件.csv:由配置文件來控制此次測試執行,以及需要調用哪些測試腳本。

2、腳本層:script

ind_interface:存放獨立接口測試腳本、一個類中有一個測試方法、完成一個接口的測試。

mul_interface:存放接口聯調測試腳本、一個類中有多個測試方法、完成接口聯調的測試。

注意:腳本文件的名稱有一定的規范性。

3、測試數據文件層:testdatafile

ind_interface:存放獨立接口測試腳本對應的測試數據文件

mul_interface:存放接口聯調測試腳本對應的測試數據文件

注意:數據文件的命名?ind_、 mul_

4、測試報告文件層:testresultfile

fram_result:測試框架報告

ind_interface:存放獨立接口測試報告文檔

mul_interface:存放聯調接口測試報告文檔

注意:報告文件命名?fram_? 、ind_rep_? 、mul_rep_

5、框架驅動層

存放測試框架的驅動程序

1.3??框架的測試執行過程

1、由框架驅動層中的框架驅動程序運行。

2、依據配置層相關的設置是否執行及執行順序,調用對應腳本層的程序,進行執行。

3、相關的腳本運行時,如果需要測試數據,則在數據層進行文件的讀取。

4、測試腳本執行結束后,會寫明相關的測試報告文件,并存入測試報告層。

1.4?最終目標

2、測試框架前期準備

1、依據框架需求搭建框架項目及模塊

2、接口測試數據文件向框架轉移

3、框架腳本的研發

3.1 重構測試腳本

更新用戶信息接口測試,在框架對應的分層下創建新的python文件,注意符合命名規范,test_updateuser

3.1.1??更新用戶信息接口V1.0

V1.0版本
?? ?S1:導入unittest
?? ?S2:定義一個類,繼承unittest
?? ?S3:傳入固定的接口測試數據(一組)
?? ?S4:assert進行判斷

# 對更新用戶信息的腳本進行測試,使用unittest框架技術,V1.0版本,傳入一組固定的測試數據,進行接口測試
# 接口說明:
# 接口訪問地址:   http://localhost:8080/jwshoplogin/user/update_information.do
# 接口傳入參數:1、email: 2、phone:3、answer: 4、question:
# 接口預期返回結果:
# 1、email已存在, 請更換email再嘗試更新 2、更新個人信息成功  3、更新個人信息失敗"
#*****************************************************************************
# 腳本實現:
# 導入相關類庫
import unittest
import requests# 定義測試類,繼承unittest框架
class test_updateuser(unittest.TestCase):# 通過setup方法實現登錄接口的調用def setUp(self):url="http://localhost:8080/jwshoplogin/user/login.do"userinfo={"username":"程勇4","password":"123456"}response=requests.post(url,data=userinfo)self.sessionID=dict(response.cookies)['JSESSIONID']print(self.sessionID)# V1.0版本,傳入一組固定的測試數據,進行接口測試def test_case1(self):# 傳入指定的接口測試數據url="http://localhost:8080/jwshoplogin/user/update_information.do"userinfo={"email":"1234561@qq.com","phone":"13311095555","question": "蘋果","answer":"最喜歡的水果"}session={"JSESSIONID":self.sessionID}# 進行接口調用response=requests.post(url,data=userinfo,cookies=session).textprint(response)self.assertIn("更新個人信息成功",response)def tearDown(self):passif __name__ == '__main__':unittest.main()

3.1.2? 更新用戶信息接口V2.0

S1:是否需要測試數據文件
?? ?對測試數據文件進行設計
?? ??? ?測試用例的設計
?? ?更新接口測試分析
?? ??? ?正常
?? ??? ??? ?只更新一個數據
?? ??? ??? ??? ?1、只更新email
?? ??? ??? ??? ??? ?email不沖突
?? ??? ??? ??? ?2、只更新phone
?? ??? ??? ??? ?3、只更新answer
?? ??? ??? ??? ?4、只更新問題question
?? ??? ??? ?更新更多數據
?? ??? ??? ??? ?更新2組數據
?? ??? ??? ??? ??? ?更新email和phone
?? ??? ??? ??? ??? ??? ?email不沖突
?? ??? ??? ??? ??? ?更新question和answer
?? ??? ??? ??? ??? ?更新...
?? ??? ??? ??? ?更新3組數據
?? ??? ??? ??? ??? ?更新email和phone和question
?? ??? ??? ?更新全部數據
?? ??? ??? ??? ?1、email
?? ??? ??? ??? ??? ?email不沖突
?? ??? ??? ??? ?2、phone
?? ??? ??? ??? ?3、answer
?? ??? ??? ??? ?4、question
?? ??? ?異常
?? ??? ??? ?1、未登錄更新
?? ??? ??? ?2、郵箱沖突
?? ??? ??? ?3、電話的長度不正確
?? ??? ??? ?4、問題為空
?? ??? ??? ?5、答案為空
S2:把數據文件中的內容傳入腳本

# V2.0 通過csv文件進行更新測試數據的讀取# 接口說明:
# 接口訪問地址:   http://localhost:8080/jwshoplogin/user/update_information.do
# 接口傳入參數:1、email: 2、phone:3、answer: 4、question:
# 接口預期返回結果:
# 1、email已存在, 請更換email再嘗試更新 2、更新個人信息成功  3、更新個人信息失敗"
#*****************************************************************************
# 腳本實現:
# 導入相關類庫
import os
import unittest
import requests
import csv# 定義測試類,繼承unittest框架
class test_updateuser_V2(unittest.TestCase):# 通過setup方法實現登錄接口的調用def setUp(self):# # 從csv測試數據文件中讀取url和登錄測試數據path=os.getcwd()print(path)# p1=os.path.abspath(os.path.dirname(path)+os.path.sep+".")# print(p1)p2 = os.path.abspath(os.path.dirname(path) + os.path.sep + "..")self.fpath=p2+"\\testdatafile\\ind_interface\\test_updateuser_V21.csv"# print(fpath)userinfo={}file1=open(self.fpath,'r')table=csv.reader(file1)for row in table:print(row[0])url=row[0]userinfo[row[3]]=row[4]userinfo[row[5]]=row[6]print(userinfo)break  # 讀完一行就退出response=requests.post(url,data=userinfo)self.sessionID=dict(response.cookies)['JSESSIONID']print(self.sessionID)# V2.0版本,讀取指定的測試數據文件中對應的內容,進行接口測試def test_case1(self):# 打開對應的文件file1=open(self.fpath,'r')# 如何從指定行開始讀取table=csv.reader(file1)userinfo={}num=0for row in table:num=num+1if num>1:url=row[0]expresult=row[2]j=int(row[1])for i in range(3,j*2+3,2):userinfo[row[i]]=row[i+1]print(userinfo)session={"JSESSIONID":self.sessionID}print(session)response=requests.post(url,data=userinfo,cookies=session).textprint(response)userinfo={}self.assertIn("更新個人信息成功",response)if __name__ == '__main__':unittest.main()

工作小結:需要注意的事項
?? ?1、文件位置的讀取
?? ??? ?import os
?? ??? ?獲取當前路徑
?? ??? ??? ?path=os.getcwd()
?? ??? ?獲取上一級路徑
?? ??? ??? ?p1=os.path.abspath(os.path.dirname(path)+os.path.sep+".")
?? ??? ?獲取前兩級路徑
?? ??? ??? ?p2 = os.path.abspath(os.path.dirname(path) + os.path.sep + "..")
?? ?2、測試數據文件的設計
?? ??? ?可以把固定的內容放在前面的列中
?? ??? ?把不定項的參數可以放在后面的列中
?? ??? ?通過手工加入參數個數。方便進行循環讀取
?? ??? ?不要用拖拽的方式拷貝數據,防止數據出錯
?? ??? ?先設計正確的數據,保證腳本調試通過
?? ??? ?再設計錯誤的數據
?? ??? ??? ?也可以考慮放在不同的文件
?? ?3、從指定的某一行開始讀取內容
?? ??? ?num=0
?? ??? ?for row in table:
?? ??? ?追加
?? ??? ??? ?num=num+1
?? ??? ?例如:我們想從第四行讀起
?? ??? ??? ?if num>4
?? ??? ??? ?從指定的行開始進行讀取

3.1.3??更新用戶信息接口V3.0

生成HTML格式的測試報告

步驟
?? ?1、下載HTML格式的測試報告
?? ??? ?步驟
?? ??? ??? ?1、下載HTMLTestRunner.py
?? ??? ??? ??? ?http://tungwaiyip.info/software/HTMLTestRunner.html
?? ??? ??? ?2、拷貝到項目文件夾下
?? ??? ??? ?3、導入HTMLReport包
?? ??? ??? ??? ?from HTMLTestRunner import HTMLTestRunner
?? ??? ??? ?4、生成測試報告的腳本
?? ??? ??? ??? ?腳本
?? ??? ??? ??? ??? ?做好測試執行前的準備工作
?? ??? ??? ??? ??? ??? ?指定要執行的測試用例
?? ??? ??? ??? ??? ?S1:以wb(二進制寫文件)模式打開測試報告文件
?? ??? ??? ??? ??? ?S2:使用HTMLTestRunner方法創建HTML文件
?? ??? ??? ??? ??? ?S3:執行測試
?? ??? ??? ??? ??? ?S4:關閉文件
?? ?工作小結
?? ??? ?在main()函數中來生成html的測試報告
?? ??? ??? ?1、獲取測試報告文件應放置的路徑
?? ??? ??? ?2、給定具體的測試報告文件名
?? ??? ??? ?3、以wb的方式打開文件
?? ??? ??? ?4、設置測試套,并添加要 測試的方法
?? ??? ??? ?5、生成HTML報告
?? ??? ??? ??? ?runner=HTMLTestRunner(stream=file,title="標題",description="描述")
?? ??? ??? ?6、調用runner對象執行測試套
?? ??? ??? ??? ?runner.run(suite)
?? ??? ??? ?7、關閉測試報告文件

# v3.0  創建HTML格式的測試報告文件# 接口說明:
# 接口訪問地址:   http://localhost:8080/jwshoplogin/user/update_information.do
# 接口傳入參數:1、email: 2、phone:3、answer: 4、question:
# 接口預期返回結果:
# 1、email已存在, 請更換email再嘗試更新 2、更新個人信息成功  3、更新個人信息失敗"
#*****************************************************************************
# 腳本實現:
# 導入相關類庫
import os
import unittest
import requests
import csv
from HTMLTestRunner import HTMLTestRunner# 定義測試類,繼承unittest框架
class test_updateuser_V3(unittest.TestCase):# 通過setup方法實現登錄接口的調用def setUp(self):# # 從csv測試數據文件中讀取url和登錄測試數據path=os.getcwd()# print(path)# p1=os.path.abspath(os.path.dirname(path)+os.path.sep+".")# print(p1)p2 = os.path.abspath(os.path.dirname(path) + os.path.sep + "..")print(p2)self.fpath=p2+"\\testdatafile\\ind_interface\\test_updateuser_V21.csv"# print(fpath)userinfo={}file1=open(self.fpath,'r')table=csv.reader(file1)for row in table:print(row[0])url=row[0]userinfo[row[3]]=row[4]userinfo[row[5]]=row[6]print(userinfo)breakresponse=requests.post(url,data=userinfo)self.sessionID=dict(response.cookies)['JSESSIONID']print(self.sessionID)def test_case1(self):# 打開對應的文件file1=open(self.fpath,'r')# 如何從指定行開始讀取table=csv.reader(file1)userinfo={}num=0for row in table:num=num+1if num>1:url=row[0]expresult=row[2]j=int(row[1])for i in range(3,j*2+3,2):userinfo[row[i]]=row[i+1]print(userinfo)session={"JSESSIONID":self.sessionID}print(session)response=requests.post(url,data=userinfo,cookies=session).textprint(response)userinfo={}self.assertIn("更新個人信息成功",response)if __name__ == '__main__':# unittest.main()# 定義測試報告文件path=os.getcwd()p2 = os.path.abspath(os.path.dirname(path) + os.path.sep + "..")filename=p2+"\\testresultfile\\ind_interface\\test_updatauser_report.html"# 加載測試套suite=unittest.TestSuite()suite.addTest(test_updateuser_V3("test_case1"))# 以wb的方式打開文件file=open(filename,"wb")# 調用HTML測試報告的報告生成測試報告runner=HTMLTestRunner(stream=file,title="更新用戶接口測試",description="接口測試報告")print("測試報告")runner.run(suite)file.close()

3.1.4 遇到問題分析

更新用戶的接口,需要先進行登錄
? ?1、測試場景1:未登錄,進行更新
?? ??? ?提示:用戶未登錄
? ?2、 測試場景2:先登錄,再進行更新
?? ??? ?需要解決的問題
?? ??? ??? ?解決方案
?? ??? ??? ??? ?方案1
?? ??? ??? ??? ??? ?在當前的測試類中,追加一個setup方法
?? ??? ??? ??? ??? ??? ?登錄的測試腳本寫入setup中
?? ??? ??? ??? ??? ??? ?用的比較多
?? ??? ??? ??? ?方案2:
?? ??? ??? ??? ??? ?在當前的測試類中,追加一個新的測試方法
?? ??? ??? ??? ??? ??? ?test_case1
?? ??? ??? ??? ??? ??? ??? ?完成登錄的調用
?? ??? ??? ??? ??? ??? ?把原來的更新測試方法改為test_case2
?? ??? ??? ??? ?方案3:
?? ??? ??? ??? ??? ?在當前的測試類及測試方法中
?? ??? ??? ??? ??? ??? ?前面追加一段代碼
?? ??? ??? ??? ??? ??? ??? ?完成登錄的調用
?? ??? ??? ??? ?方案4:
?? ??? ??? ??? ??? ?另外創建一個腳本文件,來實現登錄,通過測試框架進行接口測試聯調
? ? 3、遇到的問題
?? ??? ?即使已經發送了登錄請求,在調用更新接口時提示"用戶未登錄"
?? ?問題分析
?? ??? ?sessionID
?? ??? ??? ?服務器端發送給客戶端一個隨機的認證號碼
?? ??? ?方法1:
?? ??? ??? ?使用postman工具
?? ??? ??? ??? ?先登錄
?? ??? ??? ??? ?再修改個人信息是否可行
?? ??? ?方法2:
?? ??? ??? ?通過工具獲取JESSIONID
?? ??? ??? ?再把相關的JESSION傳入代碼中
?? ??? ??? ?問題:
?? ??? ??? ??? ?1、JessionID有時間限制
?? ??? ??? ??? ?2、如果關閉tomcat服務重新啟動,session自動失效了
?? ??? ??? ??? ?3、用工具過去的session ID和登錄腳本沒有任何關系
?? ??? ?方法3
?? ??? ??? ?在用戶登錄之后獲取到對應的JESSIONID
?? ??? ??? ??? ?dict(response.cookie)["JSESSIONID"]
?? ??? ??? ?把這個JESSIONID當成傳輸參數傳遞給更新腳本
?? ??? ??? ??? ?self.sessionID
?? ??? ??? ?要解決的問題
?? ??? ??? ??? ?如何在登錄后獲取對應的JESSIONID

4、設計及實現框架驅動程序

4.1 框架驅動程序V1.0

在配置文件中寫入一個測試文件進行執行


?? ?S1:設計一個配置文件
?? ??? ?腳本名稱
?? ??? ?腳本所在路徑
?? ?S2:讀取配置文件的內容
?? ?S3:找到對應的腳本文件進行調用
?? ?工作小結
?? ??? ?工作思路
?? ??? ??? ?由簡到繁
?? ??? ??? ??? ?選擇一種框架調用模式
?? ??? ??? ??? ??? ?defaultloader方式
?? ??? ??? ??? ??? ??? ?unittest.defaultTestLoader.discover(路徑,pattern=腳本名稱)
?? ??? ??? ??? ?先用常量值進行腳本的調試
?? ??? ??? ??? ?在把常量值改為變量值
?? ??? ??? ??? ??? ?逐個替換
?? ??? ??? ??? ??? ?不要全部替換
?? ??? ??? ??? ?再把變量改為從文件讀取
?? ??? ??? ?發現問題,添加print語句進行分析
?? ??? ??? ??? ?問題:路徑不一致
?? ??? ??? ??? ??? ?級別關系發生了變化
?? ??? ??? ??? ??? ??? ?print(path)
?? ??? ??? ??? ?調整腳本中對應的路徑級別

# 測試框架驅動程序V1.0版本
# 只是從配置文件中讀取一個腳本文件進行調用
import csv
import unittest
if __name__ == '__main__':# 指定對應的腳本路徑,從csv文件中讀取相關路徑和文件名file=open("D:\python\interfacefram\config\config1.csv","r")table=csv.reader(file)num=0for row in table:if num>0:testdir=row[0]fname=row[1]print(testdir,fname)num=num+1discover=unittest.defaultTestLoader.discover(testdir,pattern=fname)# # 定義一個運行對象runner=unittest.TextTestRunner()runner.run(discover)

4.2?框架驅動程序V2.0

在配置文件中寫入兩個測試文件進行執行

S1:修改配置文件

S2:進行腳本的修改

# 測試框架驅動程序V2.0版本
# 只是從配置文件中讀取兩個腳本文件進行調用
import csv
import unittest
if __name__ == '__main__':# 指定對應的腳本路徑,從csv文件中讀取相關路徑和文件名file=open("D:\python\interfacefram\config\config2.csv","r")table=csv.reader(file)num=0for row in table:if num>0:testdir=row[0]fname=row[1]print(testdir,fname)discover = unittest.defaultTestLoader.discover(testdir, pattern=fname)# # 定義一個運行對象runner = unittest.TextTestRunner()runner.run(discover)num=num+1

4.3?框架驅動程序V3.0

在配置文件中針對不同的運行狀態進行文件的執行
?? ?S1:升級改造配置文件
?? ??? ?加入一狀態列
?? ??? ??? ?狀態表示
?? ??? ??? ??? ?0/1不運行/運行
?? ??? ??? ??? ?RUN/NORUN
?? ??? ??? ??? ?No/Yes
?? ?S2:腳本的調整
?? ??? ?加入條件判斷

# v3.0  創建HTML格式的測試報告文件# 接口說明:
# 接口訪問地址:   http://localhost:8080/jwshoplogin/user/update_information.do
# 接口傳入參數:1、email: 2、phone:3、answer: 4、question:
# 接口預期返回結果:
# 1、email已存在, 請更換email再嘗試更新 2、更新個人信息成功  3、更新個人信息失敗"
#*****************************************************************************
# 腳本實現:
# 導入相關類庫
import os
import unittest
import requests
import csv
from HTMLTestRunner import HTMLTestRunner# 定義測試類,繼承unittest框架
class test_updateuser_V3(unittest.TestCase):# 通過setup方法實現登錄接口的調用def setUp(self):# # 從csv測試數據文件中讀取url和登錄測試數據path=os.getcwd()# print(path)# p1=os.path.abspath(os.path.dirname(path)+os.path.sep+".")# print(p1)p2 = os.path.abspath(os.path.dirname(path) + os.path.sep + "..")print(p2)self.fpath=p2+"\\testdatafile\\ind_interface\\test_updateuser_V21.csv"# print(fpath)userinfo={}file1=open(self.fpath,'r')table=csv.reader(file1)for row in table:print(row[0])url=row[0]userinfo[row[3]]=row[4]userinfo[row[5]]=row[6]print(userinfo)breakresponse=requests.post(url,data=userinfo)self.sessionID=dict(response.cookies)['JSESSIONID']print(self.sessionID)def test_case1(self):# 打開對應的文件file1=open(self.fpath,'r')# 如何從指定行開始讀取table=csv.reader(file1)userinfo={}num=0for row in table:num=num+1if num>1:url=row[0]expresult=row[2]j=int(row[1])for i in range(3,j*2+3,2):userinfo[row[i]]=row[i+1]print(userinfo)session={"JSESSIONID":self.sessionID}print(session)response=requests.post(url,data=userinfo,cookies=session).textprint(response)userinfo={}self.assertIn("更新個人信息成功",response)if __name__ == '__main__':# unittest.main()# 定義測試報告文件path=os.getcwd()p2 = os.path.abspath(os.path.dirname(path) + os.path.sep + "..")filename=p2+"\\testresultfile\\ind_interface\\test_updatauser_report.html"# 加載測試套suite=unittest.TestSuite()suite.addTest(test_updateuser_V3("test_case1"))# 以wb的方式打開文件file=open(filename,"wb")# 調用HTML測試報告的報告生成測試報告runner=HTMLTestRunner(stream=file,title="更新用戶接口測試",description="接口測試報告")print("測試報告")runner.run(suite)file.close()

4.4?框架驅動程序V4.0

按照測試人員指定的順序來執行相應的測試文件
?? ?S1:升級改造配置文件
?? ??? ?加入執行順序
?? ?S2:修改腳本

# v4.0  執行任意指定路徑下的任意相關命名的python測試腳本
# 腳本實現:
import unittest
import requestsif __name__ == '__main__':#**********************************************#以文件的方式來進行框架的執行#聲明文件所在路徑testdir='./'discover=unittest.defaultTestLoader.discover(testdir,pattern='test_updateser_v1.py')#聲明測試運行對象runner=unittest.TextTestRunner()runner.run(discover)

4.5?按照測試順序和是否運行來確定要執行哪些測試V5.0

其實框架難的地方也就是在驅動的處理這。

按照測試順序和是否運行來確定要執行哪些測試
?? ?復雜程序的編寫思路
?? ??? ?分解任務,逐個擊破
?? ??? ?逐步合并,分段調試
?? ??? ?腳本設計思路
?? ??? ??? ?突破點
?? ??? ??? ??? ?python提供的數據字典的排序
?? ??? ??? ??? ??? ?腳本名
?? ??? ??? ??? ??? ?腳本路徑
?? ??? ??? ??? ??? ?執行順序
?? ??? ??? ??? ??? ?是相關的一組數據,不是無關的
?? ??? ??? ??? ??? ?import operator
?? ??? ??? ??? ??? ?sorted(數據字典,key=operator.itemgetter(下標或標簽))


?? ??? ??? ?試驗1
?? ??? ??? ??? ?給定一些字典的具體數據
?? ??? ??? ??? ??? ?dic={"testA":3,"testC":1,"testB:4,"testD:2}
?? ??? ??? ??? ??? ?dicn=sorted(dic.items(),key=operator.itemgetter(1))
?? ??? ??? ??? ??? ?print(dicn)
?? ??? ??? ??? ??? ?for fn in dicn:
?? ??? ??? ??? ??? ?print(fn[0])
?? ??? ??? ??? ?排序算法是否可行
?? ??? ??? ?試驗2
?? ??? ??? ??? ?把csv配置文件的一行內容導入到字典中
?? ??? ??? ??? ?代碼部分實現
?? ??? ??? ??? ??? ? ? ?file=open("D:\python\interfacefram\config\config4.csv","r")
?? ??? ??? ??? ??? ? ? ?table=csv.reader(file)
?? ??? ??? ??? ??? ? ? ?dic={}
?? ??? ??? ??? ??? ? ? ?listd=[]
?? ??? ??? ??? ??? ? ? ?line=0
?? ??? ??? ??? ??? ? ? ?for row in table:
?? ??? ??? ??? ??? ??? ?if line>0:
?? ??? ??? ??? ??? ??? ??? ?跳過第一行
?? ??? ??? ??? ??? ??? ?#把文件中讀取的數據放入字典
?? ??? ??? ??? ??? ??? ??? ?dic={}
?? ??? ??? ??? ??? ??? ??? ??? ?每讀一行,字典清空一次
?? ??? ??? ??? ??? ??? ??? ?dic[row[1]]=row[0]
?? ??? ??? ??? ??? ??? ??? ?dic["num"]=int(row[3])
?? ??? ??? ??? ??? ??? ??? ??? ?文件執行順序
?? ??? ??? ??? ??? ??? ??? ?print("dicn",dicn)
?? ??? ??? ?試驗3
?? ??? ??? ??? ?把csv配置文件的多行內容導入到字典列表中
?? ??? ??? ??? ??? ?listd=[]
?? ??? ??? ??? ??? ?line=line+1
?? ??? ??? ??? ??? ?if dic!={}:
?? ??? ??? ??? ??? ??? ? listd.append(dic)
?? ??? ??? ??? ??? ?dicn=sorted(listd,key=operator.itemgetter("num"))


?? ??? ??? ?試驗4
?? ??? ??? ??? ?檢驗讀取順序是否正確,能否正確執行
?? ??? ??? ??? ??? ?for i in range(0,line-1):
?? ??? ??? ??? ??? ?n=0
?? ??? ??? ??? ??? ?for content in dicn[i].items():
?? ??? ??? ??? ??? ??? ?if n==0:
?? ??? ??? ??? ??? ??? ??? ?fname=content[0]
?? ??? ??? ??? ??? ??? ??? ?fdir=content[1]
?? ??? ??? ??? ??? ??? ??? ?print("fname",fname,"fdir",fdir)
?? ??? ??? ??? ??? ??? ??? ?# 調用腳本程序進行執行
?? ??? ??? ??? ??? ??? ??? ?discover = unittest.defaultTestLoader.discover(fdir, pattern=fname)
?? ??? ??? ??? ??? ??? ??? ?# # 定義一個運行對象
?? ??? ??? ??? ??? ??? ??? ?runner = unittest.TextTestRunner()
?? ??? ??? ??? ??? ??? ??? ?runner.run(discover)
?? ??? ??? ??? ??? ??? ?n=n+1
?? ??? ??? ?試驗5
?? ??? ??? ??? ?加入對狀態的判斷
?? ??? ??? ??? ??? ?解決問題1
?? ??? ??? ??? ??? ??? ?把狀態內容也要追加到字典列表中
?? ??? ??? ??? ??? ??? ??? ?dic["state"]=row[2]
?? ??? ??? ??? ??? ?解決問題2
?? ??? ??? ??? ??? ??? ?在確定執行前,把狀態要取出來
?? ??? ??? ??? ??? ??? ?從字典列表中取出
?? ??? ??? ??? ??? ?代碼
?? ??? ??? ??? ??? ??? ?if n==2:
?? ??? ??? ??? ??? ??? ??? ?state=content[1]
?? ??? ??? ??? ??? ??? ??? ?# print("state",state)
?? ??? ??? ??? ??? ??? ??? ?if state=="Yes":
?? ??? ??? ??? ??? ??? ??? ??? ?# 調用腳本程序進行執行
?? ??? ??? ??? ??? ??? ??? ??? ? print("最終運行的程序",fname)
?? ??? ??? ??? ??? ??? ??? ??? ?discover = unittest.defaultTestLoader.discover(fdir, pattern=fname)
?? ??? ??? ??? ??? ??? ??? ??? ? # # 定義一個運行對象
?? ??? ??? ??? ??? ??? ??? ??? ? runner = unittest.TextTestRunner()
?? ??? ??? ??? ??? ??? ??? ??? ?runner.run(discover)
?? ??? ??? ??? ?列表字典
?? ??? ??? ??? ??? ?[{"testa":"d:\\sdfs","num":3,"state":"Yes"},{"testa":"d:\\sdfs","num":1,"state":"Yes"},{"testa":"d:\\sdfs","num":2,"state":"Yes"}]

# V5.0版本  把所有配置文件中的內容全部進行讀取#***********************************V5.0驅動腳本程序*******************************************************
import unittest
import csv
import operator
if __name__ == '__main__':# 打開對應的配置文件進行讀取# 以只讀方式打卡file=open("D:\python\interfacefram\config\config4.csv","r")table=csv.reader(file)dic={}listd=[]# line=len(open("D:\python\interfacefram\config\config4.csv").readlines())line=0print(line)for row in table:print(row[0])if line>0:# 把文件中讀取的數據放入字典dic={}dic[row[1]]=row[0]dic["num"]=int(row[3])#把腳本運行狀態加入字典數據dic["state"]=row[2]print("dic",dic)line=line+1if dic!={}:listd.append(dic)# print(listd)print("n行數=",line)dicn=sorted(listd,key=operator.itemgetter("num"))print("dicn",dicn)for i in range(0,line-1):n=0for content in dicn[i].items():if n==0:print("content",content)fname=content[0]fdir=content[1]print("fname",fname,"fdir",fdir)if n==2:print("content2", content)state=content[1]# print("state",state)if state=="Yes":# 調用腳本程序進行執行print("最終運行的程序",fname)discover = unittest.defaultTestLoader.discover(fdir, pattern=fname)# # 定義一個運行對象runner = unittest.TextTestRunner()runner.run(discover)n=n+1

5、接口測試的總結

5.1 自主框架總體框圖設計

5.2 接口測試的得與失

1、從獨立接口測試腳本->接口聯調測試腳本->接口測試框架都是獨立研發的,不僅該項目可以用,也可以移植復用到其他項目中。

2、測試框架的技術不僅可以用于接口測試,其他以python+unittest+自動化測試的項目都可以繼續沿用,具有較強的通用性。

3、一定程度上降低了由于界面或需求不斷變更而造成的測試腳本修改或返工。

4、接口測試開展的有些晚,建議今后的接口測試最好安排在接口代碼完成后就可以開始。

5、接口測試的相關設計文檔還不是很完備,建議進行完善,避免測試的誤解和返工。

6、接口測試的聯調設計需要產品和開發的配合,確保設計的聯調流程和實際應用相一致。

5.3 接口測試工作流程總結

S1:解讀接口設計,形成接口測試文檔。

S2:使用postman工具快速學習接口并進行首輪接口冒煙測試。

S3:獨立接口測試腳本的設計及研發。

S4:接口聯調腳本的設計及研發。

S5:測試框架的設計及研發。

S6:接口測試工作的改進及優化

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

???????撥云見日終有時,學無止境勤可達。

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

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

相關文章

Fast DDS library windows 下源碼編譯(cmake)

目錄 編譯環境: 編譯需要的源碼文件: Fast DDS編譯: 注意事項: 參考文檔: 基于Fast DDS 的源碼來編譯相關的庫,然后可以通過python 來調用庫文件實現dds 數據通信,本文就詳細的介紹編譯過程…

機器學習筑基篇,容器調用顯卡計算資源,Ubuntu 24.04 快速安裝 NVIDIA Container Toolkit!...

[ 知識是人生的燈塔,只有不斷學習,才能照亮前行的道路 ] Ubuntu 24.04 安裝 NVIDIA Container Toolkit 什么是 NVIDIA Container Toolkit? 描述:NVIDIA Container Toolkit(容器工具包)使用戶能夠構建和運行 GPU 加速的容器,該工具包括一個容器運行時庫和實用程序,用于自動…

石油巨頭受沖擊!埃克森美孚、BP接連發出盈利預警

KlipC報道:近日,BP(英國石油)預計其第二季度將面臨10億至20億美元的減值費用,并發出警告稱其煉油利潤率“大幅下降”,石油交易收益預計出現疲軟。消息公布后,其股價下跌超4%。 由于中間餾分油利…

JavaScript(8)——函數

函數 function,是被設計執行特定任務的代碼塊。 函數可以把具有相同或相似邏輯的代碼包裹起來,通過函數調用執行這些代碼,這么做的優勢有利于精簡代碼方便復用。類似于alert(),prompt()和console.log(),這些都是js函數,不過已經…

STL(一)

書寫形式:string (const string& str, size_t pos, size_t len npos); 舉例: int main(){ string url("https://mp.csdn.net/mp_blog/creation/editor?spm1000.2115.3001.4503") string sub1(url,0,5);//從下標為0開始向后5個字符&…

如何在 Python 中創建一個類似于 MS 計算器的 GUI 計算器

問題背景 假設我們需要創建一個類似于微軟計算器的 GUI 計算器。這個計算器應該具有以下功能: 能夠顯示第一個輸入的數字。當按下運算符時,輸入框仍顯示第一個數字。當按下第二個數字時,第一個數字被替換。 解決方案 為了解決這個問題&am…

華為OD機考題(HJ108 求最小公倍數)

前言 經過前期的數據結構和算法學習,開始以OD機考題作為練習題,繼續加強下熟練程度。 描述 正整數A和正整數B 的最小公倍數是指 能被A和B整除的最小的正整數值,設計一個算法,求輸入A和B的最小公倍數。 數據范圍:1≤…

Spring中的適配器模式和策略模式

1. 適配器模式的應用 1.1適配器模式(Adapter Pattern)的原始定義是:將一個類的接口轉換為客戶期望的另一個接口,適配器可以讓不兼容的兩個類一起協同工作。 1.2 AOP中的適配器模式 在Spring的AOP中,使用Advice&#…

【北京迅為】《i.MX8MM嵌入式Linux開發指南》-第一篇 嵌入式Linux入門篇-第十九章 Linux 工具之make 工具和 makefile 文件

i.MX8MM處理器采用了先進的14LPCFinFET工藝,提供更快的速度和更高的電源效率;四核Cortex-A53,單核Cortex-M4,多達五個內核 ,主頻高達1.8GHz,2G DDR4內存、8G EMMC存儲。千兆工業級以太網、MIPI-DSI、USB HOST、WIFI/BT…

集群管理腳本

虛擬機集群管理腳本 文章目錄 虛擬機集群管理腳本一、遠程調用腳本(remote_call.sh)二、遠程復制目錄腳本(remote_copy.sh) 一、遠程調用腳本(remote_call.sh) 如果有傳命令參數,則執行該命令;如果沒有傳命令參數,則不執行。 #!/bin/bashcm…

【嵌入式Linux】<知識點> GDB調試(更新中)

文章目錄 前言 一、GDB調試預備工作 二、GDB的啟動與退出 三、GDB中查看源代碼 四、GDB斷點操作 五、GDB調試指令 前言 在專欄【嵌入式Linux】應用開發篇_Linux打工仔的博客中,我們已經寫了大量的源程序。但是在調試這些程序時我們都是通過printf大法和肉眼除…

評估指標:精確率(Precision)、召回率(Recall)、F1分數(F1 Score)

評估指標:精確率(Precision)、召回率(Recall)、F1分數(F1 Score) 前言相關介紹1. 準確率(Accuracy)2. 精確率(Precision)3. 召回率(Re…

Cadence23打開與關閉飛線,修改位號絲印大小

打開與關閉所有飛線: 顯示部分飛線: 單獨顯示網絡飛線尤為好用,點擊上圖中的網絡,之后鼠標點擊器件中你想高亮的網絡即可單獨打開部分飛線。 這里的關閉部分網絡的飛線也很好用,可以臨時關閉討厭的GND飛線&#xff1a…

掌握Postman的API請求模板:一鍵生成,效率倍增

📘 掌握Postman的API請求模板:一鍵生成,效率倍增 Postman是API開發和測試的瑞士軍刀,而其請求模板功能更是提升工作效率的利器。API請求模板允許用戶定義一組可重用的請求配置,從而快速生成和發送API請求。本文將深入…

virturalBox+K8S部署jaeger-all-in-one

pod的yaml如下:這里使用的是主機host模式 apiVersion: apps/v1 kind: Deployment metadata:name: jaegerlabels:app: jaeger spec:replicas: 1selector:matchLabels:app: jaegertemplate:metadata:labels:app: jaegerspec:hostNetwork: truecontainers:- name: jae…

TF卡病毒是什么?如何防范和應對?

在存儲芯片及存儲卡領域,TF卡病毒是一個備受關注的話題。在本文中,拓優星辰將詳細解釋TF卡病毒的含義、來源以及如何防范和應對這一問題,幫助客戶更好地了解和處理TF卡病毒的風險。 1. TF卡病毒的含義 TF卡病毒是指針對TF存儲卡(T…

05:定時器中斷

中斷 1、定時器T0中斷2、案例:通過定時器T0中斷來實現燈間隔1s亮滅 1、當中央處理機CPU正在處理某件事的時候外界發生了緊急事件請求,要求CPU暫停當前的工作,轉而去處理這個緊急事件,處理完以后,再回到原來被中斷的地方…

安裝lap和cython_bbox失敗了很多次!!!終于被我發現了!

先說 lap 試了很多種方式,pip install lap / conda install -c conda-forge lap … 全失敗了后面發現 lap 不支持 python > 3.9 的版本使用 pip install lapx 成功! cython_bbox 更難了 一直提示缺少MicroSoft C 14.0 … 大家有需要自行下載&#x…

[PaddlePaddle飛槳] PaddleDetection-通用目標檢測-小模型部署

PaddleDetection的GitHub項目地址 推薦環境: PaddlePaddle > 2.3.2 OS 64位操作系統 Python 3(3.5.1/3.6/3.7/3.8/3.9/3.10),64位版本 pip/pip3(9.0.1),64位版本 CUDA > 10.2 cuDNN > 7.6pip下載指令: python -m pip i…

面向本科生的智能品牌傳播策略優化

面向本科生的智能品牌傳播策略優化 一、引言 在數字化時代,品牌傳播已不再是簡單的信息傳遞,而是需要借助智能技術實現精準、高效、創新的傳播策略。作為本科畢業生,選擇“面向本科生的智能品牌傳播策略優化實踐”作為研究課題,不僅有助于深入理解品牌傳播的理論知識,還…