使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 35--二次封装MySQL数据库连接操作

测试学习记录,仅供参考!

MySQL数据库连接

封装MySQL数据库连接操作;一般像这种连接之类的是做到配置文件中;

在测试环境测试功能性需求,测试完成之后清理测试时产生的测试数据,需要到测试库里面去操作;

实现测试结束后清理测试数据(数据库调用完成后释放资源)

例如:

每次跑完测试用例之后,需要到数据库中把注册用户给删除(清理)掉,下次再跑测试用例时可以重复的使用测试数据;

若没有清理测试数据的话,每次跑测试用例之前需要手动修改相关的测试(注册用户)数据;

测试场景:每次跑完(测试用例)数据之后,连接到数据库,把本次的数据删除掉;下次再执行时,每次就可以使用同一套数据去验证相关的页面功能;数据之间不会相互污染;

目的:研究数据库,做执行完的后置操作"清理数据";

一、示例

1、 以开源电商商城系统为例(之前新建过名称为的 ecshop 的空数据库);

2、 打开 XAMPP Control Panel 控制面板→启动 apache 和 MySQL 服务;

3、成功启动 apache 和 MySQL 服务(内置 MySQL)后,可以使用工具去测试一下数据库连接(连接数据库的工具有很多种,自行选择)

连接名:ECShop

主机:localhost(本地 127.0.0.1)

端口:3306(默认)

用户名:root

密码:密码若未设置过可以为空

4、数据库连接成功后可自行查看商城网站的数据库(ecshop);

例如:ecs_goods 表是后台管理中心添加的商品信息;

ecs_users 表是用户信息;等等(自行查看);

5、或者直接点击 XAMPP Control Panel 控制面板 MySQL 服务中的 Admin 按钮查看在线网页版数据库;

二、安装

6、 在项目中代码实现;使用 python 第三方模块,安装第三方库;

命令行安装;

复制代码
pip install pymysql

Python 解释器→软件包安装;

三、实现方式

7、 在项目根目录 util_tools 软件包下新建一个名称为 connectMysql.py (连接 mysql 数据库)的 Python 文件;

(1)、导包,第三方库 pymysql 模块、日志和解析 ini 文件模块;

(2)、conf = ConfigParse():在最外层先实例化读取解析 ini文件对象;

(3)、class ConnectMysql: 封装去读取 mysql 数据库的方法(以类的形式封装起来);

(4)、def init(self):初始化构造函数先写好;

(5)、调用 pymysql 模块 .点 connect() 方法去连接数据库;

connect 方法中需要传的参数有很多个,许多都是默认的可以不传,这里需要用到的有 5 个;

user:数据库用户名 user='root'

password:数据库密码(密码没有可以为空) password=''

host:主机 host='localhost'

database:需要连接哪个数据库名 database='ecshop'

port:端口号 port=3306

(6)、要连接数据库需要传入五个参数才能访问到数据库,最后把结果返回出去给一个实例变量(后面需要在别的函数里面去调用);

复制代码
# 导包
import pymysql
from util_tools.handle_data.configParse import ConfigParse
from util_tools.logs_util.recordlog import logs

# 在最外层先实例化读取ini文件对象
conf = ConfigParse()

class ConnectMysql:

    # 初始化构造函数
    def __init__(self):
        # 返回出去给实例变量 self.conn--拿到数据库连接对象
        self.conn = pymysql.connect(host='localhost', port=3306, user='root', password='', database='ecshop')

8、但是数据库的连接已经存放到配置文件(根目录 config 软件包 config.ini 文件)中了,所以通过已经封装好的读取解析 ini 配置文件(根目录 util_tools 软件包 handle_data 软件包 configParse.py 文件)去拿到里面的数据库相关信息,后续若有需要更改时,不需要修改代码,直接改配置文件即可;

9、优化项目根目录 util_tools 软件包 handle_data 软件包下 configParse.py 解析文件,添加专门读取 mysql 数据函数方法;

复制代码
import configparser
from util_tools.logs_util.recordlog import logs
from config.setting import FILE_PATH

class ConfigParse:
    """解析.ini配置文件"""

    # 初始化函数--传一个需要解析的文件路径--指定默认读取配置文件路径
    def __init__(self, file_path=FILE_PATH['ini']):
        # 调用 configparser 模块里面的 ConfigParser 类(调用方法去解析配置文件)
        self.config = configparser.ConfigParser()
        # self.file_path = 等于初始化传进来的文件路径
        self.file_path = file_path
        # 定义好 read_config 方法后,再调用
        self.read_config()

    # 定义一个方法--读取配置文件
    def read_config(self):
        # 通过 config 调用 configparser 模块 ConfigParser 类里面的对象,调用 read() 函数去读取 传进来的配置文件路径
        self.config.read(self.file_path)

    # 解析文件内容--第一个 section 参数是配置文件中的头参数"[HOST]、[MYSQL]",第二个 option 参数是所属头参数下面的键值参数
    def get_value(self, section, option):
        try:
            # 直接调用 config 这个对象 .get() 再把这两个"section, option"参数传进来--最后把结果返回出去
            value = self.config.get(section, option)
            return value
        except Exception as e:
            logs.error(f'解析配置文件出现异常,原因为{e}')

    # 定义一个方法只用于获取 host--只传一个 option 参数
    def get_host(self, option):
        # 调用上面的 get_value 方法--第一个参数写固定,第二个参数才去传 option --最后直接返回
        return self.get_value('HOST', option)

    # 这个函数专门去读取mysql里面的数据
    def get_section_mysql(self, option):
        return self.get_value('MYSQL', option)

