Django使用fixture简化测试用例


在编写测试用例时需要提前准备测试用的数据。在Django中,有2种比较推荐的准备测试数据的办法:

  1. 在测试用例的setUp方法种添加测试用数据
  2. 使用fixture将测试数据导入到数据库

使用setUp添加数据

在setUp方法中添加测试数据的写法比较简单,例如:

class EXPtest(TestCase):
    def setUp(self):
        self.level0 = Level.objects.create(level=0, exp=0)
        self.level1 = Level.objects.create(level=1, exp=5)
        self.level2 = Level.objects.create(level=2, exp=10)
        self.level3 = Level.objects.create(level=3, exp=20)

使用setUp方法时,每一个测试用例在执行时都会执行setUp和tearDown,这样如果测试用例很多,就会浪费大量的时间在等待数据的处理、销毁这2个过程中。

def setUpTestData(cls):
    self.level0 = Level.objects.create(level=0, exp=0)
    self.level1 = Level.objects.create(level=1, exp=5)
    # ... &c.

这样,测试数据在整个EXPtest运行时只会创建一次。

使用fixture添加数据

fixture能实现的效果和setUpTestData类似。个人理解上来说,fixture更适合一些通用数据,比如: user信息。可以在多个TestClass中复用。setUpTestData适合的是当前TestClass中复用。

fixture的用法也很简单:

1.在settings.py中增加fixture的配置

FIXTURE_DIRS = ('/path/to/api/fixtures/',)

2.创建fixture目录,并添加数据文件 数据文件对文件名不要求,可以随意写,但是必须是json文件,因此要以.json作为文件后缀。例如:

user.json
[
    {
    "model": "mysite.user",    # 数据库名
    "pk": "1",  # 要导入的数据
    "fields": {   # 要导入的字段,字段名跟数据库(models)内的字段一样,值,根据实际需要设置
      "username": "zhangsan",
      "zh_name": "张三",
      "mobile": "13000000000",
      "email": "zhangsan@abc.com",
      "is_deleted": false,
      "create_time": "2013-01-16",
      "update_time": "2013-01-16"
    }
  },
]

3.在测试用例中增加fixture 在TestClass中,使用fixtures属性来指定对应的fixtures文件,例如:

class Usertest(TestCase):
    fixtures = ['user.json']     # 在这里选择你要导入要测试的用户数据

    def test_user_name(self):
        user = User.objects.get(username='zhangsan')
        self.assertEqual(user.name, "zhangsan")

从上面的例子来看,使用fixture要比setUp更加优雅一点,在代码中少了大量的数据初始化的逻辑,让QA只专注于测试case的逻辑即可。