python+unittest+DDT實現接口自動化測試


 

環境:python2.7

功能:實現接口自動化測試

整體結構:

 

1,common:存放發送請求的,返回響應的內容,具體的請求方式與返回內容,根據個人的不同而定

2、report:存放html報告結果

3,testCase:存放測試用例

4、testData:測試的數據,包括url,header,參數等

5、tools:工具包,其中HTMLTestURunner.py是為了生成html報告,myTools.py里主要存放處理的一些方法

6、all_test.py:批量執行所有的用例

common中的send_request.py

import requests
import json
class SendRequest():
def sendJsonRequests(self,url,dict,header=None):
re=requests.post(url,json=dict,headers=header)
return re.text
def sendDataRequests(self,url,dict,header=None):
re=requests.post(url,data=dict,headers=header)
return re.text

發送請求,返回響應的內容

testCase中的 test_loan_center_interface_API.py

import unittest
from unittest import TestCase
from common.send_request import SendRequest
import json
from ddt import ddt,data,unpack
from tools.myTools import *
test_loan_center_interface_data = get_test_case_data("C:\\Users\\Lenovo\\PycharmProjects\\FAMCAuto\\testData\\testData.xlsx","test_loan_center_interface")
@ddt
class LoanCenterInterfaceAPI(unittest.TestCase):
def setUp(self):
pass
def sendRequest(self,url,dict,header=None):
result = SendRequest().sendJsonRequests(url,dict,header)
return json.dumps(json.loads(result)["meta"],ensure_ascii=False)#字典轉中文輸出
@data(*test_loan_center_interface_data)
def test_loan_center_interface(self,data):

if data["paral"]=="" or data["paral"].encode("utf-8").isspace():
result = self.sendRequest(data["url"], " ")
else:
result = self.sendRequest(data["url"], json.loads(data["paral"]))
exception=json.dumps(json.loads(data["except"]), ensure_ascii=False, encoding='UTF-8')#處理字典中文輸出顯示
results=json.dumps(json.loads(result), ensure_ascii=False, encoding='UTF-8')#處理字典中文輸出顯示
self.assertEqual(exception,results)

testCase中的 test_get_weixin_taobao_info_API.py

import unittest
from unittest import TestCase
from common.send_request import SendRequest
import json
from ddt import ddt,data,unpack
from tools.myTools import *

test_get_weixin_taobao_info = get_test_case_data("C:\\Users\\Lenovo\\PycharmProjects\\FAMCAuto\\testData\\testData.xlsx","test_get_weixin_taobao_info")
#print test_get_weixin_taobao_info
@ddt
class GetWeiXinTaoBaoInfo(unittest.TestCase):
def setUp(self):
pass
def sendRequest(self,url,dict,header=None):
result = SendRequest().sendJsonRequests(url,dict,header)
return json.dumps(json.loads(result)["meta"],ensure_ascii=False)#字典轉中文輸出
@data(*test_get_weixin_taobao_info)
def test_get_weixin_taobao_info(self,data):
header=get_dc(data["header"].encode("utf-8"))
if data["paral"]=="" or data["paral"].encode("utf-8").isspace():
result = self.sendRequest(data["url"], " ",header)
else:
result = self.sendRequest(data["url"], json.loads(data["paral"]),header)
result1=json.loads(result)
if "bizNo" in result1.keys():
result1.pop("bizNo")
results = json.dumps(result1, ensure_ascii=False, encoding='UTF-8')# 處理字典中文輸出顯示
exception=json.dumps(json.loads(data["except"]), ensure_ascii=False, encoding='UTF-8')#處理字典中文輸出顯示
self.assertEqual(exception,results)

說明:

test_loan_center_interface_data 和test_get_weixin_taobao_info 的值通過get_test_case_data函數處理excel后,以列表字典的形式返回,再以
@data(*test_loan_center_interface_data)和@data(*test_get_weixin_taobao_info)傳入測試用例中,到達參數化的目的,
這樣只要在excel對應的位置填入要使用的測試用例的方法名就可以用這一個測試用例,可以減少很多代碼的重復,利於維護,實際中
test_loan_center_interface_data 大概有10個接口,40幾條用例在共用這個

