场景
sqlite3
数据库是我们开发程序时常用来存储数据的数据库,如果发布产品时我们需要一些初始化数据才能正常运行产品,那么这个数据库测试组如何进行校验是否正确呢?
说明
-
sqlite3
的提供了C语言
的动态库进行操作,但是测试组并不都会使用C语言
开发测试程序的,而且使用C
开发的程序还需要进行编译链接运行,比较慢,这会影响测试编写测试脚本的效率。 -
测试一般使用是
Python
作为自动化测试语言,Python3
其实也集成了sqlite3
库作为标准模块进行了发布,我们可以直接使用import sqlite3
就可以引用发布,并通过参考Python sqlite3 API进行操作。 -
吐槽下
Python
的API
还是看不习惯,应该说不够标准。类似于Java
或C/C++
的都对每个参数进行解析,之后还对返回值进行说明,比如以下的看就比较明确。Python
的却是分段落,每个段落要仔细看内容才能知道讲的什么参数或返回值,有时候返回值并不是最后一行说明,可能穿插在某一个段落里,不小心就错过了。这是我不喜欢用Python
的原因之一,看API
十分费劲。
para1: xxx
para2: xxx
return: xxx
例子
- 以下例子通过打开数据库并统计所有表的行数来确认数据库是否有损坏。当然如果知道校验规则,也可以对数据进行检查。
import sqlite3
from sqlite3.dbapi2 import OperationalError
import sys
# SQLite natively supports only the types TEXT, INTEGER, REAL,
# BLOB and NULL
def checkDb(dbPath):
# 'file:path/to/database?mode=ro'
con = None
try:
con = sqlite3.connect('file:'+dbPath+'?mode=ro', uri=True)
except OperationalError as identifier:
print("Db Path Invalid %s" % (dbPath))
return
cur = con.cursor()
sqlTables = "SELECT name FROM sqlite_master where type='table'"
# 1. 使用Row对象,逐行获取.
print("============================")
cur.execute(sqlTables)
oneRow = cur.fetchone()
array1 = []
while(oneRow != None):
print(oneRow[0])
array1.append(oneRow[0])
oneRow = cur.fetchone()
print("============================")
# 2. 一次过获取所有行.
cur.execute(sqlTables)
for one in cur.fetchall():
print(one[0])
print("============================")
# 3. 统计每个表的行数.
for one in array1:
t = (one,)
cur.execute("SELECT COUNT(1) FROM "+one)
print("%s(%d) " % (one,cur.fetchone()[0]))
cur.close()
if __name__ == "__main__":
checkDb(sys.argv[1])
pass
输出
运行方式: DbChecker.py xxx.db
============================
contact
sms
photo
video
music
book
app
info
============================
contact
sms
photo
video
music
book
app
info
============================
contact(1)
sms(1)
photo(0)
video(0)
music(0)
book(0)
app(0)
info(1)