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

  • 2019 年 12 月 12 日
  • 筆記

來源:http://www.51testing.com

目錄

  1、開發環境

  2、用到的模組

  3、框架設計 ?3.1、流程

  3.2、項目結構

  5、日誌列印

  6、介面請求類封裝

  1、開發環境

作業系統:Ubuntu18

  開發工具:IDEA+PyCharm插件

Python版本:3.6

2、用到的模組

  requests:用於發送請求

  xlrd:操作Excel,組織測試用例

  smtplib,email:發送測試報告

  logging:日誌追蹤

  json:數據格式化

  Django:介面開發

  configparser:讀取配置文件

3、框架設計

  3.1、流程

  介面用例是通過Excel來組織的,定義了URL,Request Body等列。執行流程如下:

  使用xlrd工具讀取Excel中的資訊,拼接成一個個完整的請求。

  介面請求類拿到一個個完整的請求的去執行,這個過程需要記錄日誌,每一次執行情況都要有跡可循。

  回填測試結果,發送郵件,歸檔每次的運行結果。更好一點的做法是把歷史運行情況做個報表,更直觀。

  優點:

  用例通過Excel來組織,不需要編寫程式碼,上手難度小。

  在用例個數不是很多的情況,開發速度快。

  缺點:

  用例依賴是痛點。

  只能支援介面自動化用例。

  Excel中用例無法預先檢查正確性,只有跑一把才能知道。

  無法很好地管理大量用例,且不支援團隊協同作業,個人用來回歸測試或上線後的冒煙測試會是一個不錯的選擇。

  通過優缺點的對比,可以明顯發現這個框架的硬傷其實很多了。所以無論是業界開源的自動化測試框架或企業自研的還沒有見過用Excel來組織用例的。值得一提的是個別企業自研的自動化框架非常難用,抑或是把一堆工具簡單組合到一起。根本無法提高團隊的生產力。不過好的產品也不是一蹴而就的,需要一個持續優化的過程。所以上面用Excel組織用例的框架還是值的玩一玩的,暫且命名為apitest吧。目前比較好的自動化測試框架有unittest,testng,pytest等。

3.2、項目結構

  testcase:存放測試用例或請求的json文件。

  config:配置文件。

  report:測試報告和日誌文件及其歸檔。

  untils:工具集,send_request用來發送請求,email_tool用來發送郵件,excel_tool用來讀取Excel中的數據,check_result用來校驗結果,run_main用例執行入口,log_trace用來追蹤日誌。

5、日誌列印

  採用內置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')

6、介面請求類封裝

安裝第三方模組requests

pip install requests

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

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

星雲測試

http://www.teststars.cc

奇林軟體

http://www.kylinpet.com

聯合通測

http://www.quicktesting.net