Python3簡易接口自動化測試框架設計與實現(上)


接口開發請參考:使用Django開發簡單接口:文章增刪改查python

一、開發環境

  • 操做系統:Ubuntu18
  • 開發工具:IDEA+PyCharm插件
  • Python版本:3.6

二、用到的模塊

  • requests:用於發送請求
  • xlrd:操做Excel,組織測試用例
  • smtplib,email:發送測試報告
  • logging:日誌追蹤
  • json:數據格式化
  • Django:接口開發
  • configparser:讀取配置文件

三、框架設計

3.一、流程

接口用例是經過Excel來組織的,定義了URL,Request Body等列。執行流程以下:web

  • 使用xlrd工具讀取Excel中的信息,拼接成一個個完整的請求。
  • 接口請求類拿到一個個完整的請求的去執行,這個過程須要記錄日誌,每一次執行狀況都要有跡可循。
  • 回填測試結果,發送郵件,歸檔每次的運行結果。更好一點的作法是把歷史運行狀況作個報表,更直觀。

優勢:json

  • 用例經過Excel來組織,不須要編寫代碼,上手難度小。
  • 在用例個數不是不少的狀況,開發速度快。

缺點:api

  • 用例依賴是痛點。
  • 只能支持接口自動化用例。
  • Excel中用例沒法預先檢查正確性,只有跑一把才能知道。
  • 沒法很好地管理大量用例,且不支持團隊協同做業,我的用來回歸測試或上線後的冒煙測試會是一個不錯的選擇。

經過優缺點的對比,能夠明顯發現這個框架的硬傷其實不少了。因此不管是業界開源的自動化測試框架或企業自研的尚未見過用Excel來組織用例的。值得一提的是個別企業自研的自動化框架很是難用,抑或是把一堆工具簡單組合到一塊兒。根本沒法提升團隊的生產力。不過好的產品也不是一蹴而就的,須要一個持續優化的過程。因此上面用Excel組織用例的框架仍是值的玩一玩的,暫且命名爲apitest吧。目前比較好的自動化測試框架有unittest,testng,pytest等。框架

3.二、項目結構

  • testcase:存放測試用例或請求的json文件。
  • config:配置文件。
  • report:測試報告和日誌文件及其歸檔。
  • untils:工具集,send_request用來發送請求,email_tool用來發送郵件,excel_tool用來讀取Excel中的數據,check_result用來校驗結果,run_main用例執行入口,log_trace用來追蹤日誌。

五、日誌打印

採用內置logging模塊才記錄運行日誌,設置日誌級別。
log_trace.log:函數

import  logging
filename = "../report/test_case_run.log"
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(levelname)s1 %(filename)s [line:%(lineno)d]  %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S',
                    filename=filename,
                    filemode='w')

六、接口請求類封裝

安裝第三方模塊requests工具

pip install requests

定義函數send_request,根據傳入的方法類型分別去調用request的get,post,delete,put等方法去發送請求。send_request.py:post

import  requests
from untils. log_trace import  *

#發送get請求
def get_request(url,data=None,headers=None):
    res = requests.get(url=url,data=data,headers=headers)
    return res

#發送post請求
def post_request(url,data,headers=None):
    res = requests.post(url=url,data=data,headers=headers)
    return res

#發送delete請求
def del_request(url,data=None,headers=None):
    res = requests.delete(url,data=data)
    return res

#發送put請求
def put_request(url,data,headers=None):
    pass

def send_request(method,url,data=None,headers=None):
    try:
        logging.info(headers)
        if headers:
            if method == "GET":
                return get_request(url,data,headers=headers)
            if method == "POST":
                return post_request(url,data=data,headers=headers)
            if method == "DELETE":
                return  del_request(url,data=data,headers=headers)
            #put使用頻率低,暫時不寫
            if method == "PUT":
                return  put_request(url,data=data,headers=headers)
        else:
            logging.info("Header is null")
    except Exception as e:
        logging.info("send request fail:%s"%e)

在untils_test.py中編寫代碼測試send_request方法,代碼以下:開發工具

#coding:utf-8
from untils.send_request import send_request

def test_send_request():
    url="http://127.0.0.1:9000/articles/"
    headers = {
        "X-Token":"0a6db4e59c7fff2b2b94a297e2e5632e"
    }
    res = send_request("GET",url,headers=headers)
    print(res.json())



if __name__ == "__main__":
    test_send_request()

運行結果:

/usr/bin/python3.6 /home/stephen/IdeaProjects/apitest/untils/untils_test.py
{'status': 'BS.200', 'all_titles': {'amy1': 'alive', 'modifytest': 'alive', 'addTest': 'alive'}, 'msg': 'query articles sucess.'}

Process finished with exit code 0
相關文章
相關標籤/搜索