在编写测试用例时需要提前准备测试用的数据。在Django中,有2种比较推荐的准备测试数据的办法:
- 在测试用例的setUp方法种添加测试用数据
- 使用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的逻辑即可。