基於Python接口自動化測試框架(初級篇)附源碼

  引言

  不少人都知道,目前市場上不少自動化測試工具,好比:Jmeter,Postman,TestLink等,還有一些自動化測試平臺,那爲啥還要開發接口自動化測試框架呢?
相同之處就不說了,先說一下工具的侷限性:html

1.測試數據不可控:
    接口雖然是對業務邏輯、程序代碼的測試,而其實是對數據的測試,調用接口輸入一批數據,經過斷言代碼驗證接口返回的數據,整個過程圍繞數據測試。
    若是返回的數據不是固定的,是變化的,那麼斷言失敗,就沒法知道是接口程序錯誤引發的,仍是數據變化引發的,因此就須要進行測試數據初始化。
    接口工具沒有具有數據初始化的功能,從而沒法真正作到接口自動化測試。mysql

舉個例子來幫助理解:web

     好比你要測試一個查詢接口,在沒有初始化測試數據的狀況下,你入參是:id = 1,斷言是: assert name = ‘測試’, 這個斷言是你預先知道接口會返回什麼。調用接口時候,接口返回結果是name = ‘測試’,斷言成功,由於你知道數據庫有一條id=1的數據。算法

     哪天這條id=1的數據被人刪除,可是你維護的接口測試框架還在跑,並無更新測試數據,結果斷言失敗,你上去debug,最後發現是測試數據的問題,這個過程是費時又費勁的,sql

若是作了測試數據初始化的功能,徹底是能夠避免的。chrome

     由於入參和出參都是固定的,是按本身須要初始化好的,不用擔憂數據變化引起斷言失敗,那麼只關心接口程序代碼的問題了。數據庫

2.沒法測試加密接口
    公司項目中,大部分接口是不供外部調用,會使用用戶認證、簽名、加密等手段,提供接口的安全性。而通常的測試工具沒法作到模擬和生成這些加密算法。django

3.擴展能力不足
    工具始終是工具,有必定的侷限性,沒法生成自定義測試報告,沒法定製化發送郵件,持續集成和定時任務。json

4.對業務的支持程度
    工具對業務支持程序相對比較低,沒法根據不一樣業務定製化開發,而自動化測試框架能夠作到這點,對業務支持比較靈活。windows

 

  框架設計思路

1.大體處理流程:

 

 

2.接口自動化測試框架處理過程:

  • 首先編寫一份測試數據初始化的腳本,維護一批測試數據到數據庫,而且每次初始化前,清空原來的數據,這樣保證數據是最新和惟一的(避免重複)。
  • 調用被測系統的接口,傳入參數,這個請求參數是字典,而且數據與數據庫數據(數據是初始化時插入)中一致。
  • 系統接口會根據入參,向測試數據庫查詢。
  • 查詢結果組裝成必定格式(dict、json)的數據,返回給測試框架。
  • 測試框架斷言接口返回的數據,並生成測試結果(測試報告)。

 

  框架結構

 

框架介紹:

各個目錄的做用:

  1. common/: 報告、日誌等公共模塊存放文件夾
  2. config/: 文件路徑、配置信息存放
  3. db_init/: 測試數據初始化處理程序
  4. logs/: 生成日誌文件
  5. pies/: 餅圖存放
  6. report/: 測試報告存放
  7. testcase/: 用於編寫測試用例
  8. run_main.py 執行測試集的主程序

主程序運行文件run_main.py:

# -*- coding: utf-8 -*-
'''
@author: liudinglong

@software: pycharm

@file:  run_main.py

@time: 2020/2/23 0023 13:46

'''

import time ,sys
# 引用模塊路徑
sys.path.append('./testcase')
sys.path.append('./db_fixture')
from common.HTMLTestRunner3 import HTMLTestRunner
from unittest import defaultTestLoader
from db_init import data_init

# 指定測試用例爲當前文件夾下的 interface 目錄
test_dir = './testcase'
# 自動獲取interface 目錄下的測試用例
testsuit = defaultTestLoader.discover(test_dir,pattern='*test.py')


if __name__ == '__main__':
    # 初始化接口測試數據
    data_init.init_data()
    # 獲取當前時間
    now = time.strftime("%Y-%m-%d %H_%M_%S")
    # 定製報告名稱
    filename = './report/' + now + '_result.html'
    # 向報告寫入測試結果數據
    fp = open(filename, 'wb')
    runner = HTMLTestRunner(stream=fp,
                            title='接口自動化測試報告',
                            description='運行環境:環境:windows 10 瀏覽器:chrome 語言: Python3')
    # 運行測試集
    runner.run(testsuit)
    # 關閉報告文件
    fp.close()

 

測試數據初始化data_init.py:

# -*- coding: utf-8 -*-
'''
@author: liudinglong

@software: pycharm

@file:  data_init.py

@time: 2020/2/23 0023 13:37

'''

import sys, time,datetime
sys.path.append('../db_init')
try:
    from mysql_conn import DB
except ImportError:
    from .mysql_conn import DB

# 定義過去時間,time.localtime(time.time())格式化時間戳爲本地時間
past_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()-100000))

# 定義未來時間
future_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()+10000))

# 獲取當前時間
now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

# create data
datas = {
    'django_web_event':[
        {'id':1,'name':'紅米Pro發佈會','`limit`':2000,'status':1,'address':'北京會展中心','start_time':future_time},
        {'id':2,'name':'可參加人數爲0','`limit`':0,'status':1,'address':'北京會展中心','start_time':future_time},
        {'id':3,'name':'當前狀態爲0關閉','`limit`':2000,'status':0,'address':'北京會展中心','start_time':future_time},
        {'id':4,'name':'發佈會已結束','`limit`':2000,'status':1,'address':'北京會展中心','start_time':past_time},
        {'id':5,'name':'小米5發佈會','`limit`':2000,'status':1,'address':'北京國家會議中心','start_time':future_time},
    ],
    'django_web_guest':[
        {'id':1,'realname':'alen','phone':13511001100,'email':'alen@mail.com','sign':0,'event_id':1},
        {'id':2,'realname':'has sign','phone':13511001101,'email':'sign@mail.com','sign':1,'event_id':1},
        {'id':3,'realname':'tom','phone':13511001102,'email':'tom@mail.com','sign':0,'event_id':5},
    ],
}


# Inster table datas
def init_data():
    DB().init_data(datas)


if __name__ == '__main__':
    init_data()

 

  運行程序

運行結果:

......FFFFFF.................
Time Elapsed: 0:00:00.208256

 

測試日誌:

 

 

測試報告:

  

 有錯誤不要懼怕,看看報錯信息,再修改一下,運行後:

 

  總結

   在測試以前,要準備測試環境,若是是正式環境的接口,有條件的話,建議獨立建立測試數據庫,避免對正式數據形成影響。能夠在本地建立或在正式庫服務器是上建立db,本套僅做爲項目測試環境使用。
   在數據庫初始化時,鏈接測試環境的數據庫,將本身須要的測試數據初始化進去,每次程序執行的時候,都初始化一遍,這樣的做用防止數據與正式數據衝突,而且防止測試數據重複和累積在數據庫中。

 

  附錄

更多幹貨分享:加入測試開發交流QQ羣:696400122
微信公衆號:全棧測試開發日記,
CSDN地址:https://blog.csdn.net/liudinglong1989/article/details/104457379

相關文章
相關標籤/搜索