測試任務:將以前完成的所有的腳本統一改寫為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%的存在,為社會創造更大的價值,為公司節約更多的成本,為自己和家庭謀求更高的收入,所有人不受職業年齡限制,越老越吃香,直至財富自由;愿測試技術越來越進步,軟件質量進一步得到提高,效率提高。愿祖國更加美好,人民更加幸福。多喜樂,常安寧。
???????撥云見日終有時,學無止境勤可達。