Python unittest:write、read、compare 不起作用



我正在使用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.nameloadedForms[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 支,这取决于你看哪个记录。

最新更新