基於python的接口自動化測試+ddt數據驅動


在測試接口時,一個接口會先寫好測試用例,這個用例主要針對功能,傳入參時考慮到各種場景,正常的,異常的,如:參數缺省,參數傳一個六位數字寫用例時考慮邊界情況等。

一個接口設計用例時有可能會十幾條到幾十條都有可能,多個接口就有很多了,這時候我們可以考慮到自動化測試接口。

采用數據驅動方式,把數據寫在excel表格中,代碼做封裝,用數據驅動測試,兩部分相互獨立。python中用ddt模塊來做數據驅動,代碼簡單好維護,調試也方便。

自己寫的框架,結構如下:

common:公共層,放讀取表格數據,發送request請求,生成測試報告的.py文件

data:放excel數據

report:放測試報告

testcase:寫測試用例

run_main.py:運行用例並生成測試報告

 

HTMLTestRunner.py文件是從網上下載的模板,可以直接使用。

readExcel.py讀取表格數據,返回的是一個列表,里面的數據以字典格式存放,通過索引得到字典然后取字典的值

 1  #! /usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 """
 5 @version: 1.0
 6 @author: fky
 7 @site: 
 8 @software: PyCharm
 9 @file: readExcel.py
10 @time: 2018/3/24 9:37
11 """
12 import xlrd
13 
14 class ReadExcel():
15      def readExcel(fileName,SheetName="Sheet1"):
16          data = xlrd.open_workbook(fileName)
17          table = data.sheet_by_name(SheetName)
18 
19          #獲取總行數、總列數
20          nrows = table.nrows
21          ncols = table.ncols
22          if nrows > 1:
23              #獲取第一行的內容,列表格式
24              keys = table.row_values(0)
25              #print(keys)
26 
27              listApiData = []
28              #獲取每一行的內容,列表格式
29              for col in range(1,nrows):
30                  values = table.row_values(col)
31                  # keys,values這兩個列表一一對應來組合轉換為字典
32                  api_dict = dict(zip(keys, values))
33                  #print(api_dict)
34                  listApiData.append(api_dict)
35 
36              return listApiData
37          else:
38              print("表格未填寫數據")
39              return None
40 
41 if __name__ == '__main__':
42     s = ReadExcel.readExcel("E:\\fukun_apitest\\data\\yoyo_apiTest.xlsx","Sheet1")
43     print(s)

 

sendRequest.py中的文件,讀取表格的數據作為request請求的參數:

# -*- coding:utf-8 -*-

"""
@version: 1.0
@author: fky
@site:
@software: PyCharm
@file: sendRequests.py
@time: 2018/3/24 11:40
"""
from common.readExcel import ReadExcel
import requests
import json
class SendRequests():
    def sendRequests(self,s,apiData):
        try:
            #從讀取的表格中獲取響應的參數作為傳遞
            method = apiData["method"]

            url = apiData["url"]

            if apiData["params"] == "":
                par = None
            else:
                par = eval(apiData["params"])

            if apiData["headers"] == "":
                h = None
            else:
                h = apiData["headers"]


            if apiData["body"] == "":
                body_data = None
            else:
                body_data = eval(apiData["body"])

            type = apiData["type"]

            v = False

            if type == "json":
                body = json.dumps(body_data)
            if type == "data":
                body = body_data
            else:
                body = body_data

            #發送請求
            re = s.request(method=method,url=url,headers=h,params=par,data=body,verify=v)
            return re

        except Exception as e:
            print(e)

if __name__ == '__main__':
    s = requests.session()
    testData = ReadExcel.readExcel("apiTest.xlsx", "Sheet1")
    response = SendRequests().sendRequests(s,testData[3])
    print(response.json())


 

用例部分(case_01_yoyo.py)

#! /usr/bin/env python
# -*- coding:utf-8 -*-

"""
@version: 1.0
@author: fky
@site:
@software: PyCharm
@file: case_01.py
@time: 2018/3/16 10:58
"""
import unittest
import requests
from ddt import ddt,data,unpack
from common.sendRequests import SendRequests
from common.readExcel import ReadExcel
import os

# path = os.path.dirname(os.getcwd())+"\\data\\yoyo_apiTest.xlsx"
# print(path)
testData = ReadExcel.readExcel("E:\\fukun_apitest\\data\\yoyo_apiTest.xlsx", "Sheet1")
@ddt
class Test1(unittest.TestCase):

    def setUp(self):
        self.s = requests.session()

    def tearDown(self):
        pass

    @data(*testData)
    def test_yoyo_api(self,data):

        re = SendRequests().sendRequests(self.s, data)
        #print(re.json())

        #切割字符串取后面的部分
        expect_result1 = data["expect_result"].split(":")[1]
        #轉換為字符串
        expect_result = eval(expect_result1)
        #斷言
        self.assertEqual(re.json()["origin"], expect_result, "返回錯誤,實際結果是%s"%re.json()["origin"])


if __name__ == '__main__':

    unittest.main()

 

run_main.py,跑用例最后生成測試報告:

#! /usr/bin/env python
# -*- coding:utf-8 -*-

"""
@version: 1.0
@author: fky
@site: 
@software: PyCharm
@file: run_main.py
@time: 2018/3/16 10:58
"""
import unittest
import  time
import os
from common.HTMLTestRunner_jpg import HTMLTestRunner

def run_case(dir = "testcase"):
    case_dir = os.getcwd() + "\\" + dir
    print(case_dir)
    test_case = unittest.TestSuite()
    discover = unittest.defaultTestLoader.discover(case_dir,pattern="case_01_yoyo.py",top_level_dir=None)
    return  discover
if __name__ == '__main__':

    current_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
    report_path =os.getcwd() + "\\report\\" + current_time + '.html'  # 生成測試報告的路徑
    print(report_path)
    fp = open(report_path, "wb")
    runner = HTMLTestRunner(stream=fp, title=u"自動化測試報告", description=u'yoyo接口',verbosity=2)
    runner.run(run_case())
    fp.close()

 

 

報告結果

 

 

 

--------------------------------------------------------------------------------------------

更新於2019-12-16日下午18:03

不好意思好久沒看微博,今天才看見有人提問了,所有重新檢查了下項目文件

case_02_qq.py 這個用例經測試是可以成功執行的,各位網友可以自行到github下載或克隆使用:

github項目地址:https://github.com/ctnyan/fukun_apitest


免責聲明!

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



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