接口自动化-让你了解数据库相关知识

news2024/11/18 1:45:36

目录

python接口自动化实战

数据库

写一个对数据库操作的类


python接口自动化实战

目标

  • 学习数据库相关,用例增加对数据库校验

  • 利用数据库完成对数据查询

  • 如何校验数据库数据,怎样添加校验让程序自己校验(充值、提现、投资接口对金额的校验)

知识补充

  • 用例之间关联性不要太强,比如每个模块的用例都需要登录状态,在每个模块最开始加上一次登录的用例即可。

  • 关于登录、充值啥的,用例里面的手机号最好不要写死,万一该手机号数据有脏数据,处理起来会很麻烦,所以一般在用例里面用变量,将数据放在指定的sheet里面方便读取与修改

  • 什么接口需要数据库校验?钱的变动、增减

数据库

  • 安装mysql.connector模块 pip2 install --user mysql-connector

  • 基本使用

import mysql.connector
db_config = {
    'host':'47.107.168.87',
    'user':'python',
    'password':'python666',
    'port':'3306',
    'database':'future'
}
#创建一个数据库连接
con = mysql.connector.connect(**db_config)
#建立游标cursor
cursor = con.cursor()
#写sql语句
query_sql = 'select * from member where MobilePhone = 13755120064'
#执行sql语句
cursor.execute(query_sql)
#获取结果,打印结果
# res = cursor.fetchone()  #元组  只对一条数据
res = cursor.fetchall()  #列表   多条数据
print res
#关闭游标
cursor.close()
#关闭连接
con.close()
  • 说明

query_sql = 'select * from member'

  • 因为数据库有很多数据,控制台只输出一条,还有报错,是因为cursor.fetchone()

  1. cursor.fetchone() 返回是元组,只针对一条数据

  2. cursor.fetchall() 返回是列表,针对多行数据,列表嵌套元组

  3. 要返回所有结果,就采用cursor.fetchall()

  • 前面说的初始化手机号的方法,可以通过数据库拿到目前最大的手机号进行+1操作,这样保证初始化的手机号不会和数据库里的号码有冲突

写一个对数据库操作的类

  • 在配置文件中配置数据库相关信息

[DB]
db_config = {
    'host':'47.107.168.87',
    'user':'python',
    'password':'python666',
    'port':3306,
    'database':'future',
    'buffered':True
    }  #这是正确写法

今天遇到一个错误,解决了一整天,心累,原因竟然是“配置文件括号缩进”的问题

这个是错误的写法,遇到的同学注意一下,这是个坑

[DB]
db_config = {
    'host':'47.107.168.87',
    'user':'python',
    'password':'python666',
    'port':3306,
    'database':'future',
    'buffered':True
}   #这个是错误的写法
  • 操作数据库的类

import json
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import mysql.connector
from project_path import *
from read_config import ReadConfig
class DoMysql:
    def do_mysql(self,query_sql,state='all'):  #query查询语句  state-->all  多天   one   一条
        db_config = eval(ReadConfig().get_config(case_config_path,'DB','db_config')) #利用这个类从配置文件里面读取db info
        #创建一个数据库连接
        con =mysql.connector.connect(**db_config)
        #建立游标cursor
        cursor = con.cursor()
        #执行sql语句
        cursor.execute(query_sql)
        # 获取结果,打印结果
        if state==1:
            res = cursor.fetchone()  # 元组  只对一条数据
        else:
            res = cursor.fetchall()  #列表   多条数据
        #关闭游标
        cursor.close()
        #关闭连接
        con.close()
        return res  #这个返回值要放在关闭游标、关闭连接之后

当第二个接口的参数是第一个接口的执行的结果时,该怎么处理

在请求之前完成loan_id的替换,因为loan_id是上一个接口返回的,所以不能在do_excel里面提前处理,

