问题思考
在自动化测试过程中,由于有些数据库操作并不是安全的,比如 DELETE 类型,上一次请求之后下一次再请求结果就不一样了。甚至有时接口之间的数据还会相互干扰, 导致接口断言失败时不能断定到底是接口程序引起的错误,还是测试数据变化引起的错误,那么该如何有效解决这个问题呢?
解决思路
通过测试数据库,每轮测试之前将数据初始化,这样避免数据干扰。
一、准备数据
将初始化数据使用 Yaml 来封装,可以将数据与代码分离,方便测试数据的维护。
api_user:
- username: xianghuan
email: 1788345@qq.com
groups: http://127.0.0.1:8000/groups/1/
- username: jack
email: 86962483@qq.com
groups: http://127.0.0.1:8000/groups/2/
api_group:
- name: tester
- name: developer
二、封装初始化操作
数据初始化操作主要包括:数据库连接,数据清除、数据插入、关闭数据库。
import pymysql
import yaml
class DB(object):
def __init__(self):
"""
连接数据库,创建连接,创建游标
"""
host = '127.0.0.1'
port = 3306
database = 'django_restful'
username = 'root'
password = 'root'
charset = 'utf8'
self.conn = pymysql.Connect(host=host, port=port, database=database,
user=username, password=password, charset=charset)
self.cursor = self.conn.cursor()
print('DB connects successfully...')
def clear_db(self, table):
"""
清理数据库
"""
sql = 'truncate ' + table + ';'
self.cursor.execute('set foreign_key_checks=0;')
self.cursor.execute(sql)
print('clear ' + table + ' successfully...')
# self.close_db()
def insert(self, table, tab_data):
"""
插入数据
:param table: 表名
:param tab_data:字典,字段名和值写在字典里面
:return:
"""
for key in tab_data:
tab_data[key] = "'"+str(tab_data[key])+"'"
key = ','.join(tab_data.keys())
values = ','.join(tab_data.values())
sql = 'insert into ' + table + '(' + key + ') ' + 'values' + '(' + values + ')' + ';'
print(sql)
self.cursor.execute(sql)
self.conn.commit()
print('insert into' + table + ' successfully...')
# self.close_db()
def close_db(self):
"""
关闭连接,关闭游标
"""
self.conn.close()
self.cursor.close()
print('close DB successfully...')
def init_data(self):
"""
初始化数据
"""
with open('init_data.yaml', 'r') as f:
data = yaml.load(f, Loader=yaml.FullLoader)
print(data)
for key, value in data.items():
self.clear_db(key) # 调用clear方法
for dict_val in value:
self.insert(key, dict_val) # 调用insert方法
self.close_db() # 关闭数据库
print('init data successfully...')
if __name__ == '__main__':
db = DB()
# db.clear_db('api_group')
# table_data = {'username': 'xianghuan', 'email': '23456@qq.com', 'groups': '2'}
# db.insert('api_user', table_data)
db.init_data()