tools中的myTools.py
import xlrd,sys
from openpyxl import load_workbook
from openpyxl import Workbook
import cx_Oracle
import json

def get_excel_dict( path, index=0):
paralList=[]
workbook=xlrd.open_workbook(path)#打開文件
sheet=workbook.sheets()[index]#sheet索引從0開始
firstRowDataList=sheet.row_values(0)#第一行數據
#print firstRowDataList
for rownum in range(1, sheet.nrows):#循環每一行數據
list = sheet.row_values(rownum)
#print type(list[3])
dict={}
dictTestCaseName={}
for caseData in list:
dict[firstRowDataList[list.index(caseData)]] =caseData #每一行數據與第一行數據對應轉為字典
#json.dumps(json.loads(caseData), ensure_ascii=False)
dictTestCaseName[list[2]]=dict#轉為字典后與用例名字對應轉為字典
paralList.append(dictTestCaseName)#將處理后的數據放入列表里

return (paralList)
說明:get_excel_dict函數是處理excel表格里面的數據,使表格里的數據以字典的形式返回
testData.xlsx表格里面的數據格式如下(可以自己定義):

 

為了簡潔:數據用數字代替,只是方便演示,真實的測試數據不是這樣的

get_excel_dict返回的結果如下:

[{3.0: {u'paral': u'4', u'API': 1.0, u'testCaseName': 3.0, u'fileName': 2.0}},

{555.0: {u'paral': u'55', u'API': 11.0, u'testCaseName': 555.0, u'fileName': 22.0}},

{555.0: {u'paral': u'666', u'API': 111.0, u'testCaseName': 555.0, u'fileName': 444.0}}]

 
        
返回一個字典列表,每個字典里面的鍵值是對應的testcasename


def get_test_case_data(filename,testCaseName):
testData = get_excel_dict(filename)
#print(testData)
getTestCaseDataList = []
for data in testData:
if (data.keys()[0]) == testCaseName:
getTestCaseDataList.append(data[testCaseName])
return getTestCaseDataList
說明:
get_test_case_data函數是為了獲取對應case所需要用到的數據,
filename:testDate.xlsx
testCaseName:測試用例的名字,
testCaseName傳555,返回的結果就是

[ {u'paral': u'55', u'API': 11.0, u'testCaseName': 555.0, u'fileName': 22.0},{u'paral': u'666', u'API': 111.0, u'testCaseName': 555.0, u'fileName': 444.0}]

假如有10條用例會用到555這個用例,那返回來的列表里面就有10個參數,這個555就對應測試用例里面的

test_get_weixin_taobao_info和test_get_weixin_taobao_info


用例寫好了需要寫一個 腳本,可以批量執行所有的用例,all_test.py就是這個作用
import unittest
from tools import HTMLTestRunner
import time
from unittest import TestLoader
#用例目錄
test_suite_dir="C:\Users\Lenovo\PycharmProjects\FAMCAuto\\testCase\\"
report_dir="C:\Users\Lenovo\PycharmProjects\FAMCAuto\\report\\"
def creatsuite():
testunit=unittest.TestSuite()
test_dir=test_suite_dir#定義測試文件查找的目錄
#定義discover方法參數
package_tests=unittest.defaultTestLoader.discover(test_dir,pattern='test_*.py',top_level_dir=None)
#discover方法篩選出來的用例循環添加到測試套件中
for test_suite in package_tests:
for test_case in test_suite:
testunit.addTest(test_case)
print(testunit)
return testunit
alltestnames=creatsuite()
if __name__=="__main__":
now=time.strftime("%Y-%m-%d %H_%M_%S")
test_report=report_dir
filename=test_report+now+" result.html"
fp=open(filename,'wb')
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,
title=u"FAMC測試報告",
description=u"測試用例執行結果")
runner.run(alltestnames)
fp.close()

 只要運行這個文件就可以自動運行所有的用例,並生成報告

 

python+unittest+DDT的框架基本就是這樣的啦,自己第一次用這個框架,有些地方不足,后面再慢慢改之~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM