使用 python 和 django 编写将文本文件内容导入数据库的测试

writing test for importing contents of text file into database using python and django

我必须将一些文本文件导入 MySQL 数据库。这些基本上只是 TSV 文件,每一行代表一个 Django 模型的实例。我是编写测试的新手,我不确定在这样的任务中我需要测试什么。在某些情况下,文本文件中的一行对应于一个插入语句,有时它是一个更新。

假设我的模型是这样的:

class Part(models.Model):
    field1 = models.CharField(max_length=30)
    field2 = models.CharField(max_length=30)
    field3 = models.CharField(max_length=30)
    field4 = models.CharField(max_length=30)
    field5 = models.CharField(max_length=30)
    field6 = models.CharField(max_length=30)
    field7 = models.CharField(max_length=30)
    field8 = models.CharField(max_length=30)
    field9 = models.CharField(max_length=30)
    field10 = models.CharField(max_length=30)

调用导入方法后,是否只测试数据库中是否存在字段与文本文件对象字段相同的对象?像这样:

def test_parts_dump():

    parts = importer.dump_parts() # parts is a list of Part objects imported from a text file

        for part in parts:

            part_exists = Part.objects.filter(
                pk=part.pk,
                field1=part.field1,
                field2=part.field2,
                field3=part.field3,
                field4=part.field4,
                field5=part.field5,
                field6=part.field6,
                field7=part.field7,
                field8=part.field8,
                field9=part.field9,
                field10=part.field10)
                .exists()
            self.assertTrue(part_exists)

正如我之前所说,有时导入的行是对现有行的更新,因此我不能只检查是否存在具有相同 pk 的对象。这是我应该如何测试这个吗?如果是,是否有更简单的方法来检查数据库中是否存在相同的对象而无需指定其所有字段?

我想我会选择这个:

fieldnames = [ 'field%s' % (i, ) for i in range(1, 11) ]
for part in parts:
     existing_part = Part.objects.get(pk=part.pk)
     for fn in fieldnames:
          self.assertEqual(getattr(existing_part, fn),
                           getattr(part,          fn),
                           "Problem in part %s field %s" % (part.pk, fn))

遇到问题时更容易理解。

如果要验证 Django 模型的所有字段,可以将第一行 (fieldnames = ...) 替换为:

fields = [ f.name for f in Part._meta.fields if f.name != 'id' ]