mysql初始化的测试库_30. 初始化数据库环境

本文介绍了如何使用Python对MySQL数据库进行初始化操作,包括读取配置文件、清除与插入数据,以及创建测试数据。同时,展示了如何使用HTMLTestRunner生成测试报告并批量执行测试用例,确保数据库在测试前后保持一致。
摘要由CSDN通过智能技术生成

通过上面的测试用例我们发现,如果我们再次运行测试用例,会发现创建blog的那条测试用例无法通过,因为在我们第一次执行的时候,数据库已经存在了这个blog的id,而blod的id的是唯一的,所以如果我们经常回归测试用例,势必会造成某些用例无法通过。那么有没有解决方案呢?答案当然是有的,我们可以对数据库进行初始化操作,传统方式我们直接编写sql语句,但是我们有更简单的做法,我们用 python将sql语句进行封装。我们创建db_fixture文件夹,里面创建mysql_db.py文件,并在项目最外层创建db_config.ini文件,mysql_db.py主要目的是读取数据库信息,并对数据库进行初始化操作,db_config.ini主要是放数据库相关配置,项目结构如下所示:

acc9c0e3f7a50f17636a2f341bd14d36.png

修改db_config.ini

[mysqlconf]

host=127.0.0.1

port=3306

user=root

password=

db_name=blog

对数据库进行操作

mysql_db.py代码如下所示:

# coding=utf-8

import pymysql.cursors

import os

import configparser as cparser

# ======== Reading db_config.ini setting ===========

base_dir = str(os.path.dirname(os.path.dirname(__file__)))

base_dir = base_dir.replace('\\', '/')

file_path = base_dir + "/db_config.ini"

cf = cparser.ConfigParser()

cf.read(file_path)

host = cf.get("mysqlconf", "host")

port = cf.get("mysqlconf", "port")

db = cf.get("mysqlconf", "db_name")

user = cf.get("mysqlconf", "user")

password = cf.get("mysqlconf", "password")

# ======== MySql base operating ===================

class DB:

def __init__(self):

try:

# Connect to the database

self.connection = pymysql.connect(host=host,

port=int(port),

user=user,

password=password,

db=db,

charset='utf8mb4',

cursorclass=pymysql.cursors.DictCursor)

except pymysql.err.OperationalError as e:

print("Mysql Error %d: %s" % (e.args[0], e.args[1]))

# clear table data

def clear(self, table_name):

# real_sql = "truncate table " + table_name + ";"

real_sql = "delete from " + table_name + ";"

with self.connection.cursor() as cursor:

cursor.execute("SET FOREIGN_KEY_CHECKS=0;")

cursor.execute(real_sql)

self.connection.commit()

# insert sql statement

def insert(self, table_name, table_data):

for key in table_data:

table_data[key] = "'" + str(table_data[key]) + "'"

key = ','.join(table_data.keys())

# print(key)

value = ','.join(table_data.values())

# print(value)

real_sql = "INSERT INTO " + table_name + " (" + key + ") VALUES (" + value + ")"

# print(real_sql)

with self.connection.cursor() as cursor:

cursor.execute(real_sql)

self.connection.commit()

# close database

def close(self):

self.connection.close()

# init data

def init_data(self, datas):

for table, data in datas.items():

self.clear(table)

for d in data:

self.insert(table, d)

self.close()

if __name__ == '__main__':

db = DB()

table_name = "article_article"

data = {

'id': "1",

'title': "乡愁",

'author': "余光中",

'content': "小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头。长大后,乡愁是一张窄窄的船票,我在这头,新娘在那头",

'date_publish': '2019-05-31 08:55:15.056780'}

db.clear(table_name)

db.insert(table_name, data)

db.close()

首先, 读取 db_config.ini 配置文件。创建 DB 类, init()方法初始化, 通过 pymysql.connect()连接数据库。因为这里只用到数据库表的清除和插入, 所以只创建 clear()和 insert()两个方法。 其中, insert()方法对数据的插入做了简单的格式转化, 可将字典转化成 SQL 插入语句, 这样格式转化了方便了数据库表数据的创建。最后, 通过 close()方法用于关闭数据库连接。

新增blog_test_data.py文件

import sys

import time

sys.path.append('../db_fixture')

try:

from mysql_db import DB

except ImportError:

from .mysql_db import DB

# create data

data = {

# 对应数据库表字段

'article_article': [

{

'id': "1",

'title': "乡愁",

'author': "余光中",

'content': "小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头。长大后,乡愁是一张窄窄的船票,我在这头,新娘在那头",

'date_publish': '2019-05-31 08:55:15.056780'}

]

}

# insert

def init_data():

DB().init_data(data)

if __name__ == '__main__':

init_data()

生成测试报告及批量执行测试用例

生成测试报告也非常简单,我们直接使用HTMLTestRunner即可,添加HTMLTestRunner.py到目录结构。网上已有集成好的框架,我们直接下载即可。GitHub下载地址

然后我们创建report目录,用于存放生成的报告。因为我们不可能把所有的测试用例都写在一个.py文件里面,所以有时候我们需要批量执行测试用例 。我们创建run_tests.py,项目结构如下所示:

699c6db49eaff09e3bd474a0fea89174.png

run_tests.py如下代码所示:

import time, sys

from HTMLTestRunner import HTMLTestRunner

import unittest

sys.path.append('./testcases')

sys.path.append('./db_fixture')

# from db_fixture import role_test_data, notice_test_data, blacklist_test_data

# 指定测试用例为当前文件夹下的 interface 目录

test_dir = './testcases'

discover = unittest.defaultTestLoader.discover(test_dir, pattern='*_test.py')

if __name__ == "__main__":

now = time.strftime("%Y-%m-%d %H_%M_%S")

filename = './report/' + now + '_result.html'

fp = open(filename, 'wb')

runner = HTMLTestRunner(stream=fp,

title='blog系统接口测试报告',

description='Implementation Example with: ')

runner.run(discover)

fp.close()

运行run_tests.py,生成如下测试报告:

2c1391a0e7711fa3946d6df3985bff16.png

接口自动化框架总览

e675e06cc29ab7b432f54804c9fa0d31.png

所有代码已上传至个人GitHub,如需克隆请至我的GitHub下载

欢迎关注微信公众号:软件测试汪。软件测试交流群:809111560

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值