课程目录

Python接口测试实战1(上)- 接口测试理论

Python接口测试实战1(下)- 接口测试工具的使用

Python接口测试实战2 - 使用Python发送请求

Python接口测试实战3(上)- Python操作数据库

Python接口测试实战3(下)- unittest测试框架

Python接口测试实战4(上) - 接口测试框架实战

Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例

Python接口测试实战5(上) - Git及Jenkins持续集成

Python接口测试实战5(下) - RESTful、Web Service及Mock Server

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

PDF下载:链接:https://pan.baidu.com/s/1OwAa8nl1eeBj8fcrgd3sBA 密码:e9d8

本节内容

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

前言

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

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

使用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可以完成各种业务操作
  • 更改数据库有风险,操作需谨慎!!!

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

课程介绍

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

  1. 高效学习,快速掌握Python自动化所有领域技能
  2. 同步快速解决各种问题
  3. 配套实战项目练习

Python接口测试实战3(上)- Python操作数据库的更多相关文章

  1. Python接口测试实战2 - 使用Python发送请求

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  2. Python接口测试实战1(上)- 接口测试理论

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  3. Python接口测试实战5(上) - Git及Jenkins持续集成

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  4. Python接口测试实战4(上) - 接口测试框架实战

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  5. Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  6. Python接口测试实战5(下) - RESTful、Web Service及Mock Server

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  7. Python接口测试实战3(下)- unittest测试框架

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  8. Python接口测试实战1(下)- 接口测试工具的使用

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  9. python学习笔记(十 二)、操作数据库

    每一种语言都少不了多数据库进行各种操作. python支持多种数据库.有关python支持的数据库清单,请参阅:https://wiki.python.org/moin/DatabaseInterfa ...

随机推荐

  1. iOS沙盒目录文件操作

    简介 沙盒(NSHomeDirectory())中总共有四个文件夹,documents.tmp.app.Library; 手动保存的文件在documents文件里; Nsuserdefaults保存的 ...

  2. 3.C++和C混合编程

    最近经常看到头文件中有 #ifdef __cplusplus extern "C" { #endif ....... #ifdef __cplusplus } #endif 这样的 ...

  3. On Java 8中文版 英雄召集令

    这是该项目的GITHUB地址:https://github.com/LingCoder/OnJava8 广招天下英雄,为开源奉献!让我们一起来完成这本书的翻译吧! 如果您在阅读本书的过程中有发现不明白 ...

  4. GoBelieve service部署常见问题总结

    问题1: 大家好,我按照文档的步骤编译im时(make install),出现 can't load package: package main: app_route.go:1:1: expected ...

  5. kafka restful api功能介绍与使用

    前述 采用confluent kafka-rest proxy实现kafka restful service时候(具体参考上一篇笔记),通过http协议数据传输,需要注意的是采用了base64编码(或 ...

  6. 关于xib控件变成框框An internal error occurred

    前段时间在进行系统适配的时候,由于在两个不同版本的Xcode之间进行了代码运行调试,导致回到老版本继续开发时xib里面所有的控件全部变成了蓝色的框框...真是哔了狗了 报错信息: an interna ...

  7. underscore.js常用方法整理(慢慢完善)

    整理自Underscore.js (1.8.3) 中文文档,http://www.css88.com/doc/underscore/ 1. extend _.extend() 复制对象中的所有属性到目 ...

  8. 《Redis设计与实现》- 数据库

    1. 服务器中数据库结构 Redis 服务器将所有数据库都保存在服务器状态 redisServer 结构的 db 数组中,由 redisDb 结构代表一个数据库 struct redisServer ...

  9. 20190313-时间和日期-Time

    概述 在Python中,与时间处理相关的模块有:time.datetime以及calendar,Python中通常有这几种方式表示时间:时间戳.格式化的时间字符串.时间元组(struct_time 共 ...

  10. MySQL用户账户管理/权限管理/资源限制

    MySQL 的权限表在数据库启动的时候就载入内存,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限范围内的各种操作了. mysql 的权限体系大致分为5个层级: ...