經過上面的測試用例咱們發現,若是咱們再次運行測試用例,會發現建立blog的那條測試用例沒法經過,由於在咱們第一次執行的時候,數據庫已經存在了這個blog的id,而blod的id的是惟一的,因此若是咱們常常回歸測試用例,勢必會形成某些用例沒法經過。那麼有沒有解決方案呢?答案固然是有的,咱們能夠對數據庫進行初始化操做,傳統方式咱們直接編寫sql語句,可是咱們有更簡單的作法,咱們用 python將sql語句進行封裝。咱們建立db_fixture文件夾,裏面建立mysql_db.py文件,並在項目最外層建立db_config.ini文件,mysql_db.py主要目的是讀取數據庫信息,並對數據庫進行初始化操做,db_config.ini主要是放數據庫相關配置,項目結構以下所示:
html
[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
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,項目結構以下所示:
git
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,生成以下測試報告:
sql
全部代碼已上傳至我的GitHub,如需克隆請至個人GitHub下載數據庫
歡迎關注微信公衆號:軟件測試汪。軟件測試交流羣:809111560微信