接口自動化框架
一、整個框架的目錄結構,本次內容着重講解測試用例類,只要掌握了測試用例類和接口測試用例怎么寫就可以運用此框架。
common目錄
1.contants是處理項目路徑模塊,本項目路徑全部采取相對路徑(這樣做的好處是copy到任意地方可以直接運行,不用擔心會路徑報錯)
2.handle_data處理excel用例中需要替換的參數,用來存儲臨時變量,和需要替換的excel用例中需要替換的字符串(注意存放臨時變量時int類型應轉換成str類型存放)
3.handle_db是連接數據庫(mysql)處理需要進行數據庫校驗的模塊,封裝了三個方法,分別是:獲取到查詢的第一條數據、獲取到查詢的所有數據、獲取查詢到的數據條數
4.handle_request是用來發送請求的(支持cookie和token)
5.handle_webservice是用來發送webservice類型接口的請求(用到的比較少可以忽略此模塊)
6.myconfig是讀取和寫入配置文件的模塊
7.mylogger是輸出日志模塊,用來調用代碼運行的時候哪些信息需要寫入日志中,方便自己調試和找出接口錯誤信息,哪里需要就直接調用
8.readexcel讀取excel用例數據的模塊
9.send_email是發送測試報告郵件模塊
comf配置文件
1.日志等級和測試報告名稱,項目地址,賬號,和數據庫連接信息修改的地方
data存放excel用例數據
library存放一些下載的第三方庫
1.ddt數據驅動的
2.HTMLTestRunner生成測試報告的模塊
log存放日志
查看日志,日志是輪轉的
reports存放測試報告
在此文件夾下查看報告
testcases存放用例類的模塊
所有的測試用例類必須放在此模塊
run.py測試運行程序
整個項目只需要運行此模塊就可以
二、下面我們來詳細介紹下excel中接口用例該怎么寫
這里注意下接口傳入參數data里的用例1和用例2中的mobile_phone的傳參為什么是#phone#,為什么不傳入具體手機號,因為傳入具體的手機號,測試用例只能運行一次,需要手動修改這里的測試用例數據在進行運行比較。那我們該采用什么辦法呢,在代碼里面隨機生成手機號進行替換(后面代碼中會指出),怎么替換呢首先判斷每條用例數據中是否有#phone#,如果有就用生成的隨機手機號進行替換,反之,就直接將接口參數傳入接口中進行請求,獲取結果
還需要注意的是將表單名稱進行修改,如上圖中的下方,名稱隨意取
講完了excel用例,接口用例類怎么寫(python基礎語法就不多說)我們只講接口的excel用例數據讀取,請求接口,在進行斷言,預期結果和實際結果進行比對
# -*- coding: utf-8 -*-
# @Time : 2019/12/5 9:23
# @File : test_01_login__register.py
# @Software: PyCharm
import unittest
import random
from library.ddt import ddt,data
from common.readexcel import read_excel
from common.contants import URL_DIR
from common.myconfig import conf
from common.handle_request import token_http,cookie_http
from common.mylogger import Log
from common.handle_db import db
@ddt
class Testregister(unittest.TestCase):
#傳入excel用例所在的路徑和表單名
excel=read_excel(URL_DIR,"register")
#讀取用例數據
cases=excel.read_data()
@data(*cases)
def test_register(self,case):
# ------第一步:准備用例數據------------
# 獲取請求的參數
# 增加判斷,這里判斷是否有請求的參數需要替換
if "#phone#"in case["data"]:
# 生成手機號
phone=self.random_phone()
# 進行替換
case["data"]=case["data"].replace("#phone#",phone)
data=eval(case["data"])
# 獲取請求的方法
method=case["method"]
# 獲取請求的地址(配置文件中讀取的路徑+excel中的讀取路徑做拼接)
url=conf.get("url_project","url")+case["url"]
# 獲取當前用例所在行
row=case["case_id"]+1
# 獲取請求頭(配置文件中讀取請求頭)
headers=eval(conf.get("url_project","headers"))
# 獲取預期結果
expected=eval(case["expected"])
# ------第二步:發送請求到接口,獲取實際結果--------
#發送請求(傳入url、請求方法、請求參數,請求頭、)
res1=token_http.send(url=url,method=method,json=data,headers=headers)
#獲取實際結果鄭州哪個人流醫院好 http://www.csyhjlyy.com/
res=res1.json()
# -------第三步:比對預期結果和實際結果-----
try:
#斷言接口返回的code和預期結果中的code是否一致
self.assertEqual(eval(expected["code"]),res["code"])
#斷言接口返回的msg和預期結果中的msg是否一致
self.assertEqual(expected["msg"],res["msg"])
#判斷如果請求成功就到處數據庫中去查詢是否有該數據
if res["msg"]=="ok":
# 去數據庫查詢當前賬號是否存在
sql = "SELECT * FROM futureloan.member WHERE mobile_phone ={}".format(phone)
# 獲取數據庫中有沒有該用戶信息,(用handle_db封裝好的方法)
count=self.db.count(sql)
# 對數據庫中返回的數據做斷言,判斷數據庫中是否有一條數據
self.assertEqual(1,count)
except AssertionError as e :
#回寫結果到excel中的result列
self.excel.write_data(row=row,column=8,value="未通過")
#打印到控制台
print("預期結果:{}".format(expected))
print("實際結果;{}".format(res))
#將錯誤信息打印到日志
Log.info("用例:{}--------->未通過".format(case["title"]))
Log.error(e)
#如果有錯誤信息拋出錯誤信息
raise e
else:
#回寫結果到excel中的result列
self.excel.write_data(row=row,column=8,value="通過")
Log.info("用例:{}--------->通過".format(case["title"]))
#隨機生成手機號方法
@staticmethod
def random_phone():
phone="188"
for i in range(8):
phone+=str(random.randint(0,9))
return phone
代碼中部分問題
1.上面的URL_DIR是已經拼接好的路徑導入進來的,在contants下URL_DIR里修改
2.請求地址前半部分讀取conf.ini文件中的url(建議將接口中相同的請求地址放在此地方,這樣就不用每次在excel中url里寫入完整的接口地址)
3.請求頭存放在conf.ini文件的headers用字典的方式存放
4.數據庫校驗部分需要先連接數據庫,在conf.ini配置文件中填寫host主機,user用戶,password密碼,port端口號(注:這里只支持,mysql數據庫)
請注意:框架中有許多的第三方庫需要自己安裝
用例類和excel用例寫好后運行run.py文件
在reports查看測試報告
