接口自动化测试框架之pymysql

为什么接口自动化需要操作mysql?

业务需要

接口测试中很多业务场景会涉及到mysql的增删改查操作,如注册这个常见的业务,注册成功后,需要往user表新增一条新的记录;注册时输入账号,需要去user表查询这个账号存不存在,存在了就不能注册,不存在则能注册;修改密码,需要去到user表中修改password字段的值;删除用户,需要去到user表中删除记录。凡是业务上涉及到数据库的增删改查操作,接口自动化测试中都需要操作数据库。

存放测试数据

数据库也是一个不错的存储测试数据的地方。当测试数据过多时,我们也可以存放在数据库中,然后在接口测试时再将数据读取出来。

人工方式如何操作mysql?

人工方式操作mysql,我们可以通过命令行方式,也可以通过具有图形化界面的软件(如:navicat、sqlyog等)来操作。此处我们使用图形化界面的方式来操作mysql。

建立连接

首先,我们操作数据库里的数据之前,需要连接数据库。连接数据库我们一般需要用到主机的IP地址、端口号(mysql的一般为3306)、用户名、密码。这几个数据都正确,便能成功连接到数据库。
在这里插入图片描述

通过sql语句对数据进行操作

对数据进行增删改查的操作时,我们需要用到sql语句。如下,我们查询数据库中某张表时,就需要用到select语句:
在这里插入图片描述

python中如何操作mysql?

有了上面人工操作mysql的借鉴,我们通过python来操作mysql也是一样的道理,先建立数据库连接,然后再通过sql语句来操作数据库,区别就在于一个是用软件,一个是用代码罢了。
这里我们使用第三方模块:pymysql来进行数据库操作。

代码实操

建立连接

#通过connect方法,传入主机地址、端口号、用户名、密码等参数来建立数据库连接
con = pymysql.connect(
    host = "192.168.1.151",
    port = 3306,
    user = "root",
    password = "123456",
    charset = "utf8"
)

建立游标

在进行sql操作之前,我们需要建立一个游标对象。那么什么是游标呢?它相当于一个数据操作的位置标识符,可以理解成光标,光标到了表中的那一行,这一行就被执行操作。
举个例子,我们现在假设要进行select的sql操作:
select * from futureloan.member limit 10;
那么它会在表中一行一行查。游标在第一行,查询出第一行记录,接着游标跳到第二行,查询第二行记录,接着游标跳到第三行……
如下,就是游标在第5行的位置:
在这里插入图片描述
为了更精确地理解游标的概念,下面引用别的网站上的解释:

查询语句可能返回多条记录,如果数据量非常大,需要使用游标来逐条读取查询结果集中的记录。应用程序可以根据需要滚动或浏览其中的数据。本篇介绍游标的概念、分类、以及基本操作等内容。一:认识游标

游标是SQL
Server的一种数据访问机制,它允许用户访问单独的数据行。用户可以对每一行进行单独的处理,从而降低系统开销和潜在的阻隔情况,用户也可以使用这些数据生成的SQL代码并立即执行或输出。

1.游标的概念

游标是一种处理数据的方法,主要用于存储过程,触发器和
T_SQL脚本中,它们使结果集的内容可用于其它T_SQL语句。在查看或处理结果集中向前或向后浏览数据的功能。类似与C语言中的指针,它可以指向结果集中的任意位置,当要对结果集进行逐条单独处理时,必须声明一个指向该结果集中的游标变量。
SQL Server
中的数据操作结果都是面向集合的,并没有一种描述表中单一记录的表达形式,除非使用WHERE子句限定查询结果,使用游标可以提供这种功能,并且游标的使用和操作过程更加灵活、高效。

2.游标的优点

SELECT
语句返回的是一个结果集,但有时候应用程序并不总是能对整个结果集进行有效地处理,游标便提供了这样一种机制,它能从包括多条记录的结果集中每次提取一条记录,游标总是与一跳SQL选择语句相关联,由结果集和指向特定记录的游标位置组成。使用游标具有一下优点:
(1).允许程序对由SELECT查询语句返回的行集中的每一次执行相同或不同的操作,而不是对整个集合执行同一个操作。
(2).提供对基于游标位置中的行进行删除和更新的能力。 (3).游标作为数据库管理系统和应用程序设计之间的桥梁,将两种处理方式连接起来。

熟悉完游标的概念之后,我们开始创建游标:

#通过connect的cursor方法,便可初始化一个游标对象
cursor = con.cursor()
print(cursor)

执行结果:
在这里插入图片描述
游标对象是我们操作sql前必须声明的对象。有了游标对象,我们便可进行sql操作了。

查询语句

#准备好查询的sql语句
sql = "SELECT * FROM futureloan.member LIMIT 10;"
#通过游标对象来执行sql语句
cursor.execute(sql)
"""
游标对象执行完sql之后,可通过几种方式返回结果,一种是fetchall,返回所有结果;一种是fetchone,只
返回结果中的第一条,可根据需要来进行选择。
"""
#返回所有数据
result_all = cursor.fetchall()
pprint.pprint(result_all)
#返回单条数据
result_one = cursor.fetchone()
print(result_one)

