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

时间:2015-06-07 02:38:39

标签: python django automated-tests

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

说我的模型看起来像这样:

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的对象是否存在。这是我应该怎样测试这个呢?如果是,是否有更简单的方法来检查数据库中是否存在相同的对象而不必指定其所有字段?

1 个答案:

答案 0 :(得分:0)

我想我会这样做:

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' ]