test_http_request.py文件
import unittest
from http_request import HttpRequest
from ddt import ddt,data
from project_path import *
from do_excel import DoExcel
from get_data import GetData
from do_mysql import DoMysql
test_data = DoExcel().get_data(test_case_path)
from my_log import MyLog
my_logger = MyLog()
@ddt()
class TestHttpRequest(unittest.TestCase):
    def setUp(self):
        pass
    @data(*test_data)
    def test_api1(self,item):
        my_logger.info('开始执行用例{0}'.format(item['用例名称']))
        #在请求之前完成loan_id替换,因为loan_id是上一个接口返回的,所以不能在do_excel里面提前处理,
        if item['data'].find('${loan_id}') != -1:
            if getattr(GetData,'loan_id') == None:
                query_sql = 'select max(Id) from loan where MemberID={0}'.format(getattr(GetData,'loan_member_id'))
                loan_id = DoMysql().do_mysql(query_sql)[0][0]
                item['data'] = item['data'].replace('${loan_id}',str(loan_id))
                setattr(GetData,'loan_id',loan_id)  #利用这个反射做存储结果
            else:
                item['data'] = item['data'].replace('${loan_id}', getattr(GetData,'loan_id'))
        res = HttpRequest().http_request(item['url'],item['data'],item['method'])
        try:
            self.assertEqual(item['except'],res.json()['code'])
            TestResult = 'pass'   #成功
        except AssertionError as e:
            TestResult = 'Failed'   #失败
            raise e
        finally:
            DoExcel().write_back(test_case_path,item['sheet_name'],item['case_id']+1,str(res.json()),TestResult)
            print res.json()
            my_logger.debug('获取的结果是:{0}'.format(res.json()))
    def tearDown(self):
        pass

存储数据的脚本get_data.py文件

from project_path import *
import pandas as pd
from openpyxl import load_workbook
class GetData:
    Cookie = None
    loan_id = None
    # NotRegTel = int(pd.read_excel(test_case_path,sheet_name='init').ix[0,0])  #采用pandas获取excel里面的数据
    NotRegTel = load_workbook(test_case_path)['init'].cell(2,1).value
    normal_tel = load_workbook(test_case_path)['init'].cell(3,1).value
    admin_tel = load_workbook(test_case_path)['init'].cell(4,1).value
    loan_member_id = load_workbook(test_case_path)['init'].cell(5,1).value
    memberID = load_workbook(test_case_path)['init'].cell(6,1).value

对于需要进行数据库校验的接口,在请求前后进行数据库值对比。

如:充值前和充值后都要对数据库数据进行对照,应有的余额是否正确。那么在请求前需要查一次余额,请求后需要查一次余额

  • 解决:配置文件中新增配置,通过配置sheet_name来判断是否需要请求前后查询余额

[CHECKLEAVEAMOUNT]
check_list=["recharge","invest"]

使用

#get_data.py
check_list=eval(ReadConfig.get_config(case_config_path, "CHECKLEAVEAMOUNT", "check_list"))
#test_http_request.py
       
        if item['sheet_name'] in getattr(GetData,'check_list'):
            #请求之前,根据用户id查询数据库余额
            query_sql = 'SELECT a.LeaveAmount FROM member a WHERE a.MobilePhone={0}'.format(eval(item['data'])['MobilePhone'])
            Before_amount = DoMysql.do_mysql(query_sql)[0][0]
            res = HttpRequest().http_request(item['url'],item['data'],item['method'],getattr(GetData,'Cookie'))
            #请求之后,根据用户id再次查询数据库余额
            query_sql = 'SELECT a.LeaveAmount FROM member a WHERE a.MobilePhone={0}'.format(eval(item['data'])['MobilePhone'])
            After_amount = DoMysql.do_mysql(query_sql)[0][0]
            #判断(请求后余额-请求前余额)是否等于充值余额,存储判断结果
            if abs(Before_amount-After_amount) == eval(item['data'])['amount']:
                check_res = '金额正确'
            else:
                check_res = '金额错误'
                #上述方法相当于一个模块所有用例都要去check一次,但实际中并不一定需要。
        else:
            res = HttpRequest().http_request(item['url'],item['data'],item['method'],getattr(GetData,'Cookie'))
  • 另一种解决思路:

  1. 上述方法相当于一个模块所有用例都要去check一次,但实际中并不一定需要。

  2. 另一个解决思路:在excel中新增一个字段check_sql,格式:{sql:SELECT a.LeaveAmount FROM member a WHERE a.MobilePhone=1234},检测如果有query_sql就校验数据库,query_sql为None就不校验数据库

 #test_http_request.py
