zoukankan      html  css  js  c++  java
  • Python接口测试实战3(上)- Python操作数据库

    本节内容

    • 数据库操作
    • 封装数据库操作

    前言

    在功能、接口测试中常常需要通过数据库的操作,来准备数据、检测环境及核对功能、接口的数据库操作是否正确。
    在自动化测试中,就需要我们用代码连接数据库自动完成数据准备、环境检查及数据库断言的功能。
    使用Python操作MySQL数据库这里我们需要用到三方库PyMySQl

    安装方法:pip install pymysql

    数据库操作

    1. 建立数据库连接 conn = pymysql.connect()
    2. 从连接建立操作游标 cur = conn.cursor()
    3. 使用游标执行sql(读/写) cur.execute(sql)
    4. 获取结果(读)/ 提交更改(写) cur.fetchall() / conn.commit()
    5. 关闭游标及连接 cur.close();conn.close()
    import pymysql
    
    # 1. 建立连接
    conn = pymysql.connect(host='127.0.0.1',
                        port=3306,
                        user='root',
                        passwd='123456',   # password也可以
                        db='api_test',
                        charset='utf8')   # 如果查询有中文需要指定数据库编码
                        
    # 2. 从连接建立游标(有了游标才能操作数据库)
    cur = conn.cursor()
    
    # 3. 查询数据库(读)
    cur.execute("select * from user where name='张三'")
    
    # 4. 获取查询结果
    result = cur.fetchall()
    print(result)
    
    # 3. 更改数据库(写)
    cur.execute("delete from user where name='李四'")
    
    # 4. 提交更改
    conn.commit()  # 注意是用的conn不是cur
    
    # 5. 关闭游标及连接
    cur.close()
    conn.close()
    

    什么是游标? 游标类似文件句柄,可以逐条的访问数据库执行结果集。pymysql中只能通过游标来执行sql和获取结果

    查询操作
    使用cur.execute(), 执行数据库查询后无返回的是影响的行数,而非查询结果。我们要使用cur.fetchone()/cur.fetchmany()/cur.fetchall()来获取查询结果

    • cur.fetchone(): 获取一条数据(同时获取的数据会从结果集删除),返回元祖('张三','123456')
    • cur.fetchmany(3): 获取多条数据,返回嵌套元祖(('张三','123456'),('李四','123456'),("王五","123456"))
    • cur.fetchall(): 获取所有数据,返回嵌套元祖,(('张三','123456'),)(只有一条数据时)

    注意: 获取完数据后,数据会从数据集中删除,再次获取获取不到,如:

    cur.execute(select * from user where name='张三')
    print(cur.fetchone()) # 结果: ('张三','123456')
    print(cur.fetchone()) # 结果:None
    print(cur.fetchall()) # 结果:()
    

    所以我们需要重复使用查询结果时,需要将查询结果赋给某个变量

    cur.execute(select * from user where name='张三')
    result = cur.fetchall()
    print(result)  # 结果: ('张三','123456')
    print(result)  # 结果: ('张三','123456')
    

    修改操作
    执行修改数据库的操作后不立即生效,使用连接conn.commit()提交后才生效,支持事物及回滚

    try:
        cur.execute("insert into user (name,password) values ('张三', '123456')")
        cur.execute("insert into user (name, passwd) values ('李四'), '123456'") # 此处sql出错
        conn.commit()  # 使用连接提交所有更改
    except Exception as e:
        conn.rollback()  # 回滚所有更改(注意用的是conn)
        print(str(e))
    
    

    封装数据库操作

    由于经常要使用到数据库操作,建议将所有数据库操作封装成公用的数据库模块

    1. 新建db.py, 代码如下:
    import pymysql
    
    
    # 获取连接方法
    import pymysql
    
    
    # 获取连接方法
    def get_db_conn():
        conn = pymysql.connect(host='127.0.0.1',
                               port=3306,
                               user='test',
                               passwd='123456',  
                               db='api_test',
                               charset='utf8')  # 如果查询有中文,需要指定测试集编码
    
        return conn
    
    
    # 封装数据库查询操作
    def query_db(sql):
        conn = get_db_conn()  # 获取连接
        cur = conn.cursor()  # 建立游标
        cur.execute(sql)  # 执行sql
        result = cur.fetchall()  # 获取所有查询结果
        cur.close()  # 关闭游标
        conn.close()  # 关闭连接
        return result  # 返回结果
    
    
    # 封装更改数据库操作
    def change_db(sql):
        conn = get_db_conn()  # 获取连接
        cur = conn.cursor()  # 建立游标
        try:
            cur.execute(sql)  # 执行sql
            conn.commit()  # 提交更改
        except Exception as e:
            conn.rollback()  # 回滚
        finally:
            cur.close()  # 关闭游标
            conn.close()  # 关闭连接
    
    
    # 封装常用数据库操作
    def check_user(name):
        # 注意sql中''号嵌套的问题
        sql = "select * from user where name = '{}'".format(name)
        result = query_db(sql)
        return True if result else False
    
    
    def add_user(name, password):
        sql = "insert into user (name, passwd) values ('{}','{}')".format(name, password)
        change_db(sql)
    
    
    def del_user(name):
        sql = "delete from user where name='{}'".format(name)
        change_db(sql)
    

    相比用例中直接使用sql操作数据库,封装常用的数据库操作会更安全

    1. 调用方法(其他模块)
    from db import *
    
    if check_user("张三"):
        del_user("张三")
    

    补充:另一种封装方法

    由于上面这种封装方法,每一次查询都会建立一次数据库连接,效率较低,也可以采用下面面向对象的封装方法

    db2.py

    import pymysql
    
    
    class DB:
        def __init__(self):
            self.conn = pymysql.connect(host='127.0.0.1',
                        port=3306,
                        user='root',
                        passwd='123456',   # passwd 不是 password
                        db='api_test')
            self.cur = self.conn.cursor()
            
        def __del__(self): # 析构函数,实例删除时触发
            self.cur.close()
            self.conn.close()
            
        def query(self, sql):
            self.cur.execute(sql)
            return self.cur.fetchall()
        
        def exec(self, sql):
            try:
                self.cur.execute(sql)
                self.conn.commit()
            except Exception as e:
                self.conn.rollback()
                print(str(e))
        
        def check_user(self,name):
            result = self.query("select * from user where name='{}'".format(name))
            return True if result else False
            
        def del_user(self, name)
            self.exec("delete from user where name='{}'".format(name))
            
    

    使用方法

    from db2 import DB:
    
    db = DB()  # 实例化一个数据库操作对象
    if db.check_user("张三"):
        db.del_user("张三")
    

    后言

    • 数据库连接信息建议写到配置文件中,从配置文件中读取
    • sql语句建议先在手工测试一下没有语法问题再进行封装
    • 通过封装各种sql可以完成各种业务操作
    • 更改数据库有风险,操作需谨慎!!!



  • 相关阅读:
    896. Monotonic Array单调数组
    865. Smallest Subtree with all the Deepest Nodes 有最深节点的最小子树
    489. Robot Room Cleaner扫地机器人
    JavaFX
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
  • 原文地址:https://www.cnblogs.com/gdg87813/p/11225535.html
Copyright © 2011-2022 走看看