我正在使用python unittests和sqlalchemy来测试数据模型,以在mariaDB中存储WTFoms。 测试应该创建一个数据集,将此数据集写入数据库,阅读此集合,如果原始数据集与索雷德数据相同,则进行比较。
所以部分测试看起来像这样:
#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.name
和loadedForms[0].name
的内容,其中两者都设置为Foo
.这就是原因,为什么self.assertsIn(myForm, loadedForms)
通过了测试,但我不明白:
当Foo
只应用于myForm
时,为什么loadedForms
的内容会改变?
MyForm 的行标识不会因更改其中一个值而更改。
行号在表格中没有任何意义,但为了明确问题,我仍然会使用它们。
第 153 行有 2 个字段。字段名称 = "Ben",字段本垒打 = 3。
现在我们改变本垒打(本打出了本垒打);
第 153 行有 2 个字段。字段名称 = "Ben",字段本垒打 = 4。
它仍然是第 153 行,因此您的assertIn
仍然返回True
,尽管该行中的一个值已更改。您只测试身份。
如果不是,则更改表行中的字段需要由insert
保存到表中,而不是update
到行中。这当然是不正确的;我们有多少本?一。他有 4 支本垒打,而不是 3 或 4 支,这取决于你看哪个记录。