zoukankan      html  css  js  c++  java
  • 30. 初始化数据库环境

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

    接口自动化框架总览

    image.png

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

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

  • 相关阅读:
    RecyclerView+CardView简单使用
    Android六大进程间通信方式总结之一:基本知识
    前台服务
    Notification
    SQLite的基本用法
    SharePreferences基本用法
    自定义控件和使用的两种基本方法
    AsyncTask的简单使用
    Java Servlet调用数据库复习
    JDBC数据源(DataSource)的简单实现
  • 原文地址:https://www.cnblogs.com/suim1218/p/11023042.html
Copyright © 2011-2022 走看看