程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【Python自動化測試25】接口自動化測試實戰五_數據庫斷言、接口關聯及相關管理優化

編輯:Python

文章目錄

  • 一、前言
  • 二、校驗數據庫、接口關聯及項目優化

一、前言

本文章主要會講解接口自動化測試中Python的數據庫斷言以及相關的接口關聯的測試,除此之外下方有系列文章的傳送門,還在持續更新中,感興趣的小伙伴也可以前往查看,話不多說,讓我們一起看看吧~

系列文章:
系列文章1:【Python自動化測試1】遇見Python之美
系列文章2:【Python自動化測試2】Python安裝配置及PyCharm基本使用
系列文章3:【Python自動化測試3】初識數據類型與基礎語法
系列文章4:【Python自動化測試4】字符串知識總結
系列文章5:【Python自動化測試5】列表與元組知識總結
系列文章6:【Python自動化測試6】字典與集合知識總結
系列文章7:【Python自動化測試7】數據運算符知識合集
系列文章8:【Python自動化測試8】流程控制語句講解
系列文章9:【Python自動化測試9】函數知識合集
系列文章10:【Python自動化測試10】文件基礎操作
系列文章11:【Python自動化測試11】模塊、包與路徑知識合集
系列文章12:【Python自動化測試12】異常處理機制知識合集
系列文章13:【Python自動化測試13】類、對象、屬性與方法知識合集
系列文章14:【Python自動化測試14】Python自動化測試基礎與進階練習題
系列文章15:【Python自動化測試15】unittest測試框架的核心概念與作用
系列文章16:【Python自動化測試16】測試用例數據分離
系列文章17:【Python自動化測試17】openpyxl二次封裝與數據驅動
系列文章18:【Python自動化測試18】配置文件解析與實際應用
系列文章19:【Python自動化測試19】日志系統logging講解
系列文章20:【Python自動化測試20】接口自動化測試框架模型搭建
系列文章21:【Python自動化測試21】接口自動化測試實戰一_接口概念、項目簡介及測試流程問答
系列文章22:【Python自動化測試22】接口自動化測試實戰二_接口框架修改及用例優化
系列文章23:【Python自動化測試23】接口自動化測試實戰三_動態參數化與數據偽造
系列文章24:【Python自動化測試24】接口自動化測試實戰四_Python操作數據庫

二、校驗數據庫、接口關聯及項目優化

自動化測試用例執行後,判斷成功的測試用例才進行數據庫的校驗:

import unittest
import requests
import json
from common.db import DBHandler, db_module
from common.logger import log
from common.excel import read_excel
from common import helper
from config import path_config
from unittestreport import ddt, list_data
from config import setting
# 獲取數據
data = read_excel(path_config.case_path , 'XXXXXX')
@ddt
class TestRegister(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
"""測試類的前置"""
cls.db = DBHandler()
@classmethod
def tearDownClass(cls) -> None:
"""測試類的前置"""
cls.db.close()
@list_data(data)
def test_register(self, case_data):
print(case_data)
json_data = case_data['json']
if '#new_phone#' in json_data:
new_phone = helper.generate_new_phone()
json_data = json_data.replace('#new_phone#', new_phone)
# 把json格式的字符串轉化成字典
json_data = json.loads(json_data)
headers = json.loads(case_data['headers'])
print("替換之後", json_data)
resp = requests.request(
method=case_data['method'],
url= setting.host + case_data['url'],
json=json_data,
headers=headers
)
actual = resp.json()
print(actual)
try:
self.assertEqual(case_data['expected'], actual['code'])
except AssertionError as e:
raise e
""" 1、判斷是否是注冊成功的測試用例 2、查詢數據庫是否包含了手機號的記錄 3、判斷數據庫記錄條數是否為1 """
if actual['msg'] == "OK":
# 通過 setUp 創建數據庫連接
sql = f"select id from XXXX.XXXX where XXXXXX = {
json_data['XXXXXX']}"
result = self.db.query_all(sql)
self.assertEqual(1, len(result))

往往項目中的接口都會存在接口關聯,而我們就需要對接口進行單獨處理:

import unittest
import requests
import json
from jsonpath import jsonpath
from decimal import Decimal
from common.db import DBHandler
from common.logger import log
from common.excel import read_excel
from common import helper
from config import path_config
from unittestreport import ddt, list_data
from config import setting
# 獲取數據
from middle import api
data = read_excel(path_config.case_path , 'XXXXXX')
@ddt
class TestRecharge(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
""" 1,訪問登錄接口,得到返回值 2,從返回值當中提取數據:resp["data"]["id"] 3, 從返回值當中提取數據:resp["data"]["token_info"]["token"] 4, 設置成類屬性,方便測試用例函數當中調用 :return: """
resp_data = api.login()
# 提取方式1:
cls.member_id = resp_data["data"]["id"]
cls.token = resp_data["data"]["token_info"]["token"]
# 提取方式2:jsonpath
cls.member_id = jsonpath(resp_data, '$..id')[0]
cls.token = jsonpath(resp_data, '$..token')[0]
cls.before = jsonpath(resp_data, '$..leave_amount')[0]
# 初始化數據庫
cls.db = DBHandler()
@classmethod
def tearDownClass(cls) -> None:
pass
@list_data(data)
def test_recharge(self, case_data):
""" 1, 獲取 case_data 當中的數據,headers, json 是要重點關注的。 2, 數據的預處理:數據替換,數據轉化成 字典格式:headers, json, expected 3, 發送請求 4, 斷言 :param case_data: :return: """
# 獲取 case_data當中的數據,headers, json是要重點關注的。
headers_string = case_data['headers']
json_string = case_data['json']
# 數據的預處理:數據替換,數據轉化成字典格式:headers, json, expected
if "#token#" in headers_string:
headers_string = headers_string.replace("#token#", self.token)
if "#member_id#" in json_string:
json_string = json_string.replace("#member_id#", str(self.member_id))
headers = json.loads(headers_string)
json_data = json.loads(json_string)
expected = json.loads(case_data['expected'])
# 獲取充值之前數據庫當中用戶的余額
sql = f"select XXXXXXX from XXXX.XXXXX where id={
self.XXXXX_id}"
before = self.db.query_one(sql)
# {"leave_amount": 200}
# 3, 發送請求
resp = requests.request(
method=case_data['method'],
url=setting.host + case_data['url'],
json=json_data,
headers=headers
)
# 4, 斷言
json_response = resp.json()
try:
for key, value in expected.items():
self.assertEqual(value, json_response[key])
except AssertionError as e:
log.error(f"測試用例失敗:{
e}")
raise e
if json_response['msg'] == 'OK':
print(json_response)
# 通過數據庫斷言
sql = f"select leave_amount from futureloan.member where id={
self.member_id}"
after = self.db.query_one(sql)
money = str(json_data['amount'])
after = str(after['leave_amount'])
before = str(before['leave_amount'])
self.assertEqual(Decimal(money), Decimal(after) - Decimal(before))


好啦~以上就是本次文章分享的全部內容啦,你學會了嗎?希望能給大家帶來幫助哦!



  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved