gpt4 book ai didi

python - 假设+单元测试测试锁定sqlite数据库

转载 作者:行者123 更新时间:2023-11-30 22:07:25 27 4
gpt4 key购买 nike

我正在尝试测试我的数据库类。这是它的简化示例。

class Database:
""" it has more methods but I show only the most important """
def __init__(self, name):
# let's think the db-file exists with tables
self.conn = sqlite3.connect(name)
self.cursor = self.conn.cursor()

def __del__(self):
""" Here I close connection if the object was destroyed """
self.conn.close()

def insert(self, col1, col2, col3):
""" The key method where problem is """
self.cursor.execute(insert_query.format(col1, col2, col3))
self.conn.commit() # here I do commit to apply changes with DB

所以,我想检查insert方法。测试用例类是:

class DatabaseTestCase(unittest.TestCase):
""" it has other methods but the problem is here """
@given(col1=text(col1_params), col2=text(col2_params), col3=text(col3_params))
def test_db_insert(self, col1, col2, col3):
db = Database("test.db")
input_data = col1, col2, col3

# insert with commit (see Database example above)
db.insert(*input_data)

# delete object and close connection
del db

# recreate the object to get sure my data was added and
# the changes were commited
db = Database("test.db")

# I use the way not to use my own methods of Database object
cursor = db.conn.execute("SELECT * FROM mytable WHERE col1 = '{}'".format(col1))
result = cursor.fetchone()

for input_item, row_item in zip(input_data, result):
pass # assert here

# close connection with deleting of the db object
del db

问题是 db.insert 时回溯中“数据库被锁定”从测试方法调用。我将代码视为后续步骤:

  1. 打开第一个连接
  2. 插入数据
  3. 提交并关闭连接
  4. 打开第二个连接(第一个连接关闭后)
  5. 使用 select 获取在步骤 2 中插入的数据
  6. 比较数据
  7. 如果输入数据与所选数据不相等,则断言。

但是...如果连接与数据库一一对应,我就不会收到有关数据库阻塞的消息,不是吗?我有一个想法,库(单元测试或假设)使用线程,但我在文档中找不到任何内容。

我也尝试以平常的方式运行它 for并插入可枚举数据。效果很好。

如果我没记错的话,每次commit的电话即使连接打开,方法也必须解锁数据库,但似乎没有发生。

有人可以帮助我理解为什么我看到“数据库已锁定”消息吗?

最佳答案

我怀疑您的数据库连接实际上并未关闭。无论如何,您不应该在测试运行之间使用相同的数据库文件 - 假设测试可重复非常重要 - 因此最简单的方法是在测试中创建一个临时文件并使用它而不是固定的 test.db看看问题是否消失。

更一般地说,我认为依赖于del中关闭的事情往往是奇怪错误的来源,我鼓励使用显式 context manager或类似的。

关于python - 假设+单元测试测试锁定sqlite数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52466380/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com