10、优化项目根目录 config 软件包下 config.ini 文件内容;更改正确的数据信息;

复制代码
[HOST]
host = http://localhost:8088/ecshop

[MYSQL]
host = localhost
port = 3306
username = root
password = 
database = ecshop

11、 优化 connectMysql.py 文件;

(1)、定义一个字典;

值可以通过配置文件去读取,通过最外层的实例化对象 conf 点 .get_section_mysql 方法去读取;

(2)、添加异常处理,像这种连接的均可以加个异常处理;

复制代码
# 导包
import pymysql
from util_tools.handle_data.configParse import ConfigParse
from util_tools.logs_util.recordlog import logs

# 在最外层先实例化读取ini文件对象
conf = ConfigParse()

class ConnectMysql:

    # 初始化构造函数
    def __init__(self):

        # 定义一个字典,里面去写数据库的配置参数,值通过配置文件去读取
        self.conf = {
            'host': conf.get_section_mysql('host'),
            'port': int(conf.get_section_mysql('port')),
            'user': conf.get_section_mysql('username'),
            'password': conf.get_section_mysql('password'),
            'database': conf.get_section_mysql('database')
        }
        try:
            # 返回出去给实例变量 self.conn--拿到数据库连接对象
            # self.conn = pymysql.connect(host='localhost', port=3306, user='root', password='', database='ecshop')
            # 关键字传参在python中可以通过 **self.conf 以key:value形式--拿到数据库连接对象
            self.conn = pymysql.connect(**self.conf)
            # 获取操作游标--通过连接对象 点 .cursor() 去获取连接数据库的游标--然后把它的对象给返回出去
            self.cursor = self.conn.cursor()
            logs.info(f'成功连接到数据库,数据库ip为:{self.conf.get("host")}')
        except Exception as e:
            logs.error(f'连接数据库失败,原因为:{e}')

四、释放资源(关闭连接对象)

打开文件、打开数据库等(缓存等等) 一系列操作,最后均需要释放资源,如运行很长时间的话,产生数据量庞大,会造成"内存"相关的问题(自行学习了解内存问题);

12、优化 connectMysql.py 文件;添加关闭连接对象方法;

复制代码
# 导包
import pymysql
from util_tools.handle_data.configParse import ConfigParse
from util_tools.logs_util.recordlog import logs

# 在最外层先实例化读取ini文件对象
conf = ConfigParse()

class ConnectMysql:

    # 初始化构造函数
    def __init__(self):

        # 定义一个字典,里面去写数据库的配置参数,值通过配置文件去读取
        self.conf = {
            'host': conf.get_section_mysql('host'),
            'port': int(conf.get_section_mysql('port')),
            'user': conf.get_section_mysql('username'),
            'password': conf.get_section_mysql('password'),
            'database': conf.get_section_mysql('database')
        }
        try:
            # 返回出去给实例变量 self.conn--拿到数据库连接对象
            # self.conn = pymysql.connect(host='localhost', port=3306, user='root', password='', database='ecshop')
            # 关键字传参在python中可以通过 **self.conf 以key:value形式--拿到数据库连接对象
            self.conn = pymysql.connect(**self.conf)
            # 获取操作游标--通过连接对象 点 .cursor() 去获取连接数据库的游标--然后把它的对象给返回出去
            self.cursor = self.conn.cursor()
            logs.info(f'成功连接到数据库,数据库ip为:{self.conf.get("host")}')
        except Exception as e:
            logs.error(f'连接数据库失败,原因为:{e}')

    # 关闭连接对象
    def close(self):
        # if判断一下 连接 和 游标 存在的情况
        if self.conn and self.cursor:
            # 直接调用里面close()方法关闭
            self.conn.close()
            self.cursor.close()
        return True

未完待续。。。

相关推荐
DechinPhy1 小时前
使用Python免费合并PDF文件
开发语言·数据库·python·mysql·pdf
inputA2 小时前
【rt-thread】点灯实验和按键输入实验
c语言·笔记·学习·实时操作系统
驾数者2 小时前
Flink SQL自定义函数开发:标量、聚合、表值函数实现
python·sql·flink
qq_252614412 小时前
python爬虫爬取视频
开发语言·爬虫·python
Radan小哥2 小时前
Docker学习笔记—day013
笔记·学习·docker
PNP Robotics2 小时前
聚焦具身智能,PNP机器人展出力反馈遥操作,VR动作捕捉等方案,获得中国科研贡献奖
大数据·人工智能·python·学习·机器人
咸鱼加辣2 小时前
【python面试】你x的启动?
开发语言·python
八月ouc2 小时前
Python实战小游戏(二): 文字冒险游戏
数据结构·python·文字冒险
黑客思维者2 小时前
机器学习016:监督学习【分类算法】(支持向量机)-- “分类大师”入门指南
人工智能·学习·机器学习·支持向量机·分类·回归·监督学习