if item["check_sql"]!=None:
    query_sql=eval(item["check_sql"]["sql"])
    #TODO:请求之前数据库余额    
    res = HttpRequest().http_request(item['url'],item['data'],item['method'],getattr(GetData,'Cookie'))
    #TODO:请求之后数据库余额
    
    #TODO:判断(请求后余额-请求前余额)的绝对值是否等于充值余额,存储判断结果
    if (请求后余额-请求前余额)的绝对值==充值余额:
        check_sql_result="数据库校验通过"
    else:
        check_sql_result="数据库校验不通过"
 #TODO:将结果写回
    DoExcel().write_back_data(test_data_path,item["sheet_name"],item["case_id"]+1,10,str(check_sql_result))
else:
    res = HttpRequest().http_request(item['url'],item['data'],item['method'],getattr(GetData,'Cookie'))
把结果写回的函数修改,记得把result和TestResult字段的代码修改:
#do_excel.py
@staticmethod
def write_back_data(file_name,sheet_name,row,col,result):
    wb=load_workbook(file_name)
    sheet=wb[sheet_name]
    sheet.cell(row,col).value=result
    wb.save(file_name) #保存
#result写回
DoExcel.write_back_data(test_data_path,item["sheet_name"],item["case_id"]+1,8,str(json.dumps(res.json(), encoding="utf-8", ensure_ascii=False)))
#TestResult写回
DoExcel.write_back_data(test_data_path,item["sheet_name"],item["case_id"]+1,9,str(TestResult))
  • 怎么把数据库校验结果写到excel中?

思路:多一个CheckResult字段

  • 检查多个点,需要多个sql语句怎么办?

思路:[{sql1:xxxx},{sql2:xxx},…]

  • 技巧:代码调试时,多使用日志,写完后,可以通过改日志级别控制输出的日志。

  作为一位过来人也是希望大家少走一些弯路,希望能对你带来帮助。(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等),相信能使你更好的进步! 

留【自动化测试】即可【自动化测试交流】:574737577(备注ccc)icon-default.png?t=N4P3http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=eSv73sPKaVXpq9JeRq1Kboh1D-w19xXu&authKey=Qs1Sduo9tp2wfkOYvRyyFCoblyT7fBhH4PPisEb1G63n1UckS6wQU50e9ar1LAOz&noverify=0&group_code=574737577

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/634188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs)

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs) ESXi 7.0 U3m Standard (标准版) ESXi 7.0 U3m Dell (戴尔) 定制版 OEM Custom Installer CD ESXi 7.0 U3m HPE (慧与) 定制版 OEM Custom Installer CD ESXi 7.0 U3m Lenovo (联想) 定…

分布式项目17 订单order,用dubbo来实现

说明:只要当一个订单生成时,处理订单的信息之外,还有订单中包含的订单商品数据以及订单物流信息,而订单的信息封装在“tb_order”表中,关于tb_order表结构如下图所示: 订单商品数据封装在“tb_order_item”…

STM32使用PWM实现led亮度变化

原理及代码讲解 1.序言2.频率3.占空比4.控制led亮度变化原理5.代码实例5.1 初始化引脚5.2 配置定时器15.3配置输出PWM 6.结语 1.序言 这里我以stm32F103c8te为例,讲解一下pwm如何输出, pwm又是如何控制led灯的亮度变化,以及具体代码又是 如何…

53、基于51单片机蓄电池充电器过充过放保护LCD液晶屏显示系统设计(程序+原理图+PCB源文件+参考论文+参考PPT+元器件清单等)

方案选择 单片机的选择 方案一:AT89C52是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元&…

STL之Stack与queue的模拟实现与duque的底层结构(3千字长文详解)

STL之Stack与queue的模拟实现与duque的底层结构 文章目录 STL之Stack与queue的模拟实现与duque的底层结构设计模式的概念适配器模式 stack的实现queue的实现双端队列——dequedeque的底层结构 设计模式的概念 设计模式像是古代的兵法,是以前的人总结出来的一些在特定…

TClientDataSet 模拟 EXCEL表

日常处理数据时,经常需要,从EXCEL表格中,批量导入数据,通过 XLSReadWriteII编程,会很快导入。 但是,客户提供的EXCEL表的字段,数据格式,字段的排序,有很大的区别。因此&a…

PostmanScript脚本功能使用详解!

目录 前言: 一、Pre-requestScript 二、TestScript 三、随机参数: 前言: Postman 是一个强大的 API 工具,可以用于构建、测试和文档化 Web API。Postman 还提供了一个名为 PostmanScript 的功能,它可以用于自动化…

