python接口测试韩志超_Python接口测试实战3(上)- Python操作数据库

课程目录

更多学习资料请加添加作者微信:lockingfree获取

本节内容

数据库操作

封装数据库操作

前言

在功能、接口测试中常常需要通过数据库的操作,来准备数据、检测环境及核对功能、接口的数据库操作是否正确。

在自动化测试中,就需要我们用代码连接数据库自动完成数据准备、环境检查及数据库断言的功能。

使用Python操作MySQL数据库这里我们需要用到三方库PyMySQl

安装方法:pip install pymysql

数据库操作

建立数据库连接 conn = pymysql.connect()

从连接建立操作游标 cur = conn.cursor()

使用游标执行sql(读/写) cur.execute(sql)

获取结果(读)/ 提交更改(写) cur.fetchall() / conn.commit()

关闭游标及连接 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))

封装数据库操作

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

新建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操作数据库,封装常用的数据库操作会更安全

调用方法(其他模块)

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可以完成各种业务操作

更改数据库有风险,操作需谨慎!!!

此为北京龙腾育才 Python高级自动化(接口测试部分)授课笔记

课程介绍

想要参加现场(北京)/网络课程的可以联系作者微信:lockingfree

高效学习,快速掌握Python自动化所有领域技能

同步快速解决各种问题

配套实战项目练习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值