30. 初始化數據庫環境

經過上面的測試用例咱們發現,若是咱們再次運行測試用例,會發現建立blog的那條測試用例沒法經過,由於在咱們第一次執行的時候,數據庫已經存在了這個blog的id,而blod的id的是惟一的,因此若是咱們常常回歸測試用例,勢必會形成某些用例沒法經過。那麼有沒有解決方案呢?答案固然是有的,咱們能夠對數據庫進行初始化操做,傳統方式咱們直接編寫sql語句,可是咱們有更簡單的作法,咱們用 python將sql語句進行封裝。咱們建立db_fixture文件夾,裏面建立mysql_db.py文件,並在項目最外層建立db_config.ini文件,mysql_db.py主要目的是讀取數據庫信息,並對數據庫進行初始化操做,db_config.ini主要是放數據庫相關配置,項目結構以下所示:
image.pnghtml

修改db_config.ini

[mysqlconf]  
host=127.0.0.1
port=3306
user=root
password=
db_name=blog

對數據庫進行操做

mysql_db.py代碼以下所示:python

# 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()方法用於關閉數據庫鏈接。mysql

新增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.pnggit

run_tests.py以下代碼所示:github

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.pngsql

接口自動化框架總覽

image.png

全部代碼已上傳至我的GitHub,如需克隆請至個人GitHub下載數據庫

歡迎關注微信公衆號:軟件測試汪。軟件測試交流羣:809111560微信

相關文章
相關標籤/搜索