【5】Midjourney Prompt

Prompt 是Midjourney Bot解释以生成图像的简短文本短语。 Midjourney Bot将Prompt 中的单词和短语分解成为Token的较小部分,可以将其与训练数据进行比较,然后用于生成图像。 精心制作的 Prompt可以帮助生成独特且令人兴奋的图像。 Structure 结构 基本…

Spring Boot + Vue3前后端分离实战wiki知识库系统<八>--分类管理功能开发二

接着上一次Spring Boot Vue3 前后端分离 实战 wiki 知识库系统<七>--分类管理功能开发的分类功能继续完善。 分类编辑功能优化: 概述: 现在分类编辑时的界面长这样: 很明显目前的父分类的展现形式不太人性&#xf…

【JVM】JVM常用指令

文章目录 1、jps2、jinfo3、jstat4、jstack5、jmap6、jhat 1、jps jps(java process status tool), 用于查看java进程及相关信息,如果你想找到一个java进程的pid,可以使用jps命令代替linux的ps命令。 命令格式&#…

ansible常见模块应用简介

目录 command, shell, raw模块file 模块copy 模块fetch 模块lineinfile模块unarchive解包解压缩 模块user 模块yum_repository 仓库管理yum/dnf模块Service/systemd模块firewalld 模块nmcli 模块get_url 模块mount模块 注意:该文档需要有 Linux 基础的看 command, s…

【架构基础】高内聚低耦合

软件设计目标:实现需求、易于重用、易于理解、没有冗余。 Dont reinvent the wheel, just realign it. --Anthony J D’ Angelo 高内聚低耦合,是软件工程中判断软件设计好坏的标准。主要评判模块或类的内聚性是否高,耦合度是否低。目的是使…

【图像处理】基于双目视觉的物体体积测量算法研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

TCP的安全和效率机制

目录 0.TCP协议格式 ​编辑 一.确认应答(安全机制) 二.超时重传(安全机制) 1.SYN丢包 2.ACK丢包 三.连接管理(安全机制) 1.三次握手建立连接 ​编辑 2.四次挥手断开连接 3.建立和断开连接 四.滑动窗口(效率机制) 五.流量控制(效率机制) 六.拥塞控制(安全机制) 七…

算法扩展第一次:收集雪花 【hash表,双指针,stl中的map】

算法详解 这道题需要新学的知识一个是双指针,一个是c库中的unordered_map容器 双指针 双指针原先我写过很多这方面的题,但是这道题我一开始是低估了它的难度,而且压根没有想到要用双指针,属于是长见识了,这道题的双…

Virtual box安装Ubuntu1804乱码

Virtual box安装Ubuntu1804乱码 1. 首先检查编码格式 运行以下命令打开locale配置文件: sudo nano /etc/default/locale2. 可能缺少字体,打开终端,先执行更新 sudo apt-get update 接着进入设置,搜索language,进入…

机器学习-搭建轻量级GPT2训练对话

在自己的机器上部署一个GPT简直太酷啦,因为模型数据缘故,所以这个机器人有时候傻傻的。。。 需要安装环境:python3.7 、Transformers4.2.0、pytorch1.7.0、nginx(映射网页文件) 我的系统:MAC m2 Mac默认是…

Jmeter如何安装jp@gc - Ultimate Thread Group插件(终极线程组)

首先明确一点,我们为什么要做压力测试? 压力测试是为了确保系统能够在负载高峰期和长时间运行的情况下保持高性能、稳定和可靠。同时也是软件开发生命周期中不可或缺的一环,帮助开发人员和系统管理员优化和调整系统,以提供卓越的…

2023春期末考试选择题R2-8计算最小生成树总权重详解

题目如图: 分析和计算: 题目给出一个图的邻接矩阵表示,要求求最小生成树的总开销。 根据Kruskal算法,根据邻接矩阵顶点连接情况,收集开销最小的边,直到所有顶点被收集,且无环路,即…

Debian 12 “bookworm“ 发布 - 通用操作系统

Debian 12 “bookworm” 发布 - 通用操作系统 基于 Linux kernel 6.1 LTS,支持 APFS 读写 请访问原文链接:https://sysin.org/blog/debian-12/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Debian 1…