执行结果如下:
在这里插入图片描述
可看到最后的fetchone方法返回了None,这是因为前面的游标对象fetchall时,游标已经到了最后一行了,这时你再想查询第一行是查询不了的(因为游标不在第一行上)。此时我们就需要创建第二个游标对象来fetchone:

#通过connect的cursor方法,便可初始化一个游标对象
cursor = con.cursor()
print(cursor)

#准备好查询的sql语句
sql = "SELECT * FROM futureloan.member LIMIT 10;"
#通过游标对象来执行sql语句
cursor.execute(sql)
"""
游标对象执行完sql之后,可通过几种方式返回结果,一种是fetchall,返回所有结果;一种是fetchone,只
返回结果中的第一条,可根据需要来进行选择。
"""
#返回所有数据
result_all = cursor.fetchall()
pprint.pprint(result_all)
#返回单条数据
cursor2 = con.cursor()
cursor2.execute(sql)
result_one = cursor2.fetchone()
print(result_one)

执行结果如下,可看到fetchone的结果有返回了:
在这里插入图片描述

sql执行结果转换成可操作的列表格式

在上面的执行结果中,我们可以看到返回的结果是元祖格式,而元祖是不可操作的。那这时我们要对结果进行操作怎么办呢?
我们可以进入connect方法看下:
进入之后,可以看到如下的代码,这时我们进入最后一个Connect方法:

connect = Connection = Connect

进入到Connect方法,可看到最后调用的是Connection方法,我们再进入到这个方法里:

def Connect(*args, **kwargs):
    """
    Connect to the database; see connections.Connection.__init__() for
    more information.
    """
    from .connections import Connection
    return Connection(*args, **kwargs)

这里我们可以看到初始化函数,这些参数就是我们建立数据库连接时所需传入的参数:

def __init__(self, host=None, user=None, password="",
                 database=None, port=0, unix_socket=None,
                 charset='', sql_mode=None,
                 read_default_file=None, conv=None, use_unicode=None,
                 client_flag=0, cursorclass=Cursor, init_command=None,
                 connect_timeout=10, ssl=None, read_default_group=None,
                 compress=None, named_pipe=None,
                 autocommit=False, db=None, passwd=None, local_infile=False,
                 max_allowed_packet=16*1024*1024, defer_connect=False,
                 auth_plugin_map=None, read_timeout=None, write_timeout=None,
                 bind_address=None, binary_prefix=False, program_name=None,
                 server_public_key=None):

这里我们看到有一个参数是cursorclass,它的默认值是Cursor,也就是我们刚刚用到的游标类。我们点进去,可看到有一个类:

class DictCursor(DictCursorMixin, Cursor):
    """A cursor which returns results as a dictionary"""

这个类就是把游标执行返回的结果转换成字典。
现在就好办了,我们只需在建立数据库时传入一个cursorclass,将它指向DictCursor,这样游标返回的结果就是字典了:

import pymysql
import pprint
from pymysql.cursors import DictCursor

#通过connect方法,传入主机地址、端口号、用户名、密码等参数来建立数据库连接
con = pymysql.connect(
    host = "192.168.1.151",
    port = 3306,
    user = "root",
    password = "123456",
    charset = "utf8",
    cursorclass = DictCursor
)
#通过connect的cursor方法,便可初始化一个游标对象
cursor = con.cursor()
print(cursor)

#准备好查询的sql语句
sql = "SELECT * FROM futureloan.member LIMIT 10;"
#通过游标对象来执行sql语句
cursor.execute(sql)
"""
游标对象执行完sql之后,可通过几种方式返回结果,一种是fetchall,返回所有结果;一种是fetchone,只
返回结果中的第一条,可根据需要来进行选择。
"""
#返回所有数据
result_all = cursor.fetchall()
pprint.pprint(result_all)
#返回单条数据
cursor2 = con.cursor()
cursor2.execute(sql)
result_one = cursor2.fetchone()
print(result_one)

执行结果如下:
在这里插入图片描述
可看到结果已经变为字典了,这样我们就能操作返回结果里面的数据了。

封装

import pymysql
from pymysql.cursors import DictCursor

class mysql_handler():
    #初始化,准备需要建立数据库连接的所有参数
    def __init__(
            self,
            host = None,
            port = 3306,
            user = None,
            password = None,
            charset="utf8",
            cursorclass=DictCursor
    ):
       #建立数据库连接,传入准备好的参数
       self.con = pymysql.connect(
           host=host,
           port=port,
           user=user,
           password=password,
           charset=charset,
           cursorclass=cursorclass
       )
       self.cursor = self.con.cursor()
    #查询方法,传入需要执行查询的sql,以及控制是选择fetchall还是fetchone的参数is_one
    def query(self,sql,is_one=True):
        #调用游标对象的execute方法执行查询的sql
        self.cursor.execute(sql)
        #如果is_one为true,则只返回结果中的第一条记录
        if is_one:
            return self.cursor.fetchone()
        #如果is_one为false,则返回结果中的所有记录
        return self.cursor.fetchall()
    #关闭游标对象及连接对象
    def close(self):
        self.cursor.close()
        self.con.close()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值