欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

接口自动化测试框架之pymysql

程序员文章站 2024-03-19 20:09:52
...

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

业务需要

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

存放测试数据

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

人工方式如何操作mysql?

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

建立连接

首先,我们操作数据库里的数据之前,需要连接数据库。连接数据库我们一般需要用到主机的IP地址、端口号(mysql的一般为3306)、用户名、密码。这几个数据都正确,便能成功连接到数据库。
接口自动化测试框架之pymysql

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

对数据进行增删改查的操作时,我们需要用到sql语句。如下,我们查询数据库中某张表时,就需要用到select语句:
接口自动化测试框架之pymysql

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行的位置:
接口自动化测试框架之pymysql
为了更精确地理解游标的概念,下面引用别的网站上的解释:

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

游标是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)

执行结果:
接口自动化测试框架之pymysql
游标对象是我们操作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)

执行结果如下:
接口自动化测试框架之pymysql
可看到最后的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的结果有返回了:
接口自动化测试框架之pymysql

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)

执行结果如下:
接口自动化测试框架之pymysql
可看到结果已经变为字典了,这样我们就能操作返回结果里面的数据了。

封装

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()
相关标签: 接口自动化测试