【问题标题】:Python unittest: write, read, compare does not workPython unittest:写,读,比较不起作用
【发布时间】:2025-12-31 16:10:12
【问题描述】:

我正在使用 python unittests 和 sqlalchemy 来测试数据模型以将 WTFoms 存储在 mariaDB 中。 测试应该创建一个数据集,将该数据集写入数据库,读取该数据集进行比较,如果原始数据集与排序数据相同。

所以部分测试看起来像这样:

#set data
myForm = NiceForm()
myForm.name = "Ben"

#write data
db.session.add(myForm)
db.session.commit()

#read data
loadedForms = NiceForm.query.all()

#check that only one entry is in db
self.assertEqual(len(loadedForms), 1)

#compare stores data with dataset
self.assertIn(myForm, loadedForms)

测试接缝工作正常。不,我尝试找出,如果测试失败,如果数据集!= 存储数据。因此,ein 在比较之前更改了数据集,如下所示:

#set data
myForm = NiceForm()
myForm.name = "Ben"

#write data
db.session.add(myForm)
db.session.commit()

#read data
loadedForms = NiceForm.query.all()

#modify dataset
myForm.name = "Foo"

#show content of both
print(myForm.name)
print(loadedForms[0].name)

#check that only one entry is in db
self.assertEqual(len(loadedForms), 1)

#compare stores data with dataset
self.assertIn(myForm, loadedForms)

此测试仍然通过。为什么?我输出myForm.nameloadedForms[0].name 的内容,两者都设置为Foo。这就是为什么self.assertsIn(myForm, loadedForms)通过测试的原因,但我不明白:

为什么loadedForms的内容会改变,而Foo只适用于myForm

【问题讨论】:

    标签: python unit-testing flask sqlalchemy flask-wtforms


    【解决方案1】:

    MyForm 的行标识不会因更改其中一个值而改变。

    行号在表格中没有任何意义,但为了说明问题,我仍然会使用它们。

    第 153 行有 2 个字段。字段名称 = “Ben”,字段本垒打 = 3。

    现在我们改变本垒打(Ben 打出一个本垒打);

    第 153 行有 2 个字段。字段名称 = “Ben”,字段本垒打 = 4。

    它仍然是第 153 行,因此您的 assertIn 仍将返回 True,尽管该行中的值之一已更改。你只测试身份。

    如果不是这样,更改表行中的字段需要通过insert 保存到表中,而不是update 到行中。这当然是不正确的;我们有多少本斯?一。而且他有 4 个本垒打,而不是 3 个或 4 个,这取决于您查看的记录。

    【讨论】: